【问题标题】:vba button - find which was clickedvba 按钮 - 查找被点击的按钮
【发布时间】:2010-10-04 18:09:25
【问题描述】:

我已将宏分配给几个按钮。

如何在宏内部找出点击了哪个按钮?

我正在以用户表单的形式进行操作,他可以​​在其中输入家庭成员:

姓名1:
姓1:

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

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

与删除类似,当单击删除按钮时,我会使行不可见。

姓名1:
姓1:
[删除]

姓名2:
姓2:
[删除]

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

【问题讨论】:

  • 为了澄清您的编辑,您似乎只有一组按钮,但您一直在移动它们。因此,您真正需要知道的就是如何将按钮排成一排。是这样吗?
  • I 个“删除”按钮,并在“添加”按钮处。
  • 好的,我找到了获取按钮的方法,但看起来您已经找到了。您可以简化 Select 语句,但它看起来不错。
  • 最后一行简化为R.SELECT

标签: vba excel


【解决方案1】:

我总是为每个按钮编写包装器,然后调用相关的宏。

像这样:

Public Sub StoreButton_Click()

  Call StoreTransValues(ActiveSheet)

End Sub

如果任何一个页面只有一个按钮,则只需获取 ActiveSheet 属性,它将是该页面上的按钮。


编辑:

下面是获取和使用调用按钮名称的代码:

Dim ButtonText As String

ButtonText = Application.Caller

ActiveSheet.Shapes(ButtonText).Delete

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

【讨论】:

  • 我不能简单地根据我的情况调整您的建议。我仍然需要找出单击按钮的位置,然后找到它是哪一行,最后删除所有例如上面 2 行。
【解决方案2】:

我终于找到了确定按下 Worksheet 中哪个按钮的解决方案。归功于 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

如果您不需要单元格标签,Cells(rs,cs).Value 也可以。

【讨论】:

  • ActiveSheet 返回一个工作表对象。工作表对象没有称为“按钮”的属性。这怎么行?
【解决方案3】:
Dim button as a string:

    button = ActiveSheet.Shapes(Application.Caller).Name

【讨论】:

    【解决方案4】:

    由于您有一个宏连接到您的按钮,我假设您知道单击的是哪个按钮。要获取按钮的位置,请使用:

    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
    

    【讨论】:

    • 如果您通过为每个按钮分配相同的宏来简化代码,则不会,在这种情况下,宏需要更智能
    • 得到你的答案的位置并把它放在stackoverflow.com/a/8303944/2932994
    猜你喜欢
    • 2013-07-26
    • 2019-09-28
    • 2021-03-08
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2021-03-22
    相关资源
    最近更新 更多