我有一个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都是新的。如果有人甚至可以指出我正确的方向,我会感激任何帮助。感谢。
答案 0 :(得分:4)
这里有多个问题。
请勿在没有.current
的情况下将参数括在调用Sub
的括号中。
因此,Call
或Call RemoveSelected(RecipientsListBox)
。
移交参数的默认模式是RemoveSelected RecipientsListBox
,但这不可能。因此需要使用ByRef
。
正确类型为ByVal
代码:
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
也可以。