Показать все экземпляры строки в трех столбцах с помощью вспомогательного столбца

Я использую приведенный ниже код, чтобы показать все экземпляры строки, найденные в определенных трех столбцах. у него есть побочный эффект: при использовании позже autofiletr в любом столбце все скрытые строки отображаются снова.
Я ищу ответ во вспомогательной колонке, чтобы решить эту проблему. Заранее спасибо за любую помощь.

Sub Show_all_instances_on_three_columns()

    Dim ws As Worksheet, lRow As Long, lcol_n As Long, lastcol As String
    Dim rng As Range, i As Long, crit_Filter_Three_Columns As String
    
    Set ws = ActiveSheet
   
     lRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row                     'Last_Row on Column "A"
      lcol_n = ws.Cells(2, ws.Columns.Count).End(xlToLeft).Column           'Last_Column number on Row 2
        lastcol = Split(Cells(1, lcol_n).Address(True, False), "$")(0)        'Letter of Last_Column

    Set rng = ws.Range("A2:" & lastcol & LRow)                                'Source Range to apply Filter on it

    If Not ws.AutoFilterMode Then rng.AutoFilter                              'Set AutoFilter if not already set
    
    ws.AutoFilter.ShowAllData
       
    crit_Filter_Three_Columns = "*test*"
      
    rng.AutoFilter Field:=6, Criteria1:=crit_Filter_Three_Columns, Operator:=xlFilterValues

    For i = 1 To rng.Rows.Count
        If rng.Cells(i, 3).Value Like crit_Filter_Three_Columns Then rng.Rows(i).Hidden = False    'Unhide according to the column_3
        If rng.Cells(i, 7).Value Like crit_Filter_Three_Columns Then rng.Rows(i).Hidden = False    'Unhide according to the column_7
    Next i
    
End Sub

Я не уверен, что правильно понял ваш вопрос. Таким образом, вы хотите видеть все строки, содержащие в столбцах C, F и G строки, содержащие «crit_Filter_Three_Columns». Содержит из-за Like использования... Будет ли такое понимание правильным тоном? И, как метод, создать вспомогательную колонку и, наконец, отфильтровать по ней. Это то, что тебе надо? Или проверить точное совпадение 'crit_Filter_Three_Columns'?

FaneDuru 04.04.2023 14:49

Один вопрос не так ясен: вам нужно «точное совпадение 'crit_Filter_Three_Columns'» или «точное совпадение 'crit_Filter_Three_Columns' должно содержаться в строках трех столбцов?

FaneDuru 04.04.2023 15:00

@FaneDuru, нет точного совпадения crit_Filter_Three_Columns, например "*test*"

Waleed 04.04.2023 15:01

Хорошо, я пропустил подстановочные знаки... На самом деле, я вижу, что вы изменили его после того, как я прокомментировал.

FaneDuru 04.04.2023 15:03
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
4
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пожалуйста, попробуйте следующий адаптированный код:

Sub Show_all_instances_on_three_columns()
    Dim ws As Worksheet, lRow As Long, lcol_n As Long, lastcol As String
    Dim rng As Range, i As Long, crit_Filter_Three_Columns As String
    
    Dim arr, arrH, hlpCol As Long, rngHelp As Range
    Const helpCol As String = "HelpCol"
    
    Set ws = ActiveSheet
   
     lRow = ws.cells(ws.rows.count, "A").End(xlUp).row                     'Last_Row on Column "A"
      lcol_n = ws.cells(2, ws.Columns.count).End(xlToLeft).column          'Last_Column number on Row 2
        lastcol = Split(cells(1, lcol_n).address(True, False), "$")(0)     'Letter of Last_Column
                                                                           'helper column number (first empty one)
        
    Set rng = ws.Range("A2:" & lastcol & lRow)                             'Source Range to apply Filter on it
    
    
    crit_Filter_Three_Columns = "*test*"
    
    'determine the helper column and extend (or not the headers range):
    Set rngHelp = ws.rows(2).Find(what:=helpCol, LookIn:=xlValues, Lookat:=xlWhole)
    If Not rngHelp Is Nothing Then
        hlpCol = rngHelp.column
    Else
        hlpCol = lcol_n + 1
        ws.cells(2, hlpCol).Value = helpCol
        Set rng = rng.Resize(, rng.Columns.count + 1)
    End If
    
    If Not ws.AutoFilterMode Then rng.AutoFilter 'autofilter the resized range
    ws.AutoFilter.ShowAllData
    
    arr = rng.Value2 'place the range in an array for faster processing
    ReDim arrH(1 To UBound(arr) - 1, 1 To 1) 'redim the array to keep the helper character ("H")
   
    For i = 2 To UBound(arr)
        If arr(i, 3) Like crit_Filter_Three_Columns Or _
                 arr(i, 6) Like crit_Filter_Three_Columns Or _
                 arr(i, 7) Like crit_Filter_Three_Columns Then
            arrH(i - 1, 1) = "H"
        End If
    Next i
    
    'drop the helper array (arrH) content in the appropriate column:
    ws.cells(2, hlpCol).Offset(1).Resize(UBound(arrH), 1).Value2 = arrH

    
    'Filter the range  by helper column, for "H":
     rng.AutoFilter field:=hlpCol, Criteria1: = "H", Operator:=xlFilterValues
End Sub

Проверено сейчас.

Пожалуйста, также протестируйте его и отправьте отзыв.

@Waleed Меня тоже, но мне все равно. Не тестировать/проверять код вообще, могут быть опечатки или другие ошибки. Я только хотел доставить кусок кода, чтобы быть хотя бы подсказкой для вас. Я не знал, что вы тоже уйдете из офиса... Сейчас протестирую, исправлю и обновлю через несколько минут...

FaneDuru 04.04.2023 17:49

@Waleed В предыдущем непроверенном коде я нашел опечатку, двойное (i) объявление и немного изменил логику кода с точки зрения изменения размера диапазона заголовков для фильтрации, существует ли вспомогательный столбец или нет...

FaneDuru 04.04.2023 18:00

Теперь он работает отлично. У меня было некоторое время, чтобы понять эту часть (используя -1) ReDim arrH(1 To UBound(arr) - 1, 1 To 1), и позже я перешел на ReDim arrH(2 To UBound(arr), 1 To 1) и arrH(i, 1) = "H", и это также работает и мне легче понять.

Waleed 05.04.2023 07:45

Также, пожалуйста, есть ли разница между использованием LookIn:=xlValues и LookIn:=xlFormulas? Я вспомнил, что вы ранее говорили, что всегда используете xlFormulas.

Waleed 05.04.2023 08:32

@Waleed Это -1 было выбрано, потому что содержимое массива начало загружаться со второй строки, а содержимое массива отбрасывалось, начиная с третьей ... Когда я сказал, что «всегда используется xlFormulas», я строго имел в виду случай использования Find для определения последнего столбца, даже если он скрыт... В противном случае xlValues — это именно то, что AutoFilter нужно для правильного возврата того, что вы хотите.

FaneDuru 05.04.2023 08:39

мой последний (удаленный) комментарий был здесь, а не по другому вопросу. Я нашел ответ очень простым, поэтому я думал, что вы отказались отвечать (извините). Во всяком случае, я мог бы добавить подстановочные знаки к строкам, используя Split и позже Join, а затем добавить "*" в начале и в конце textbox.value.

Waleed 08.04.2023 14:42

@Waleed Я не помню точное значение вашего комментария, но я думаю, что нет необходимости сначала разделять, а затем «добавлять». Вы должны просто заменить пробелы подстановочными знаками (используя Replace), а также добавить их к окончаниям строк... Думаю, в одной строке кода. Но говоря о "textbox.value", я думаю о другом вопросе... И проблема в том, что массив, собранный таким образом, не будет принят Autofilter, который принимает только две такие строки, содержащие подстановочные знаки.

FaneDuru 08.04.2023 15:03

@Waleed Но это способ сделать соответствующий массив, способный работать на AutoFilter, даже там. По-другому...

FaneDuru 08.04.2023 15:10

Другие вопросы по теме