Vba button - найти, на который был нажат
Я назначил макрос нескольким кнопкам.
Как я могу узнать внутри макроса, на который нажата кнопка?
Я делаю как пользовательскую форму, где он может вводить людей из семейства:
<я > name1:
surname1:
<я > name2:
surname2: | добавить следующий элемент |
Я хочу, чтобы кнопка появлялась всегда в последней строке последнего добавленного человека.
Для простоты я считаю, что лучше иметь 100 пустых форм в
но все невидимые в начале.
Затем, когда пользователь нажимает на добавление следующего члена, я просто делаю следующие строки видимыми,
и переместите кнопку к следующему человеку. Но для этого мне нужно знать мое текущее положение.
Аналогично удалению я делал строки невидимыми при нажатии кнопки удаления.
<я > name1:
surname1: [удалить]
<я > name2:
surname2: [удалить]
<я > name3:
surname3: | добавить следующий член |
Мне нужно знать, какая кнопка удаления нажата.
ИЗМЕНИТЬ:
Найденный в Интернете - как вы думаете, кажется лучшим/способом
Dim r As Range
Set r = ActiveSheet.Buttons(Application.Caller).TopLeftCell
Range(Cells(r.Row, r.Column), Cells(r.Row, r.Column)).Select
Ответы
Ответ 1
Я всегда пишу обертки для каждой кнопки, которые затем вызывают соответствующий макрос.
Так же:
Public Sub StoreButton_Click()
Call StoreTransValues(ActiveSheet)
End Sub
Если у вас есть только одна кнопка для одной страницы, вы можете просто получить свойство ActiveSheet, и это будет кнопка на этой странице.
Edit:
Здесь код для получения и использования имени вызывающей кнопки:
Dim ButtonText As String
ButtonText = Application.Caller
ActiveSheet.Shapes(ButtonText).Delete
Для перемещения кнопки вы должны использовать метод .Move.
Ответ 2
Наконец, я нашел решение для определения того, какая кнопка в листе была нажата. Кредит связан с Дерком в 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
Если вам не нужна метка ячеек, также работает Cells (rs, cs).Value.
Ответ 3
Поскольку у вас есть макрос, подключенный к вашей кнопке (-ам), я предполагаю, что вы знаете, какая кнопка была нажата. Чтобы получить расположение кнопки, используйте это:
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
Ответ 4
Dim button as a string:
button = ActiveSheet.Shapes(Application.Caller).Name