为两个控件编写一个代码?例如两个命令按钮

write One code for two controls? For example Two CommandButton

在我的用户窗体中,有CommandButton1, 2, 3, 4, 5, 6.......,它们都完成相同的任务。例如:Range("A1").value = "Good"

问题来了,有什么办法可以只写一个代码就全部搞定吗?

如果答案是肯定的,我可以制作范围变量吗?例如:CommandButton1: range("A1").value = "Good", CommandButton2: range("A2").value = "Good"。

非常感谢您的回复。

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

我不喜欢这个,更喜欢第一个替代方案,因为值很可能无论如何都是特定于单击的按钮(并且按钮名称可能会更改)。也可以在相关按钮未激活的情况下调用代码。

第三种选择是创建您自己的自定义 类 和事件模型,这需要一些研究。


下面是一个使用自定义 属性 用户窗体的示例:

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