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