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

Мое намерение состояло в том, чтобы следующий код скомпилировал данные из моего рабочего листа «Низкая цена за тысячу показов 1» в массив, а затем отфильтровал мой активный рабочий лист на основе этого массива. Хотя макрос, кажется, влияет на фильтры, ни одно из значений не отфильтровывается. Любая помощь по этому вопросу будет принята с благодарностью

  Sub Macro1()

Dim CPM1Array(0 To 300) As Variant

For i = 2 To UBound(CPM1Array)
    CPM1Array(i) = Sheets("Low CPM 1").Cells(i, 2).Value
Next i

    ActiveSheet.Range("$A$1:$H$251").AutoFilter Field:=3, Criteria1:=("<>1 to Ubound(CPM1Array)"), Operator:=xlFilterValues

End Sub

person Andrew Pickett    schedule 01.08.2016    source источник
comment
Попробуйте установить критерии непосредственно для вашего массива, например ActiveSheet.Range("$A$1:$H$251").AutoFilter Field:=3, Criteria1:=CPM1Array, Operator:=xlFilterValues, и он будет фильтровать значения в массиве.   -  person Mikegrann    schedule 01.08.2016


Ответы (1)


С автофильтром нет простого способа добиться того, чего вы хотите. Вы не можете использовать Criteria1:="<>MyArray"

Альтернативный

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

В действии

Допустим, наш рабочий лист выглядит так, как показано на изображении ниже. Я беру пример только с 15 строками.

введите здесь описание изображения

Код

Sub Sample()
    Dim ws As Worksheet
    Dim MyAr(1 To 5) As String
    Dim tmpAr As Variant, ArFinal() As String
    Dim LRow As Long

    ReDim ArFinal(0 To 0)

    Set ws = ActiveSheet

    '~~> Creating an array of values which we do not want
    For i = 1 To 5
        MyAr(i) = i
    Next i

    With ws
        '~~> Last Row of Col C sice you will filter on 3rd column
        LRow = .Range("C" & .Rows.Count).End(xlUp).Row

        '~~> Storing the values form C in the array
        tmpAr = .Range("C2:C" & LRow).Value

        '~~> Compare and remove values which we do not want
        For i = 1 To LRow - 1
            For j = 1 To UBound(MyAr)
                If tmpAr(i, 1) = MyAr(j) Then tmpAr(i, 1) = ""
            Next j
        Next i

        '~~> Remove blank cells from the array by copying them to a new array
        For i = LBound(tmpAr) To UBound(tmpAr)
            If tmpAr(i, 1) <> "" Then
                ArFinal(UBound(ArFinal)) = tmpAr(i, 1)
                ReDim Preserve ArFinal(0 To UBound(ArFinal) + 1)
            End If
        Next i

        '~~> Filter on values which you want. Change range as applicable
        .Range("$A$1:$H$15").AutoFilter Field:=3, Criteria1:=ArFinal, Operator:=xlFilterValues
    End With
End Sub

Вывод

введите здесь описание изображения

person Siddharth Rout    schedule 01.08.2016