Как отфильтровать не красные ячейки?

Вопрос или проблема

Следующий код может успешно фильтровать красные ячейки.

Sub Macro1()
Sheets("Sheet1").Range("A1:E500").AutoFilter Field:=1, Criteria1:=RGB(255, 0, 0), Operator:=xlFilterCellColor
End Sub

Я ищу код VBA, который сможет фильтровать нес красные ячейки.

Предположим, цвет ячейки A2 синий.

Предположим, цвет ячейки A3 зеленый.

Предположим, цвет ячейки A4 красный.

Предположим, цвет ячейки A5 желтый.

Я хочу отфильтровать ячейки A2, A3 и A5.

Я не хочу использовать цикл for next, если это возможно.

Я имею в виду, что хочу использовать только AutoFilter, если это возможно.

Скрипт следует тому же подходу, что и ответ Michal, но использует другой метод для заполнения вспомогательного столбца.

Sub Demo()
    Dim helpRng As Range, visRng As Range
    Dim lastRow As Long, oSht As Worksheet
    Set oSht = Sheets("Sheet1")
    ' удаление существующего фильтра
    If oSht.AutoFilterMode Then oSht.AutoFilterMode = False
    lastRow = oSht.Cells(oSht.Rows.Count, 1).End(xlUp).Row
    With oSht.Range("A1:E" & lastRow)
        ' фильтр КРАСНОГО в столбце A
        .AutoFilter Field:=1, Criteria1:=RGB(255, 0, 0), Operator:=xlFilterCellColor
        ' вспомогательный столбец
        Set helpRng = .Columns(.Columns.Count).Offset(, 1)
        helpRng.EntireColumn.Hidden = False
        On Error Resume Next
        ' получение видимых ячеек на вспомогательном столбце
        Set visRng = helpRng.SpecialCells(xlCellTypeVisible)
        On Error GoTo 0
        If Not visRng Is Nothing Then
            oSht.AutoFilterMode = False
            helpRng.Clear
            ' заполнение вспомогательного столбца
            visRng.Value = 1
            ' фильтрация пустых ячеек во вспомогательном столбце
            helpRng.AutoFilter Field:=1, Criteria1:=""
            ' скрытие вспомогательного столбца
            helpRng.EntireColumn.Hidden = True
        End If
    End With
End Sub

вставьте описание изображения здесь

Я не знаю прямого способа сделать это с помощью фильтра, если я не прав, буду рад узнать об этом. Вы можете использовать вспомогательный столбец для этого с использованием фильтра.

Sub FilterNotRedCellsWithHelperColumn()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim redColor As Long
    Dim helperCol As Range
    Dim reds() As Variant
    Dim i As Long

    ' Установка рабочего листа и определение красного цвета
    Set ws = Sheets("Sheet1")
    redColor = RGB(255, 0, 0)

    ' Определение последней строки в столбце A
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).row

    ' Установка диапазона для вспомогательного столбца
    Set helperCol = ws.Range("F1:F" & lastRow)

    ' Удаление любых существующих фильтров
    If ws.AutoFilterMode Then ws.AutoFilterMode = False

    ' Шаг 1: Создание вспомогательного столбца справа от диапазона (столбец F в данном случае)
    ws.Range("F1").Value = "Helper"

    ' Шаг 2: Инициализация одномерного массива для вспомогательного столбца
    ReDim reds(1 To lastRow - 1) ' Одномерный массив для хранения значений для строк 2 до lastRow

    ' Шаг 3: Цикл по столбцу A и заполнение массива на основе цвета
    For i = 2 To lastRow
        If ws.Cells(i, 1).Interior.Color = redColor Then
            reds(i - 1) = 1 ' Сохранить 1 для красных ячеек
        Else
            reds(i - 1) = 0 ' Сохранить 0 для не-красных ячеек
        End If
    Next i

    ' Шаг 4: Заполнение вспомогательного столбца значениями из массива
    ws.Range("F2:F" & lastRow).Value = Application.Transpose(reds)

    ' Шаг 5: Применение фильтра на основе вспомогательного столбца (Field:=6 это столбец F)
    ws.Range("A1:F" & lastRow).AutoFilter Field:=6, Criteria1:="0" ' Показать только не-красные ячейки

    ' По желанию: скрытие вспомогательного столбца
    helperCol.EntireColumn.Hidden = True
End Sub

Ответ или решение

Для того чтобы отфильтровать ячейки, которые не окрашены в красный цвет, мы можем использовать вспомогательный столбец с VBA. К сожалению, в Excel не предусмотрено прямого способа фильтрации ячеек по условию «не красный» с использованием только функции AutoFilter. Однако, мы можем создать вспомогательный столбец, который будет использоваться для фильтрации.

Вот шаги для написания макроса, который выполнит эту задачу.

VBA код для фильтрации ячеек, не окрашенных в красный цвет:

Sub FilterNonRedCells()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim redColor As Long
    Dim helperCol As Range
    Dim i As Long

    ' Устанавливаем рабочий лист и определяем цвет красного
    Set ws = Sheets("Sheet1")
    redColor = RGB(255, 0, 0)

    ' Определяем последнюю строку в столбце A
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    ' Устанавливаем диапазон для вспомогательного столбца (например, столбец F)
    Set helperCol = ws.Range("F1:F" & lastRow)

    ' Удаляем любые существующие фильтры
    If ws.AutoFilterMode Then ws.AutoFilterMode = False

    ' Заполняем заголовок вспомогательного столбца
    ws.Range("F1").Value = "Helper"

    ' Шаг 1: Заполняем вспомогательный столбец
    For i = 2 To lastRow
        If ws.Cells(i, 1).Interior.Color = redColor Then
            ws.Cells(i, 6).Value = 1 ' Ячейка красная
        Else
            ws.Cells(i, 6).Value = 0 ' Ячейка не красная
        End If
    Next i

    ' Шаг 2: Применяем фильтрацию по вспомогательному столбцу (Field:=6 соответствует столбцу F)
    ws.Range("A1:F" & lastRow).AutoFilter Field:=6, Criteria1:="=0" ' Показываем только не красные ячейки

    ' Шаг 3: Опционально скрываем вспомогательный столбец
    helperCol.EntireColumn.Hidden = True
End Sub

Объяснение кода:

  1. Определение рабочей области: В коде мы сначала определяем рабочий лист и цвет красного для последующего сравнения.

  2. Определение последней строки: Используем End(xlUp) для определения последней заполненной строки в столбце A.

  3. Установка и очистка фильтров: Если фильтры уже применены, мы их удаляем, чтобы избежать путаницы.

  4. Заполнение вспомогательного столбца: Мы проходим через строки и заполняем вспомогательный столбец значениями "1" для красных ячеек и "0" для остальных.

  5. Применение фильтрации: Используя AutoFilter, мы фильтруем строки по вспомогательному столбцу, показывая только те строки, где значения равны "0", то есть не окрашенные в красный цвет.

  6. Скрытие вспомогательного столбца: В конце (по желанию) вспомогательный столбец можно скрыть для более чистого представления данных.

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

Оцените материал
Добавить комментарий

Капча загружается...