2010-10-04 209 views
8

我已经将宏分配给几个按钮。vba按钮 - 找到哪个被点击

如何找出里面的宏哪个按钮被点击了?

我做的是用户的形式,在那里他可以从家庭输入人民:

名1:
surname1:

名2:
surname2:
|添加一个成员|

我希望按钮始终出现在最后添加的人的最后一行。 为了简单起见,我认为最好在 工作表中有100个空表单,但在开始时全部隐形。
然后,当用户点击添加下一个成员,我只需使下一行可见, 并将按钮移动到下一个人。但要做到这一点,我需要知道我目前的位置。

与删除相似我会在点击删除按钮时使行不可见。

名1:
surname1:
[删除]

名2:
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 
+0

因此,为了澄清您的编辑,它似乎只有一组按钮,但你继续移动它们。所以你真正需要知道的是如何将按钮排成一排。是吗? – 2010-10-04 18:47:55

+0

我有多少个“删除”按钮,以及非常多的“添加”按钮。 – Gadolin 2010-10-04 18:58:05

+0

好的,我发现如何获得按钮,但它看起来像你已经找到它。你可以简化Select语句,但看起来很好。 – 2010-10-04 22:40:56

回答

13

我总是写为每个按钮然后调用有问题的宏包装。

像这样:

Public Sub StoreButton_Click() 

    Call StoreTransValues(ActiveSheet) 

End Sub 

如果您有任何一个页面只有一个按钮,你可以得到的ActiveSheet属性,这将是该网页上的按钮。


编辑:

下面的代码来获取和使用呼叫按钮的名称:

Dim ButtonText As String 

ButtonText = Application.Caller 

ActiveSheet.Shapes(ButtonText).Delete 

您将使用.Move方法移动按钮。

+0

我不能简单地根据我的情况调整您的建议。我仍然需要找出点击按钮的位置,然后找到它是哪一行,最后删除所有例如上面2排。 – Gadolin 2010-10-04 19:30:41

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

如果通过为每个按钮分配相同的宏来简化代码,那么这种情况下宏需要更智能 – 2015-03-10 19:20:59

+0

获得您的答案并将其与http://stackoverflow.com/a/8303944/2932994放在一起 – simonides 2016-09-13 16:36:16

6

我终于找到了解决办法确定其在工作表按钮是推。信贷归功于Derk在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