为两个控件编写一个代码?例如两个命令按钮
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
。
在我的用户窗体中,有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
。