在VBA Excel中的对象数组或集合

我想在Excel中有一个对象数组,调用一个事件处理程序。 具体来说,我有多个button,执行相同的function不同的单元格,并保持复制代码我想通过索引(像我以前在VB 6.0中做的那样)简单地引用这些button对象….通过find哪个button被点击我想填充特定的单元格等,所以问题是:在Excel VBAbutton数组? 我在VB.net中做了一些工作,在那里我使用了集合,而且工作得很好……但是在VBA中看来我做不到这一点。

将通用代码分离成单个方法,并将单元格作为parameter passing。 为每个button分配自己的事件方法,然后调用与特定单元格的常用方法作为参数进行编辑。 像这样的东西:

Private Sub CommonMethod(someCell as String) ' Do your stuff Range(someCell).Value = something End Sub 

所以每个button可以分配给它自己的方法。 这已经build成,所以不要试图重新创build它,保持简单。

 Private Sub Button1_Click() CommonMethod("A1"); End Sub Private Sub Button2_Click() CommonMethod("A2"); End Sub 

在VB中没有像VB中那样的控件数组。 对于某些控件,您可以创build一个自定义类来处理事件。 例如,假设你有一个带两个命令button的用户窗体。 在用户表单模块中,放置这个代码

 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 

然后创build一个名为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 

variables标注中的WithEvents关键字轮询命令button的事件并触发,就像它绑定到特定的控件一样,并在用户窗体模块中。

以下是您所做的:只要用户表单处于活动状态,您就创build了一个Collection来保存自定义类的实例。 这确保这些实例保持在范围内。 然后,您创build了该类的新实例,为其指定了一个特定的button,并将其保存在集合中。 你为下一个button做了同样的事情。 在这个例子中,只有两个button,但如果你有更多的button,你可以继续这样做,直到你用完内存。

作为示例,我在自定义类模块中创build了一个RangeAddress属性。 你需要存储什么信息取决于你最终要完成什么。

对于这个例子来说,你需要将用户窗体的ShowModal属性设置为FALSE,必须命名为CommandButton1和CommandButton2的命令button,以及一个代码名为Sheet1的表单,以及其他可能的东西。