Есть ли способ запустить автофильтр для нескольких столбцов одновременно в Excel VBA? - PullRequest
1 голос
/ 26 февраля 2020

У меня есть ячейка, обозначенная как поле поиска для ввода пользователя (так называемый «поиск пользователя»), и мне нужно иметь возможность использовать этот ввод для фильтрации нескольких столбцов одновременно. Например, если пользователь искал «Apple», мне нужен код VBA, чтобы отфильтровать все строки, где появляется это слово, даже если оно появилось в другом столбце. В настоящее время я зациклен на возможности отфильтровывать только один столбец за раз, но этот вход также может отображаться в другом столбце, но строка не будет отфильтрована, так как она могла быть отфильтрована по столбцу до него.

Мой текущий код приведен ниже:

Sub search()
    With ActiveSheet.Range("$a$4:$j$30")
       .AutoFilter Field:=1, Criteria1:="=*" & Range("UserSearch") & "*", Operator:=xlOr
       .AutoFilter Field:=2, Criteria1:="=*" & Range("UserSearch") & "*", Operator:=xlOr
       .AutoFilter Field:=3, Criteria1:="=*" & Range("UserSearch") & "*"
    End With
End Sub

Как вы можете видеть, моя цель - иметь возможность запускать автофильтр одновременно на всех 3 полях (по сути, обрабатывая 3 столбца как один), но код выше противоречит друг другу, и строки не возвращаются. У кого-нибудь есть идеи по использованию автофильтра?

Ответы [ 2 ]

3 голосов
/ 26 февраля 2020

Вы не можете использовать .AutoFilter для этого, но да, используя небольшой код VBA, вы можете достичь желаемого

Допустим, ваш рабочий лист выглядит следующим образом

enter image description here

Вставьте этот код в модуль

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim rngHide As Range
    Dim FoundIt As Long, i As Long, lRow As Long
    Dim SearchString As String

    '~~> Your search string
    SearchString = "Apple"

    '~~> Change this to the relevant sheet
    Set ws = Sheet1

    '~~> Find the last row
    ' https://stackoverflow.com/questions/11169445/error-in-finding-last-used-cell-in-excel-with-vba
    lRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

    '~~> Loop through 4 to last row to find the search string
    For i = 4 To lRow
        On Error Resume Next
        FoundIt = Application.WorksheetFunction.Match(SearchString, ws.Rows(i), 0)
        On Error GoTo 0

        '~~> Create a range which needs to be hidden
        If FoundIt = 0 Then
            If rngHide Is Nothing Then
                Set rngHide = ws.Rows(i)
            Else
                Set rngHide = Union(rngHide, ws.Rows(i))
            End If
        End If
        FoundIt = 0
    Next i

    '~~> Hide it if applicable
    If Not rngHide Is Nothing Then rngHide.EntireRow.Hidden = True
End Sub

Я прокомментировал код, поэтому у вас не должно возникнуть проблем с его пониманием. но если вы это сделаете, просто спросите.

В действии

enter image description here

0 голосов
/ 26 февраля 2020

Эти два макроса являются более базовыми c, но выполняют sh ту же задачу, что и ответ Сид ...

Первый макрос проходит через диапазон и проверяет первые три ячейки в текущей строке для текста поиска, если он найден в любой из ячеек, он будет l oop до следующей строки. Если ни одна ячейка не содержит текст для поиска, строка будет скрыта

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1") 'Define your worksheet
Dim UserSearch As String: UserSearch = ws.Range("A2").Value 'Assign the range for the user entry, change as needed

    For Each cel In ws.Range("A4", ws.Cells(ws.Rows.Count, 1).End(xlUp)) 'Loop through the range
        'Using (= and Or) test if any of the first three cells in the current row contain the search text
        If cel.Value = UserSearch Or cel.Offset(, 1).Value = UserSearch Or cel.Offset(, 2).Value = UserSearch Then
            'If the search text is found in any of the cells then loop to the next row
        Else
            'If the search text is not in any of the cells then hide the row
            cel.EntireRow.Hidden = True
        End If
    Next cel

Второй макрос проходит по диапазону и проверяет первые три ячейки в текущей строке на наличие текста поиска, если строка не найдена, будет скрыт

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1") 'Define your worksheet
Dim UserSearch As String: UserSearch = ws.Range("A2").Value 'Assign the range for the user entry, change the range as needed

    For Each cel In ws.Range("A4", ws.Cells(ws.Rows.Count, 1).End(xlUp)) 'Loop through the range
        'Using (<> and And) test the first three cells in the current row
        If cel.Value <> UserSearch And cel.Offset(, 1).Value <> UserSearch And cel.Offset(, 2).Value <> UserSearch Then
            'If the search text is not found hide the current row
            cel.EntireRow.Hidden = True
        End If
    Next cel
...