excel 2010 vba如何声明列表框?

时间:2016-05-08 13:38:08

标签: excel vba excel-vba listbox excel-2010

我有一个userform,其中包含以下代码:

Private Sub RemoveRecipientCommandButton_Click()
    Application.ScreenUpdating = False
    Dim intCount As Integer
    For intCount = RecipientsListBox.ListCount - 1 To 0 Step -1
    If RecipientsListBox.Selected(intCount) Then RecipientsListBox.RemoveItem (intCount)
    Next intCount
    Application.ScreenUpdating = True
 End Sub

此代码在列表框上运行,该列表框是MultiSelect 1 - fmMultiSelectMulti,并且工作得很好。当我尝试允许将参数传递给它时,问题出现了,所以我可以在多个ListBox上使用相同的子。我试过了:

Private Sub RemoveRecipientCommandButton_Click()
    Application.ScreenUpdating = False
    RemoveSelected (RecipientsListBox)
    Application.ScreenUpdating = True
End Sub

Private Sub RemoveSelected(LB As ListBox)
    Dim intCount As Integer
    For intCount = LB.ListCount - 1 To 0 Step -1
    If LB.Selected(intCount) Then LB.RemoveItem (intCount)
    Next intCount
End Sub

我也试过了:

Private Sub RemoveSelected(LB As MSForms.ListBox)

Private Sub RemoveSelected(LB As ListObject)

其余RemoveSelected代码相同。此代码的所有这些形式都会抛出错误424 - 需要对象。我不是一个Excel专业版,所以我主要关注的是找到有效的代码 - 我希望能够将它变成我可以在多个ListBox上使用的东西,如果有必要,而不必编写代码每个ListBox都是新的。如果有人甚至可以指出我正确的方向,我会感激任何帮助。感谢。

1 个答案:

答案 0 :(得分:4)

这里有多个问题。

  1. 请勿在没有.current的情况下将参数括在调用Sub的括号中。 因此,CallCall RemoveSelected(RecipientsListBox)

  2. 移交参数的默认模式是RemoveSelected RecipientsListBox,但这不可能。因此需要使用ByRef

  3. 正确类型为ByVal

  4. 代码:

    MSForms.ListBox

    编辑:

    正如@Patrick Lepelletier所说,Private Sub RemoveRecipientCommandButton_Click() Application.ScreenUpdating = False RemoveSelected RecipientsListBox 'Call RemoveSelected(RecipientsListBox) Application.ScreenUpdating = True End Sub Private Sub RemoveSelected(ByVal LB As MSForms.ListBox) Dim intCount As Integer For intCount = LB.ListCount - 1 To 0 Step -1 If LB.Selected(intCount) Then LB.RemoveItem intCount Next intCount End Sub 在这种情况下是可能的。我将ByRef对象存储在局部变量Control中导致Set oListboxControl = RecipientsListBox : RemoveSelected oListboxControl的问题

    所以

    ByRef

    也可以。