我以前问过这个问题,但承认我问得很糟糕,所以我再次问这个问题。所以我又来了。
我正在用 VBA Excel 编写一个程序 - 或者更确切地说,将某个工作表与操作和部分代码相结合,以制作出像独立程序一样工作的东西。其中一部分涉及单击时将多个图像(数十个)绑定到某个宏。
我通过“开发人员”->“设计模式”按钮创建了上述图像。图像的命名方式如下:Image1、Image2、Image3……等等。我想要的是,例如,如果我按下 Image1,则调用子程序 Action(1)。如果我按下 Image100,则调用子程序 Action(100)。因此,我想调用 Action 子程序,并根据单击的图像传递一个值,在我给出的示例中,根据图像的名称传递一个值。
经过快速搜索,我发现第一个可以实现此目的的方法如下:
Sub Image1_Click()
Call Action(1)
End Sub
这是对 Image1 的点击。对于 Image100 的点击,这将是:
Sub Image100_Click()
Call Action(100)
End Sub
单独使用这种方式的缺点是显而易见的:我需要创建与我拥有的图像一样多的点击处理程序,即使每次调用相同的例程,并且获取要传递的值所关心的只是图像名称。
因此,考虑到我的逻辑的明显顺序以及我想要实现的目标,我希望您能为我提供一种更巧妙的方法来为我的所有图像创建点击事件,而不必使用那么多冗余代码和明显不是最优的逻辑。
注意:为避免混淆,所有图像的操作子程序都是相同的。只有传递的值会发生变化。
答案1
您可以使用应用程序.调用者属性并将通用宏分配给所有图片,然后传递图片的 ID 作为参数 -
Sub genericpicture_click()
Dim pic As String
pic = Application.Caller
MsgBox (pic)
End Sub
以下是一个例子使用案例:
' Procedure to display which button was pressed.
Sub WhichButton()
' Assign the calling object to a variable.
ButtonName = Application.Caller
' Display the name of the button that was clicked.
Select Case ButtonName
' NOTE: When you type the name of the button, note that
' Visual Basic is case and space sensitive when comparing
' strings. For example, "Button 6" and "button6" are not the
' same.
Case "Button 6"
MsgBox Application.Caller & " was Clicked"
Case "Button 7"
MsgBox Application.Caller & " was clicked."
Case "Button 8"
MsgBox Application.Caller & " was clicked."
End Select
End Sub