Excel VBA множественный выбор ListBox проверить, если ничего не выбрано

Я пытаюсь выяснить, как лучше всего использовать Excel ListBox с несколькими вариантами выбора и имеют простой код VBA для фильтрации нескольких листов на основе того, что выбрано в ListBox.

Код, который у меня есть сейчас, ниже. На данный момент он делает именно то, что мне нужно - проверяет, есть ли какой-либо фильтр на листах, очищает его, если это так, а затем отфильтровывает выбранные значения. Но что мне нужно сделать, это то, что значение не выбрано вообще, оно должно очистить фильтры на 4 листах и ​​выйти из sub.

Дело в том, что я получаю ошибку "недопустимая процедура", если пытаюсь запустить ее, когда ничего не выбрано. Я пытался добавить заявление Else и еще один, если проверить If .Listindex = -1, но оба варианта дали одинаковую ошибку. Поскольку это должен быть список с множественным выбором, я обнаружил, что он также должен выполнять цикл при проверке, если ничего не выбрано, но, опять же, возникла та же ошибка.

Как я могу улучшить этот код и добавить необходимые функции?

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

2 ответа

Решение

Убедитесь, что cnt равно 0 перед строкой, в которой указано With Sheet1, и если cnt равно 0, что означает, что в ListBox ничего не было выбрано, запросите пользователя и используйте exit sub как показано ниже

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 проверьте ваш cnt после вашего цикла с

If cnt = 0      'nothing selected
     'code for no selection
else
     'code with selection
end if
Другие вопросы по тегам