我想在excel中有一个对象数组,它们调用一个事件处理程序。具体来说,我有多个按钮,它们对不同的单元格执行相同的功能,并且为了避免重复代码,我想通过索引简单地引用这些按钮对象(就像我以前在VB 6.0中所做的那样)....通过查找哪个按钮点击了我想填充特定的单元格等所以问题是:excel VBA中的一系列按钮?我在VB.net做了一些工作,我在那里使用了集合,而且运行良好......但似乎我不能在VBA中这样做。
答案 0 :(得分:4)
VBA中没有像VB中那样的控制数组。对于某些控件,您可以创建自定义类来处理事件。例如,假设您有一个带有两个命令按钮的用户窗体。在userform模块中,输入此代码
Private mcolEventButtons As Collection
Private Sub UserForm_Initialize()
Dim clsEventButton As CEventButton
Set mcolEventButtons = New Collection
Set clsEventButton = New CEventButton
Set clsEventButton.EventButton = Me.CommandButton1
clsEventButton.RangeAddress = "A1"
mcolEventButtons.Add clsEventButton, Me.CommandButton1.Name
Set clsEventButton = New CEventButton
Set clsEventButton.EventButton = Me.CommandButton2
clsEventButton.RangeAddress = "A10"
mcolEventButtons.Add clsEventButton, Me.CommandButton2.Name
End Sub
然后创建一个名为CEventButton的自定义类模块并放入此代码
Private WithEvents mctlEventButton As MSForms.CommandButton
Private msRangeAddress As String
Public Property Set EventButton(ctlButton As MSForms.CommandButton)
Set mctlEventButton = ctlButton
End Property
Public Property Get EventButton() As MSForms.CommandButton
Set EventButton = mctlEventButton
End Property
Private Sub mctlEventButton_Click()
Sheet1.Range(Me.RangeAddress).Value = "Something"
End Sub
Public Property Get RangeAddress() As String
RangeAddress = msRangeAddress
End Property
Public Property Let RangeAddress(ByVal sRangeAddress As String)
msRangeAddress = sRangeAddress
End Property
变量维度中的WithEvents关键字轮询命令按钮的事件并触发,就好像它绑定到特定控件和userform模块一样。
以下是您的操作:只要userform处于活动状态,您就创建了一个Collection来保存自定义类的实例。这可确保这些实例保持在范围内。然后,您创建了一个新的类实例,为其分配了一个特定按钮,并将其保存在集合中。你为下一个按钮做了同样的事情。在这个例子中只有两个按钮,但如果你有更多按钮,你可以继续这样做,直到内存不足为止。
我在自定义类模块中创建了一个RangeAddress属性作为示例。您需要存储哪些信息取决于您最终要完成的任务。
要使此示例正常工作,您需要将userform的ShowModal属性设置为FALSE,必须将名为CommandButton1和CommandButton2的命令按钮设置为具有代号为Sheet1的工作表,可能还有其他一些东西。
答案 1 :(得分:1)
将公共代码分隔为单个方法,并将单元格作为参数传递。为每个按钮分配它自己的事件方法,该方法又调用特定单元格的公共方法作为参数进行编辑。像这样:
Private Sub CommonMethod(someCell as String)
' Do your stuff
Range(someCell).Value = something
End Sub
因此每个按钮都可以分配给它自己的方法。这已经内置,因此不要尝试重新创建它,保持简单。
Private Sub Button1_Click()
CommonMethod("A1");
End Sub
Private Sub Button2_Click()
CommonMethod("A2");
End Sub