Я искал способ отфильтровать электронную таблицу Excel с более чем двумя подстановочными знаками. Ранее я спрашивал в StackOverflow, могу ли я напрямую ввести более двух подстановочных знаков в AutoFilter в VBA вместо использования расширенного фильтра на листе, поскольку мои макросы в основном используются через сценарии PowerShell, которые пропускают ввод. Эти подстановочные знаки используются для фильтрации различных электронных таблиц, и результат сохраняется.
Очень полезный пользователь пришел с ответом, дал пример макроса с использованием ключей словаря, который я затем расширил, чтобы принять массив в качестве входных данных, а затем перебрать все элементы в массиве для фильтрации в качестве подстановочных знаков. Отлично, работает как задумано!
Теперь я хочу расширить это, чтобы передавать более конкретные подстановочные знаки, которые я хочу исключить. Скажем, например, я хочу включить «A*» и «B*», но не «BB*», чтобы, например, «BA*» все еще был там. Может ли приведенный ниже макрос работать с прохождением ‹>BB*?
hierArray всегда содержит только список простых строк, состоящий максимум из 10 (но редко более 3 символов).
Public Function multiHier(hierArray As Variant)
Dim v As Long, vVALs As Variant, dVALs As Object
Dim colNum As Long, hierLen As Integer, hier As Variant
Dim rng As Range
Set dVALs = CreateObject("Scripting.Dictionary")
dVALs.comparemode = vbTextCompare
colNum = Application.Match("*ierarchy*", Range("A1:Z1"), 0)
With Worksheets(1)
'If .AutoFilterMode Then .AutoFilterMode = False
With .Cells(1, 1).CurrentRegion
vVALs = .Columns(colNum).Cells.Value2
For v = LBound(vVALs, 1) To UBound(vVALs, 1)
If Not dVALs.exists(vVALs(v, 1)) Then
For Each hier In hierArray
hierLen = Len(hier)
Select Case UCase(Left(vVALs(v, 1), hierLen))
Case hier
dVALs.Add Key:=vVALs(v, 1), item:=vVALs(v, 1)
Case Else
End Select
Next hier
End If
Next v
If CBool(dVALs.Count) Then
'populated the dictionary; now use the keys
.AutoFilter Field:=colNum, Criteria1:=dVALs.keys, Operator:=xlFilterValues
Set rng = Worksheets(1).AutoFilter.Range
multiHier = rng.Columns(1).SpecialCells(xlCellTypeVisible).Count - 1
Else
multiHier = 0
End If
End With
End With
dVALs.RemoveAll: Set dVALs = Nothing
End Function
hierArray
будет чем-то вродеhierArray = Array("A•", "B•", "<>BB•")
...? - person   schedule 05.01.2016