VBA 没有复杂的事件模型。相反,您可以创建和调用公共子过程,传递子需要确定其结果的特定参数:
Private Sub CommandButton1_Click()
Call Clicker("A1")
End Sub
Private Sub CommandButton2_Click()
Call Clicker("A2")
End Sub
Private Sub Clicker(sRange As String)
'MsgBox sRange
Range(sRange).Value = "Good"
End Sub
参数不必是字符串,可以是Range。
或者值“A1”等可以作为表单的属性存储和检索(而不是将其作为参数传递)。
一种可能的替代方法是检查ActiveControl,然后采取相应措施:
Private Sub Clicker()
MsgBox ActiveControl.Name
'do something according to the name
End Sub
我不喜欢这个并且更喜欢第一种选择,因为值很可能特定于单击的按钮(并且按钮名称可能会更改)。代码也可以在没有相关按钮处于活动状态的情况下被调用。
第三种选择是创建您自己的自定义类和事件模型,这需要一些研究。
这是一个使用 UserForm 的自定义属性的示例:
Private sCellOfInterest As String
Private Property Get CellOfInterest() As String
CellOfInterest = sCellOfInterest
End Property
Private Property Let CellOfInterest(ByVal sRange As String)
sCellOfInterest = sRange
End Property
Private Sub CommandButton1_Click()
CellOfInterest = "A1"
Call Clicker2
End Sub
Private Sub CommandButton2_Click()
CellOfInterest = "A2"
Call Clicker2
End Sub
Private Sub Clicker2()
MsgBox CellOfInterest
End Sub
同样,属性可以是对象而不是字符串,那么将使用Property Set 而不是Property Let。