VBA можно ли передать словарь/коллекцию автофильтру?

Идея заключалась в том, чтобы создать переменную, которая сохраняла бы изменения, внесенные в нее после предыдущего использования макроса. У меня есть пользовательская форма, которая извлекает значения из диапазона и заполняет уникальные значения в списке. Затем я хочу иметь возможность добавлять выбранные значения в свой словарь/коллекцию и сохранять изменения. После внесения всех необходимых изменений макрос должен использовать переменную словаря в качестве критерия автофильтра.

Мой вопрос в два раза, какой класс я должен использовать для этого? Как использовать эту переменную для автоматической фильтрации моего листа? Код пользовательской формы ниже:

Первый бит кода предназначен для командной кнопки «Добавить». Предполагается, что выбранные значения будут взяты из списка и добавлены в словарь под названием «Рынок». Код после этого извлекает значения из недавно открытой книги Excel и отображает уникальные значения в списке. Listbox2 содержит все предыдущие значения из прошлых использований макроса. Я хочу добавить кнопку «Удалить» в пользовательскую форму, чтобы при необходимости привести список в порядок. Две общедоступные переменные ниже фактически расположены в основном макромодуле, это позволит мне сохранить значения в словаре после того, как пользовательская форма перестанет работать.

Private Sub CommandButton1_Click()
Dim i As Long

For i = 0 To ListBox1.ListCount - 1
    If ListBox1.Selected(i) = True Then
        Market.Add ListBox1.List(i)
        Set Market = New Collection
    End If
Next


End Sub

Private Sub UserForm_Initialize()

Dim myList As Collection
 Dim myRange As Range
 Dim ws As Worksheet
 Dim myVal As Variant
 Dim Col As Integer

 Set ws = ActiveWorkbook.Sheets("Daily Unconfirmed")
 Col = WorksheetFunction.Match("Marketer", ws.Range("3:3"), 0)
 Set myRange = ws.Range(Cells(4, Col), Cells(4, Col).End(xlDown))
 Set myList = New Collection
 On Error Resume Next

 For Each mycell In myRange.Cells
     myList.Add mycell.Value, CStr(mycell.Value)
 Next mycell
 On Error GoTo 0

 For Each myVal In myList
     Me.ListBox1.AddItem myVal
 Next myVal

Публичный предмет как вариант Публичный рынок как коллекция

Market.Add "Al D"
Market.Add "B Collins"
Market.Add "B G"
Market.Add "C Huter"

For Each item In Market
    Me.ListBox2.AddItem item
Next item

End Sub

person user3760331    schedule 20.06.2014    source источник
comment
Вы можете передать словарь .Keys() или .Values(), или вы можете передать векторный массив, но я не думаю, что вы можете напрямую передать коллекцию свойству .List, вам нужно выполнить итерацию For Each.   -  person David Zemens    schedule 20.06.2014


Ответы (1)


Поскольку AutoFilter запускается из массива, я бы создал массив динамически и использовал его в подсистеме фильтрации:

Dim ary()

Sub MAIN()
    Call BuildDynamicArray
    Call FilterMyData
End Sub

Sub BuildDynamicArray()
    Dim inString As String
    i = 1
    While 1 = 1
        x = Application.InputBox(Prompt:="Enter a value", Type:=2)
        If x = False Then GoTo out
        ReDim Preserve ary(1 To i)
        ary(i) = x
        i = i + 1
    Wend
out:
End Sub

Sub FilterMyData()
    ActiveSheet.Range("$A$1:$A$10").AutoFilter Field:=1, Criteria1:=ary, Operator:=xlFilterValues
End Sub
person Gary's Student    schedule 20.06.2014