Обходной путь для фильтрации по нескольким критериям - PullRequest
0 голосов
/ 20 февраля 2019

Я видел несколько разных решений для того, чтобы обойти ограничение в 2 символа подстановки для фильтров в Excel (в частности, ответ опубликован здесь , но мне было трудно понять, что они делают. Работа вокруг меняпопытаться реализовать это просто посчитать количество экземпляров каждого критерия в ячейке, используя базовую формулу счетчика, и если оно равно 0, то макрос скроет строку.

With ws1

    ColumnOne = .Cells(1, .Columns.Count).End(xlToLeft).Column
    LastRow = .Cells(.Rows.Count, lastColumn).End(xlUp).Row

    ColumnTwo = ColumnOne - 1



    If ws2.Application.WorksheetFunction.CountA("D47:D61") <> 0 Then

        For i = 1 To LastRow
            If .Cells(i, ColumnTwo).Value = 0 Then
                .Rows(i).EntireRow.Hidden = True
            End If

        Next i

    ElseIf ws2.Application.WorksheetFunction.CountA("E47:E61") <> 0 Then

        For i = 1 To LastRow
            If .Cells(i, ColumnOne).Value = 0 Then
                .Rows(i).EntireRow.Hidden = True
            End If

        Next i
    Else
        Exit Sub
    End If
End With

Приведенный выше код - это то, что яЯ использую, чтобы справиться с этим. Для справки, есть две колонки критериев на отдельном рабочем листе (ws2), которые могут измениться / быть полностью пустыми. Код выше затем проверяет, с каким из этих столбцов он должен работать (D наws2 использует ColumnTwo на ws1, E на ws2 использует ColumnOne на ws1), просматривая, какой из них не пустой, а затем начинает проверять столбец на ws1 строка за строкой, чтобы увидеть, присутствует ли какой-либо из критериев.(значение ячейки = 0), тогда он должен скрыть эту строку.

Проверка на использование D или E, похоже, не работаетING.Даже если все ячейки в D47: D61 на ws2 пусты, он все равно работает в операторе if вместо перехода на E47: E61.Любые идеи относительно того, что я должен попытаться изменить здесь?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Я изменил ваш код, чтобы обеспечить объявление всех переменных.

Sub HideRows()
'Ensure you declare all your variables
Dim ws1 As Worksheet, ws2 As Worksheet, lRow As Long
Dim ColumnOne As Integer, ColumnTwo As Integer
Dim dRng As Range, eRng As Range
Dim dRngCnt As Long, eRngCnt As Long

'Assign worksheets and variables
Set ws1 = ThisWorkbook.Sheets("Sheet1")
Set ws2 = ThisWorkbook.Sheets("Sheet2")

'Identifying the specific range as variable
Set dRng = ws2.Range("D2:D9")
Set eRng = ws2.Range("E2:E9")

'Assigning a variable to the countA will simplify your IF and ELSEIF statements
dRngCnt = Application.WorksheetFunction.CountA(dRng)
eRngCnt = Application.WorksheetFunction.CountA(eRng)

    With ws1
        ColumnOne = .Cells(1, .Columns.Count).End(xlToLeft).Column
        'I replaced "lastColumn" with "ColumnOne", because they are the same value, so you only need to use one
        lRow = .Cells(.Rows.Count, ColumnOne).End(xlUp).Row
        ColumnTwo = ColumnOne - 1

        If dRngCnt <> 0 Then 'I use the countA variable for column D Range
            For i = 1 To lRow
                If .Cells(i, ColumnTwo).Value = 0 Then 'Any 0s in the second to last columns will hide the row
                    .Rows(i).EntireRow.Hidden = True
                End If
            Next i

        ElseIf eRngCnt <> 0 Then 'I use the countA variable for column E Range
            For i = 1 To lRow
                If .Cells(i, ColumnOne).Value = 0 Then
                    .Rows(i).EntireRow.Hidden = True
                End If

            Next i
        Else
            Exit Sub

        End If
    End With

End Sub
0 голосов
/ 20 февраля 2019

Кажется, что код ниже работает сейчас:

With ws1

    ColumnTwo = .Cells(1, .Columns.Count).End(xlToLeft).Column
    LastRow = .Cells(.Rows.Count, lastColumn).End(xlUp).Row

    ColumnOne = ColumnTwo - 1


    With ws2
    Set aDataRange = ws2.Range("D47:D61")
    Set pDataRange = ws2.Range("E47:E61")
        If Application.WorksheetFunction.CountA(aDataRange) <> 0 Then
            MsgBox ("ColumnOne")
            With ws1
                For i = 1 To LastRow
                    If .Cells(i, ColumnOne).Value = 0 Then
                        .Rows(i).EntireRow.Hidden = True
                    End If

                Next i
            End With

        ElseIf Application.WorksheetFunction.CountA(pDataRange) <> 0 Then
            MsgBox ("ColumnTwo")
            With ws1
                For i = 1 To LastRow
                    If .Cells(i, ColumnTwo).Value = 0 Then
                        .Rows(i).EntireRow.Hidden = True
                    End If

                Next i
            End With
        Else
            Exit Sub
        End If
    End With
End With

Зачем мне нужно определять области диапазона для D47: D61 / E47: E61 на ws2 отдельно?Почему бы «ws2.Application.WorksheetFunction.CountA (« Range »)» не применяться к диапазону на ws2, даже если он содержался в «With ws2»?

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