2010-10-04 3 views
8

Я назначил макрос нескольким кнопкам.vba button - find, который был нажат

Как я могу узнать внутри макроса, на какую кнопку нажали?

Я делаю как форма пользователя, где он может ввести народы от семьи:

name1:
surname1:

name2:
surname2:
| добавить следующий элемент |

Я хочу, чтобы кнопка появлялась всегда в последней строке последнего добавленного лица. Для простоты я думаю, что лучше иметь 100 пустых форм на листе , но все невидимые в начале.
Затем, когда пользователь нажимает на добавление следующего члена, я просто делаю следующие строки видимыми, и перемещаю кнопку для следующего человека. Но для этого мне нужно знать мое текущее положение.

Как и при удалении, я бы сделал строки невидимыми при нажатии кнопки удаления.

name1:
surname1:
[убрать]

name2:
surname2:
[убрать]

name3:
surname3:
| добавить следующий член |

Мне нужно знать, какая кнопка удаления была нажата.

EDIT: Найдены в сети - то, что вы думаете, кажется, лучшим/сторонней

Dim r As Range 
Set r = ActiveSheet.Buttons(Application.Caller).TopLeftCell 
Range(Cells(r.Row, r.Column), Cells(r.Row, r.Column)).Select 
+0

Чтобы уточнить ваше изменение, кажется, что у вас есть только один набор кнопок, но вы продолжаете их перемещать. Так что вам действительно нужно знать, как позиционировать кнопки подряд. Это оно? –

+0

I количество кнопок «удалить», а также кнопку «добавить». – Gadolin

+0

ОК, я нашел, как получить кнопку, но похоже, что вы ее уже нашли. Вы можете упростить инструкцию Select, но она выглядит нормально. –

ответ

13

Я всегда пишу обертки для каждой кнопки, которые затем вызвать макрос вопроса.

Как так:

Public Sub StoreButton_Click() 

    Call StoreTransValues(ActiveSheet) 

End Sub 

Если у вас есть только одна кнопка для любой одной странице, вы можете просто получить свойство ActiveSheet, и это будет кнопка на этой странице.


Edit:

Вот код, чтобы получить и использовать имя кнопки вызывающему:

Dim ButtonText As String 

ButtonText = Application.Caller 

ActiveSheet.Shapes(ButtonText).Delete 

Вы бы использовать метод .Привести для перемещения кнопки.

+0

Я не могу просто адаптировать ваше предложение для своего дела. Мне все еще нужно выяснить, что такое кнопка нажатой кнопки, затем найти, какую строку она, и, наконец, удалить все, например. 2 строки выше. – Gadolin

1

Поскольку у вас есть макрос, подключенный к вашей кнопке (-ам), я предполагаю, что вы знаете, какая кнопка была нажата. Для того, чтобы получить расположение кнопки, используйте:

ActiveSheet.Shapes("ButtonName").TopLeftCell.Address 

Чтобы переместить кнопку на новое место, используйте:

Dim NewAddress as Range 
NewAddress = ActiveSheet.Cells(5, 5) 'Or where ever you need it to go 
ActiveSheet.Shapes("ButtonName").Left = NewAddress.Left 
ActiveSheet.Shapes("ButtonName").Top = NewAddress.Top 
+0

нет, если вы упростите код, присвоив один и тот же макрос каждой кнопке, в случае, когда макрос будет более умным. –

+0

Получил позицию с ответом и разместил ее с помощью http://stackoverflow.com/a/8303944/2932994 – simonides

6

я, наконец, нашел решение для определения, какая кнопка на листе было толкнул. Кредит принадлежит Дерку на http://www.ozgrid.com/forum/showthread.php?t=33351.

Мой последний пример кода:

Sub HereIAm() 
    Dim b As Object 
    Dim cs, rs As Integer 
    Dim ss, ssv As String 
    Set b = ActiveSheet.Buttons(Application.Caller) 
    With b.TopLeftCell 
     rs = .Row 
     cs = .Column 
    End With 
    ss = Left(Cells(1, cs).Address(False, False), 1 - (ColNumber > 26)) & rs 
    ssv = Range(ss).Value 
    MsgBox "Row Number " & rs & " Column Number " & cs & vbNewLine & _ 
     "Cell " & ss & " Content " & ssv 
End Sub 

Если вам не нужны этикетки, клетки (RS, CS) .Value работает хорошо.

-2
Dim button as a string: 

    button = ActiveSheet.Shapes(Application.Caller).Name 
Смежные вопросы