在我的用户窗体中,有CommandButton1,2,3,4,5,6 ........它们都执行相同的任务。例如:Range("A1").value = "Good"
。
问题出现了,有什么方法可以为所有这些代码编写一个代码吗?
如果答案是肯定的,我可以制作范围变量吗?例如:CommandButton1:range(" A1")。value =" Good",CommandButton2:range(" A2")。value =" Good&# 34。
非常感谢你的回复。
答案 0 :(得分:1)
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
。