Вопрос или проблема
Следующий код может успешно фильтровать красные ячейки.
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
Объяснение кода:
-
Определение рабочей области: В коде мы сначала определяем рабочий лист и цвет красного для последующего сравнения.
-
Определение последней строки: Используем
End(xlUp)
для определения последней заполненной строки в столбце A. -
Установка и очистка фильтров: Если фильтры уже применены, мы их удаляем, чтобы избежать путаницы.
-
Заполнение вспомогательного столбца: Мы проходим через строки и заполняем вспомогательный столбец значениями "1" для красных ячеек и "0" для остальных.
-
Применение фильтрации: Используя
AutoFilter
, мы фильтруем строки по вспомогательному столбцу, показывая только те строки, где значения равны "0", то есть не окрашенные в красный цвет. -
Скрытие вспомогательного столбца: В конце (по желанию) вспомогательный столбец можно скрыть для более чистого представления данных.
Этот макрос эффективно решает задачу фильтрации ячеек, не имеющих красную окраску, с помощью единственной функции AutoFilter, используя вспомогательный столбец.