Фильтровать по нескольким значениям и нескольким столбцам - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь создать собственное решение для фильтрации в файле Excel, но я не уверен, возможно ли это. Я провел небольшое исследование Inte rnet и нашел решение, приведенное ниже, но при запуске оно дает мне

ошибка времени выполнения '5': неверный вызов процедуры или аргумент .

Option Explicit

Sub Filtrare_date()

Dim Data_sh As Worksheet
Dim Raport_sh As Worksheet
Dim output_sh As Worksheet

Set Data_sh = ThisWorkbook.Sheets("Date")
Set Raport_sh = ThisWorkbook.Sheets("Raport")
Set output_sh = ThisWorkbook.Sheets("output")

output_sh.UsedRange.Clear
Data_sh.AutoFilterMode = False

'definim lista 1 de filtrare
Dim Filter_list() As String
Dim n As Integer

n = Application.WorksheetFunction.CountA(Raport_sh.Range("g:g")) - 2
ReDim Filter_list(n) As String

Dim i As Integer
For i = 0 To n
    Filter_list(i) = Raport_sh.Range("g" & i + 2)
Next i

'definim lista 2 de filtrare
Dim Filter_list_2() As String
Dim m As Integer

m = Application.WorksheetFunction.CountA(Raport_sh.Range("h:h")) - 2
ReDim Filter_list(m) As String

Dim j As Integer
For j = 0 To m
    Filter_list(j) = Raport_sh.Range("h" & j + 2)
Next j

'filtru dupa lista 1
Data_sh.UsedRange.AutoFilter 1, Filter_list(), xlFilterValues
'filtru dupa lista 2
Data_sh.UsedRange.AutoFilter 2, Filter_list_2(), xlFilterValues

Data_sh.UsedRange.SpecialCells(xlCellTypeVisible).Copy output_sh.Range("A1")
Data_sh.AutoFilterMode = False

MsgBox ("Selectia de date s-a terminat")

End Sub

Ошибка связана с этой строкой:

Data_sh.UsedRange.AutoFilter 2, Filter_list_2(), xlFilterValues

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

В следующей части были ошибки:

m = Application.WorksheetFunction.CountA(Raport_sh.Range("h:h")) - 2
ReDim <b>Filter_list_2</b>(m) As String

Dim j As Integer
For j = 0 To m
    <b>Filter_list_2</b>(j) = Raport_sh.Range("h" & j + 2)
Next j
0 голосов
/ 24 февраля 2020

Функция рабочего листа transpose - это полезный метод построения критериев выбора из диапазона без зацикливания. Также с помощью С .. Конец С блоками вы можете избежать указания имени объекта несколько раз. Например

 Sub Filtrare_date()

    Dim wsData As Worksheet, wsRaport As Worksheet, wsOutput As Worksheet
    With ThisWorkbook
        Set wsData = .Sheets("Date")
        Set wsRaport = .Sheets("Raport")
        Set wsOutput = .Sheets("output")
    End With

    wsOutput.Cells.Clear
    wsData.AutoFilterMode = False

    Dim ar1 As Variant, ar2 As Variant, i As Long
    With wsRaport
        i = .Range("G" & Rows.Count).End(xlUp).Row
        ar1 = WorksheetFunction.Transpose(.Range("G3:G" & i).Value)
        i = .Range("H" & Rows.Count).End(xlUp).Row
        ar2 = WorksheetFunction.Transpose(.Range("H3:H" & i).Value)
    End With
    'Debug.Print Join(ar1, ","), Join(ar2, ","),

    With wsData.UsedRange
        .AutoFilter 1, ar1, xlFilterValues
        .AutoFilter 2, ar2, xlFilterValues
        .SpecialCells(xlCellTypeVisible).Copy wsOutput.Range("A1")
    End With
    wsData.AutoFilterMode = False

    MsgBox ("Selectia de date s-a terminat"), vbInformation

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...