Excel VBA多选列表框检查是否没有被选中

我想弄清楚如何使用多选Excel Excel ListBox的最佳方法,并有一个简单的VBA代码,它可以筛选多个基于ListBox中选定的工作表。

我现在的代码在下面。 目前,它几乎完全符合我的需求 – 检查工作表中是否有任何filter,如果是,则清除它,然后过滤掉所选的值。 但是我也需要这样做,就是根本没有select任何值,它应该清理4张filter并退出子filter。

事情是,如果我没有select任何东西,我试图运行它,我得到一个“无效的程序”错误。 我曾尝试添加一个Else语句,另一个如果检查If .Listindex = -1 ,但是两个选项都给出了完全相同的错误。 因为这需要一个多选列表,我发现它也需要循环,同时检查是否没有被选中,但又一次,有同样的错误。

我怎样才能改善这个代码并添加所需的function?

 Sub filter1() Dim MyArray() As String Dim Cnt As Long Dim r As Long Cnt = 0 With Me.ListBox1 If .ListIndex <> -1 Then For r = 0 To .ListCount - 1 If .Selected(r) Then Cnt = Cnt + 1 ReDim Preserve MyArray(1 To Cnt) MyArray(Cnt) = .List(r) End If Next r End If End With With Sheet1 If .FilterMode Then .ShowAllData .Range("A2:Y1037").AutoFilter field:=2, Criteria1:=MyArray, Operator:=xlFilterValues End With With Sheet3 If .FilterMode Then .ShowAllData .Range("A2:AB1037").AutoFilter field:=2, Criteria1:=MyArray, Operator:=xlFilterValues End With With Sheet4 If .FilterMode Then .ShowAllData .Range("A2:Z1037").AutoFilter field:=2, Criteria1:=MyArray, Operator:=xlFilterValues End With With Sheet5 If .FilterMode Then .ShowAllData .Range("A2:Z1037").AutoFilter field:=2, Criteria1:=MyArray, Operator:=xlFilterValues End With End Sub 

检查cnt是否为0,并且如果cnt为0,表示在ListBox中没有select任何内容,则提示用户并使用如下的exit子…

 If cnt = 0 Then MsgBox "No item was selected in the ListBox." & _ "Please select an item and then try again...", vbCritical, "No Item Selected" Exit Sub End If With Sheet1 End With 

当你有多选时,Listindex不起作用。 所以,而不是使用If .ListIndex <> -1 Then检查你的循环后你的循环

 If cnt = 0 'nothing selected 'code for no selection else 'code with selection end if