VBA Excel中的对象数组或集合

时间:2009-12-15 19:24:36

标签: excel vba excel-vba

我想在excel中有一个对象数组,它们调用一个事件处理程序。具体来说,我有多个按钮,它们对不同的单元格执行相同的功能,并且为了避免重复代码,我想通过索引简单地引用这些按钮对象(就像我以前在VB 6.0中所做的那样)....通过查找哪个按钮点击了我想填充特定的单元格等所以问题是:excel VBA中的一系列按钮?我在VB.net做了一些工作,我在那里使用了集合,而且运行良好......但似乎我不能在VBA中这样做。

2 个答案:

答案 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