b.wag Ответов: 1

Как я могу использовать несколько сохраненных переменных в качестве критериев фильтрации?


Привет,

Я пытаюсь создать макрос, чтобы соответствовать 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) (или какие-либо) в фильтре. Может быть, нужен другой подход, но я не нашел вдохновения для этого.

1 Ответов

Рейтинг:
2

Maciej Los

Ваш вопрос очень похож на: Как я могу правильно обрабатывать "1004" не найденных ячеек?[^]

Цитата:
Filter1(y) имеет несколько записей: (отличается каждый раз, поэтому просто использует случайные буквы)
- Фильтр1(1) = xxxx
- Фильтр1(2) = гггг
- Фильтр1(3) = zzzz


Вы можете хранить эти значения на листе. Затем вы должны пройти через набор фильтров, чтобы отфильтровать исходные данные.