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