Как я могу использовать несколько сохраненных переменных в качестве критериев фильтрации?
Привет,
Я пытаюсь создать макрос, чтобы соответствовать 2 наборам данных. Один набор данных всегда одинаков в отношении компоновки и типа данных, но другой набор данных каждый раз отличается.
Я пытаюсь найти все совпадающие записи, используя общие ссылки, а также создать "ссылку" между двумя файлами (это в основном просто столбец, который включает номер строки совпадающей записи, чтобы впоследствии его можно было вручную проверить в случае, если 100% совпадение не будет достигнуто).
Это код, который я сейчас использую:
Объявление переменной:
Dim wb1 As Workbook Dim wb2 As Workbook Dim ws1 As Worksheet Dim ws2 As Worksheet Dim Rng As Range Dim Rng1 As Range Dim LastColwb1 As Long Dim RngFind As Range Dim LastRow1 As Long Dim x As Long Dim StrRef As String Dim StrRefZero As String Dim RngFound As Range Dim LastRowFind As Long Dim y As Long Dim z As Long Dim w As Long Dim RngDate As Range Dim RngDate2 As Range Dim Rng2 As Range Dim Rng3 As Range Dim Rng4 As Range Dim Rng5 As Range Dim Rng6 As Range Dim Rng7 As Range Dim StrDate As Date Dim LastCellwb1 As Range Dim Filter1() As String Dim Filter2 As String Dim Filter3 As String Dim Filter4 As String Dim RngPallet As Range Dim RngPallet2 As Range Dim StrPallet As String Dim RngUnitType As Range Dim RngUnitType2 As Range Dim StrUnitType As String Dim RngFormula As Range Dim var As Variant Dim FirstResult As String Dim FoundCells As Range
Частичный код, где проблема есть:
' Crop reference to useable string If Not Rng Is Nothing Then Set Rng1 = Cells(1, Rng.Column) wb1.Activate LastColwb1 = wb1.Sheets("RPD8").Cells(4, Columns.Count).End(xlToLeft).Column Set RngFind = wb1.Sheets("RPD8").Range("A4:" & ColumnLetter(LastColwb1) & "4").Find("Full Ref") LastRowFind = wb1.Sheets("RPD8").Range("A" & Rows.Count).End(xlUp).Row wb1.Sheets("RPD8").Range("AV5:AV" & LastRowFind).Formula = "=AL5&"" ""&AM5" wb2.Activate LastRow1 = wb2.ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row ' Loop through all possible references For x = 2 To LastRow1 ' Clear all filters wb1.Sheets("RPD8").Range("A4:" & LastCellwb1).AutoFilter Field:=33 wb1.Sheets("RPD8").Range("A4:" & LastCellwb1).AutoFilter Field:=48 wb1.Sheets("RPD8").Range("A4:" & LastCellwb1).AutoFilter Field:=49 wb1.Sheets("RPD8").Range("A4:" & LastCellwb1).AutoFilter Field:=25 ' Only use common reference part If Len(Cells(x, Rng1.Column)) > 5 Then StrRef = Right(Cells(x, Rng1.Column).Value, 5) While Left(StrRef, 1) = "0" And StrRef <> "" StrRefZero = Right(StrRef, Len(StrRef) - 1) StrRef = StrRefZero Wend If StrRefZero <> "" Then StrRef = StrRefZero End If Else StrRef = Cells(x, Rng1.Column).Value ' Remove leading zeros While Left(StrRef, 1) = "0" And StrRef <> "" StrRefZero = Right(StrRef, Len(StrRef) - 1) Wend If StrRefZero <> "" Then StrRef = StrRefZero End If End If ' Do a search for the reference until no more matches can be found Set RngFound = wb1.Sheets("RPD8").Range(RngFind.Address & ":" & ColumnLetter(RngFind.Column) & LastRowFind) _ .Find(StrRef, LookIn:=xlValues) If Not RngFound Is Nothing Then ' Save the first found reference FirstResult = RngFound.Address ' Variable handling for search y = 0 Do ReDim Preserve Filter1(y) Filter1(y) = RngFound.Value Filter1(y) = CStr(Filter1(y)) If FoundCells Is Nothing Then Set FoundCells = RngFound Else Set FoundCells = Union(RngFound, FoundCells) End If ' Find the next reference Set RngFound = wb1.Sheets("RPD8").Range(RngFind.Address & ":" & ColumnLetter(RngFind.Column) _ & LastRowFind).FindNext(RngFound) y = y + 1 Loop While Not RngFound Is Nothing And FirstResult <> RngFound.Address ' Filter on found matches wb1.Sheets("RPD8").Range("A4:" & LastCellwb1).AutoFilter Field:=48, _ Criteria1:=Filter1, Operator:=xlFilterValues wb1.Sheets("RPD8").Range("AX5:" & LastRowFind).SpecialCells(xlCellTypeVisible).Value = "X" wb1.Sheets("RPD8").Range("BB5:" & LastRowFind).SpecialCells(xlCellTypeVisible).Value = x End If
Все работает отлично (до сих пор), пока я не достигну этой части:
' Filter on found matches wb1.Sheets("RPD8").Range("A4:" & LastCellwb1).AutoFilter Field:=48, _ Criteria1:=Filter1, Operator:=xlFilterValues
Filter1(y) имеет несколько записей: (отличается каждый раз, поэтому просто использует случайные буквы)
- Фильтр1(1) = xxxx
- Фильтр1(2) = гггг
- Фильтр1(3) = zzzz
- ...
Я должен сузить свой набор данных до этих записей, чтобы еще больше соответствовать этим записям в следующем коде. Следующий код использует фильтры с одним критерием, поэтому я не ожидаю там никаких проблем.
Если у кого-то есть какие-то идеи, это было бы очень кстати.
К вашему сведению, никаких ошибок не происходит, действие фильтра просто никогда не происходит. Я могу, полное раскрытие, вручную фильтровать с помощью значений Filter1(y), так что это должно быть возможно.
Что я уже пробовал:
Я пытался переработать эту часть пару раз, но так и не смог получить все значения Filter1(y) (или какие-либо) в фильтре. Может быть, нужен другой подход, но я не нашел вдохновения для этого.