Как установить переменную для фильтрации для различных значений текстовой строки с помощью Excel VBA? - PullRequest
0 голосов
/ 21 января 2020

Я копирую текстовый файл в таблицу Excel "CleanerLog", сохраненную в переменной CleanerLog_ sh. Затем я использую другой лист с именем «Filter_Criteria» для ввода элементов, по которым я хочу выполнить фильтрацию, в массив Filter C () с использованием For l oop. Затем я использую этот массив, чтобы скопировать отфильтрованные данные на другой рабочий лист с именем «Выход C», сохраненный в переменной OutputC_ sh.

. Как только данные скопированы на новый лист, я хочу выполнить фильтрацию по последний столбец Я использую это, чтобы определить, что элементы в столбце 2 получили полный рецепт.

Вот код, который я использую в настоящее время:


Dim Filter_Criteria_sh As Worksheet
Dim CleanerLog_sh As Worksheet
Dim OutputC_sh As Worksheet

Set Filter_Criteria_sh = ThisWorkbook.Sheets("Filter_Criteria")
Set CleanerLog_sh = ThisWorkbook.Sheets("CleanerLog")
Set OutputC_sh = ThisWorkbook.Sheets("OutputC")

OutputC_sh.UsedRange.Clear

Dim Filter_C() As String
Dim n As Integer

n = Application.WorksheetFunction.CountA(Filter_Criteria_sh.Range("A:A")) - 2

ReDim Filter_C(n) As String

Dim i As Integer
For i = 0 To n
    Filter_C(i) = Filter_Criteria_sh.Range("A" & i + 2)
Next i

CleanerLog_sh.AutoFilterMode = False

CleanerLog_sh.UsedRange.AutoFilter 1, Filter_C(), xlFilterValues
CleanerLog_sh.UsedRange.Copy OutputC_sh.Range("A3")

CleanerLog_sh.AutoFilterMode = False

OutputC_sh.Range("$A$4:$AA$30000").AutoFilter Field:=4, Criteria1:= _
        "=Step 4 of 4 completed*", Operator:=xlAnd

Таблица в настоящее время выглядит так до фильтрации :

60_Text_36 | D2W22 | Brush 2 | Step 2 of 4 completed in Brush 2 Recipe

60_Text_38 | D2W22 | Brush 2 | Step 3 of 4 completed in Brush 2 Recipe

60_Text_32 | D2W21 | Brush 1 | Step 1 of 4 completed in Brush 1 Recipe

60_Text_35 | D2W21 | Brush 1 | Step 2 of 4 completed in Brush 1 Recipe

60_Text_38 | D2W21 | Brush 1 | Step 3 of 4 completed in Brush 1 Recipe

60_Text_39 | D2W22 | Brush 2 | Step 4 of 4 completed in Brush 2 Recipe

60_Text_40 | D2W21 | Brush 1 | Step 4 of 4 completed in Brush 1 Recipe

60_Text_42 | D2W21 | Brush 2 | Step 1 of 4 completed in Brush 2 Recipe

Мне нужно отфильтровать последний шаг последнего столбца (шаг 4 из 4), чтобы для каждого элемента в столбце 2 мы нашли конечный шаг для каждого Bru sh:

00:35.4 | 60_Text_39 | D2W22 | Brush 2 | Step 4 of 4 completed in Brush 2 Recipe

00:45.4 | 60_Text_40 | D2W21 | Brush 1 | Step 4 of 4 completed in Brush 1 Recipe

Моя проблема в том, что иногда данные, скопированные на лист «CleanerLog», имеют конечный шаг, который отличается, например, «Шаг 5 из 5» вместо «Шаг 4 из 4».

Как сделать критерии фильтра в следующем фрагменте кода переменной, которая будет искать последний шаг в рецепте?

OutputC_sh.Range("$A$4:$AA$30000").AutoFilter Field:=4, Criteria1:= _
        "=Step 4 of 4 completed*", Operator:=xlAnd

1 Ответ

0 голосов
/ 21 января 2020

Сканирование строк на выходном листе для создания словаря уникальных значений, где числа равны. Используйте ключи словаря в качестве критерия в автоматическом фильтре выходного листа. Например;

 Option Explicit


 Sub createOutput()
   Dim wsFilter, wsLog, wsOutput As Worksheet
   With ThisWorkbook
     Set wsFilter = .Sheets("Filter_Criteria")
     Set wsLog = .Sheets("CleanerLog")
     Set wsOutput = .Sheets("OutputC")
   End With
   wsOutput.UsedRange.Clear

   ' get filter row 1 values
   Dim endCell As Range
   With wsFilter
     Set endCell = .Cells(1, .Columns.Count).End(xlToLeft)
   End With

   ' build filter array
   Dim sText As String, sFilter_C() As String, cell As Range
   ReDim sFilter_C(endCell.Column)
   Dim i As Long

   With wsFilter
   i = 0
   For Each cell In .Range(.Range("C1"), endCell)
     'Debug.Print cell.Address, cell.Value
     If Len(cell.Value) > 0 Then
       sFilter_C(i) = cell.Value
       i = i + 1
       sText = sText & cell.Value & vbCrLf
     End If
   Next cell
   End With
   MsgBox "Filter Coll A is  " & vbCrLf & sText

   ' apply filter as copy to output
   With wsLog
     .AutoFilterMode = False
     .UsedRange.AutoFilter 1, sFilter_C, xlFilterValues
     .UsedRange.Copy wsOutput.Range("A3")
     .AutoFilterMode = False
   End With
   wsOutput.Select

   ' build output filter list on commplete steps
   Dim ar, dict, txt As String
   Set dict = CreateObject("Scripting.Dictionary")
   For Each cell In wsOutput.UsedRange.Columns(4).Cells
       ' split sentence by space
       ' Step 3 of 4 completed in Brush 2 Recipe
       txt = cell.Value
       If Left(txt, 4) = "Step" Then
         ar = Split(txt, " ", 5)
         Debug.Print ar(0), ar(1), ar(2), ar(3)
         If ar(1) = ar(3) Then
           If Not dict.Exists(txt) Then
             dict.Add txt, 1
           End If
         End If
       End If
   Next

   ' apply filter
   wsOutput.UsedRange.AutoFilter 4, dict.keys, xlFilterValues

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