Макрос для условного форматирования в excel

Скриншот результата применения макросом условного форматирования к диапазону ячеек

Макрос запрашивает у пользователя число,
и назначает правило условного форматирования для ячеек текущего столбца

В виде надстройки этот макрос можно найти здесь

Sub RedNumbers()
    ' макрос запрашивает у пользователя число,
    ' после чего в текущем столбце красит все ячейки с числами,
    ' большими чем введенное, в красный цвет
    
    On Error Resume Next: col = ActiveCell.Column
    If Err Then Exit Sub    ' выход, если не открыта ни одна книга

    Dim ra As Range: Set ra = Intersect(Columns(col), ActiveSheet.UsedRange)
    If ra Is Nothing Then Exit Sub    ' выход, если выделена ячейка в пустом столбце

    msg = "Введите число для сравнения с числами текущего столбца." & vbNewLine & _
          "Все числа в столбце " & col & ", которые больше введенного числа, будут выделены красным"
 
    ' запрашиваем число
    n = Application.InputBox(msg, "Выделение чисел цветом", Val(ActiveCell), , , , , 1)
 
    ' удаляем условное форматирвоание
    ra.FormatConditions.Delete
 
    If TypeName(n) = "Boolean" Then    ' отказ от ввода числа
        ' ничего не делаем

    Else    ' введено число

        ' назначаем условное форматирование - красим в красный цвет все ячейки
        ' со значением больше N
        ra.FormatConditions.Add(xlCellValue, xlGreater, n).Interior.Color = vbRed
 
    End If
End Sub

Для удаления условного форматирования для всех ячеек текущего листа Excel
можно использовать такой макрос:

Sub ClearCF()
    ' макрос удаляет условное форматирование на всём листе
    On Error Resume Next
    Cells.FormatConditions.Delete
End Sub
  • 26854 просмотра

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.

Студворк — интернет-сервис помощи студентам

Добрый день. Обрабатываю ежедневно с помощью макроса некоторые данные. Среди прочего, макрос закрашивает ячейки, которым соответствуют наибольшие значения из соседнего столбца. Звучит запутанно, но не в этом суть. Проблема вот в чём — после выполнения макроса в управлении правилами появляется верная формула:

Условное форматирование через макрос

Но, как видно на скрине, столбец C без зелёных ячеек, т.е. правило есть, а «визуализации» этого правила нет. Но если кликнуть на «Изменить правило», затем, ничего не меняя, просто нажать ОК и затем «Применить» или ОК в диспетчере правил, всё закрашивается как надо.

Т.е. макрос задаёт условия правильно, но формула начинает работать и закрашивать ячейки, только если руками слазить в диспетчер правил. В чём может быть причина?

Ну и сам кусок кода, который задаёт формулу:

Visual Basic
1
2
3
4
5
6
7
8
9
10
    Columns("C:C").Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=МАКС(ЕСЛИ($B1=$B$1:$B$700,$N$1:$N$700))=$N1"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 5296274
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False

замечания

Вы не можете определить более трех условных форматов для диапазона. Используйте метод Modify для изменения существующего условного формата или используйте метод Delete для удаления существующего формата перед добавлением нового.

FormatConditions.Add

Синтаксис:

FormatConditions.Add(Type, Operator, Formula1, Formula2)

Параметры:

название Обязательный / необязательный Тип данных
Тип необходимые XlFormatConditionType
оператор Необязательный Вариант
Формула 1 Необязательный Вариант
Formula2 Необязательный Вариант

XlFormatConditionType enumaration:

название Описание
xlAboveAverageCondition Выше среднего условия
xlBlanksCondition Состояние бланков
xlCellValue Значение ячейки
xlColorScale Цветовая гамма
xlDatabar Databar
xlErrorsCondition Условие ошибок
xlExpression выражение
XlIconSet Набор значков
xlNoBlanksCondition Отсутствие состояния пробелов
xlNoErrorsCondition Нет ошибок.
xlTextString Текстовая строка
xlTimePeriod Временной период
xlTop10 Топ-10 значений
xlUniqueValues Уникальные значения

Форматирование по значению ячейки:

With Range("A1").FormatConditions.Add(xlCellValue, xlGreater, "=100")
    With .Font
        .Bold = True
        .ColorIndex = 3
     End With
End With

Операторы:

название
xlBetween
xlEqual
xlGreater
xlGreaterEqual
xlLess
xlLessEqual
xlNotBetween
xlNotEqual

Если Type является выражением xlExpression, аргумент Operator игнорируется.

Форматирование по тексту содержит:

With Range("a1:a10").FormatConditions.Add(xlTextString, TextOperator:=xlContains, String:="egg")
    With .Font
        .Bold = True
        .ColorIndex = 3
    End With
End With

Операторы:

название Описание
xlBeginsWith Начинается с указанного значения.
xlContains Содержит указанное значение.
xlDoesNotContain Не содержит указанного значения.
xlEndsWith Завершить указанное значение

Форматирование по времени

With Range("a1:a10").FormatConditions.Add(xlTimePeriod, DateOperator:=xlToday)
    With .Font
        .Bold = True
        .ColorIndex = 3
    End With
End With

Операторы:

название
xlYesterday
xlTomorrow
xlLast7Days
xlLastWeek
xlThisWeek
xlNextWeek
xlLastMonth
xlThisMonth
xlNextMonth

Удалить условный формат

Удалите все условные форматы в диапазоне:

Range("A1:A10").FormatConditions.Delete

Удалите все условные форматы на листе:

Cells.FormatConditions.Delete

FormatConditions.AddUniqueValues

Выделение повторяющихся значений

With Range("E1:E100").FormatConditions.AddUniqueValues
   .DupeUnique = xlDuplicate
   With .Font
       .Bold = True
       .ColorIndex = 3
   End With
End With

Выделение уникальных значений

With Range("E1:E100").FormatConditions.AddUniqueValues
   With .Font
       .Bold = True
       .ColorIndex = 3
   End With
End With

FormatConditions.AddTop10

Выделение верхних 5 значений

With Range("E1:E100").FormatConditions.AddTop10
    .TopBottom = xlTop10Top
    .Rank = 5
    .Percent = False
    With .Font
        .Bold = True
        .ColorIndex = 3
    End With
End With

FormatConditions.AddAboveAverage

With Range("E1:E100").FormatConditions.AddAboveAverage
    .AboveBelow = xlAboveAverage
    With .Font
        .Bold = True
        .ColorIndex = 3
    End With
End With

Операторы:

название Описание
XlAboveAverage Выше среднего
XlAboveStdDev Выше стандартного отклонения
XlBelowAverage Ниже среднего
XlBelowStdDev Ниже стандартного отклонения
XlEqualAboveAverage Равно выше среднего
XlEqualBelowAverage Равновесие ниже среднего

FormatConditions.AddIconSetCondition

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

Range("a1:a10").FormatConditions.AddIconSetCondition
With Selection.FormatConditions(1)
    .ReverseOrder = False
    .ShowIconOnly = False
    .IconSet = ActiveWorkbook.IconSets(xl3Arrows)
End With

With Selection.FormatConditions(1).IconCriteria(2)
    .Type = xlConditionValuePercent
    .Value = 33
    .Operator = 7
End With

With Selection.FormatConditions(1).IconCriteria(3)
    .Type = xlConditionValuePercent
    .Value = 67
    .Operator = 7
End With

IconSet:

название
xl3Arrows
xl3ArrowsGray
xl3Flags
xl3Signs
xl3Stars
xl3Symbols
xl3Symbols2
xl3TrafficLights1
xl3TrafficLights2
xl3Triangles
xl4Arrows
xl4ArrowsGray
xl4CRV
xl4RedToBlack
xl4TrafficLights
xl5Arrows
xl5ArrowsGray
xl5Boxes
xl5CRV
xl5Quarters

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

Тип:

название
xlConditionValuePercent
xlConditionValueNumber
xlConditionValuePercentile
xlConditionValueFormula

Оператор:

название Значение
xlGreater 5
xlGreaterEqual 7

Значение:

Возвращает или устанавливает пороговое значение для значка в условном формате.

Координатное выделение

У вас большой монитор, но таблицы, с которыми вы работаете — еще больше. И, пробегая взглядом по экрану в поисках нужной информации, всегда есть шанс «соскользнуть» взглядом на соседнюю строчку и посмотреть не туда. Я даже знаю людей, который для таких случаев постоянно держат недалеко от себя деревянную линейку, чтобы приложить ее к строке на мониторе. Технологии будущего! 

А если при движении активной ячейки по листу будет подсвечиваться текущая строка и столбец? Своего рода координатное выделение примерно такого вида:

coord_selection1.gif

Поудобнее, чем линейка, правда?

Есть несколько способов разной сложности, чтобы реализовать такое. Каждый способ — со своими плюсами и минусами. Давайте разберем их детально.

Способ 1. Очевидный. Макрос, выделяющий текущую строку и столбец

Самый очевидный путь для решения нашей проблемы «в лоб» — нам нужен макрос, который будет отслеживать изменение выделения на листе и выделять целую строку и столбец для текущей ячейки. Также желательно иметь возможность при необходимости включать и отключать эту функцию, чтобы такое крестообразное выделение не мешало нам вводить, например, формулы, а работало только тогда, когда мы просматриваем список в поисках нужной информации. Это приводит нас к трем макросам (выделения, включения и выключения), которые нужно будет добавить в модуль листа.

Откройте лист со таблицей, в которой хотите получить такое координатное выделение. Щелкните правой кнопкой мыши по ярлычку листа и выберите в контекстном меню команду Исходный текст (Source Code). Должно открыться окно редактора Visual Basic. Скопируйте в него этот текст этих трех макросов:

Dim Coord_Selection As Boolean   'глобальная переменная для вкл/выкл выделения

Sub Selection_On()   'макрос включения выделения
    Coord_Selection = True
End Sub

Sub Selection_Off()  'макрос выключения выделения
    Coord_Selection = False
End Sub

'основная процедура, выполняющая выделение
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim WorkRange As Range

    If Target.Cells.Count > 1 Then Exit Sub  'если выделено больше 1 ячейки - выходим
    If Coord_Selection = False Then Exit Sub    'если выделение выключено - выходим

    Application.ScreenUpdating = False
    Set WorkRange = Range("A6:N300")    'адрес рабочего диапазона, в пределах которого видно выделение
    Intersect(WorkRange, Union(Target.EntireColumn, Target.EntireRow)).Select   'формируем крестообразный диапазон и выделяем
    Target.Activate   
End Sub

Измените адрес рабочего диапазона на свой — именно в пределах этого диапазона и будет работать наше выделение. Затем закройте редактор Visual Basic и вернитесь в Excel.

Нажмите сочетание клавиш ALT+F8, чтобы открыть окно со списком доступных макросов. Макрос Selection_On, как нетрудно догадаться, включает координатное выделение на текущем листе, а макрос Selection_Off — выключает его. В этом же окне, нажав кнопку Параметры (Options) можно назначить этим макросам сочетания клавиш для удобного запуска.

Плюсы этого способа:

  • относительная простота реализации
  • выделение — операция безобидная и никак не изменяет содержимое или форматирование ячеек листа, все остается как есть

Минусы этого способа:

  • такое выделение некорректно работает в том случае, если на листе есть объединенные ячейки — выделяются сразу все строки и столбцы, входящие в объединение
  • если случайно нажать клавишу Delete, то очистится не только активная ячейка, а вся выделенная область, т.е. удалятся данные из всей строки и столбца

Способ 2. Оригинальный. Функция ЯЧЕЙКА + Условное форматирование

Этот способ хотя и имеет пару недостатков, мне представляется весьма изящным. Реализовать что-либо, используя только встроенные средства Excel, минимально влезая в программирование на VBA — высший пилотаж ;)

Способ основан на использовании функции ЯЧЕЙКА (CELL), которая может выдавать массу различной информации по заданной ячейке — высоту, ширину, номер строки-столбца, числовой формат и т.д.. Эта функция имеет два аргумента:

  • кодовое слово для параметра, например «столбец» или «строка»
  • адрес ячейки, для которой мы хотим определить значение этого параметра

Хитрость в том, что второй аргумент не является обязательным. Если он не указан, то берется текущая активная ячейка.

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

  1. Выделяем нашу таблицу, т.е. те ячейки, в которых в будущем должно отображаться координатное выделение.
  2. В Excel 2003 и более старших версиях открываем меню Формат — Условное форматирование — Формула (Format — Conditional Formatting — Formula). В Excel 2007 и новее — жмем на вкладке Главная (Home) кнопку Условное форматирование — Создать правило (Conditional Formatting — Create Rule) и выбираем тип правила Использовать формулу для определения форматируемых ячеек (Use formula)
  3. Вводим формулу для нашего координатного выделения:

    =ИЛИ(ЯЧЕЙКА(«строка»)=СТРОКА(A2);ЯЧЕЙКА(«столбец»)=СТОЛБЕЦ(A2))

    =OR(CELL(«row»)=ROW(A1),CELL(«column»)=COLUMN(A1))
    coord_selection2.gif
    Эта формула проверяет, не совпадает ли номер столбца каждой ячейки в таблице с номером столбца текущей ячейки. Аналогично со столбцами. Таким образом закрашенными окажутся только те ячейки, у которых либо номер столбца, либо номер строки совпадает с текущей ячейкой. А это и есть крестообразное координатное выделение, которого мы хотим добиться.

  4. Нажмите кнопку Формат (Format) и задайте цвет заливки.

Все почти готово, но остался один нюанс. Дело в том, что Excel не считает изменение выделения изменением данных на листе. И, как следствие, не запускает пересчет формул и перекраску условного форматирования только при изменении положения активной ячейки. Поэтому добавим в модуль листа простой макрос, который будет это делать. Щелкните правой кнопкой мыши по ярлычку листа и выберите в контекстном меню команду Исходный текст (Source Code). Должно открыться окно редактора Visual Basic. Скопируйте в него этот текст этого простого макроса:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ActiveCell.Calculate
End Sub

Теперь при изменении выделения будет запускаться процесс пересчета формулы с функцией ЯЧЕЙКА в условном форматировании и заливаться текущая строка и столбец.

Плюсы этого способа:

  • Условное форматирование не нарушает пользовательское форматирование таблицы
  • Этот вариант выделения корректно работает с объединенными ячейками.
  • Нет риска удалить целую строку и столбец с данными при случайном нажатии Delete.
  • Макросы используются минимально

Минусы этого способа:

  • Формулу для условного форматирования надо вводить вручную.
  • Нет быстрого способа включить-выключить такое форматирование — оно включено всегда, пока не будет удалено правило.

Способ 3. Оптимальный. Условное форматирование + макросы

Золотая середина. Используем механизм отслеживания выделения на листе при помощи макросов из способа-1 и добавим к нему безопасное выделение цветом с помощью условного форматирования из способа-2.

Откройте лист со таблицей, в которой хотите получить такое координатное выделение. Щелкните правой кнопкой мыши по ярлычку листа и выберите в контекстном меню команду Исходный текст (Source Code). Должно открыться окно редактора Visual Basic. Скопируйте в него этот текст этих трех макросов:

Dim Coord_Selection As Boolean

Sub Selection_On()
    Coord_Selection = True
End Sub

Sub Selection_Off()
    Coord_Selection = False
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim WorkRange As Range, CrossRange As Range
    Set WorkRange = Range("A7:N300")    'адрес рабочего диапазона с таблицей
    If Target.Count > 1 Then Exit Sub
    If Coord_Selection = False Then
        WorkRange.FormatConditions.Delete
        Exit Sub
    End If
    Application.ScreenUpdating = False
    If Not Intersect(Target, WorkRange) Is Nothing Then
        Set CrossRange = Intersect(WorkRange, Union(Target.EntireRow, Target.EntireColumn))
        WorkRange.FormatConditions.Delete
        CrossRange.FormatConditions.Add Type:=xlExpression, Formula1:="=1"
        CrossRange.FormatConditions(1).Interior.ColorIndex = 33
        Target.FormatConditions.Delete
    End If
End Sub

Не забудьте изменить адрес рабочего диапазона на адрес своей таблицы. Закройте редактор Visual Basic и вернитесь в Excel. Чтобы использовать добавленные макросы, нажмите сочетание клавиш ALT+F8  и действуйте аналогично способу 1. 

Способ 4. Красивый. Надстройка FollowCellPointer

Excel MVP Jan Karel Pieterse родом из Нидерландов раздает у себя на сайте бесплатную надстройку FollowCellPointer(36Кб), которая решает ту же задачу, отрисовывая с помощью макросов графические линии-стрелки для подсветки текущей строки и столбца:

coord_selection3.gif

Красивое решение. Не без глюков местами, но попробовать точно стоит. Качаем архив, распаковываем на диск и устанавливаем надстройку:

  • в Excel 2003 и старше — через меню Сервис — Надстройки — Обзор (Tools — Add-Ins — Browse)
  • в Excel 2007 и новее — через Файл — Параметры — Надстройки — Перейти — Обзор (File — Excel Options — Add-Ins — Go to — Browse)

Ссылки по теме

  • Что такое макросы, куда вставлять код макроса на Visual Basic

  • Условное форматирование в Excel VBA

Условное форматирование в Excel VBA

В Excel мы все использовали условное форматирование для выделения дублирующихся значений. В основном условное форматирование используется для получения дублированных значений. Мы можем выделить дубликаты значений разными способами. Мы можем выделить дубликаты значений, диапазон конкретных значений, а также определить правило для завершения критериев форматирования. Ниже приведены функции переменных, доступные в разделе «Условное форматирование».

Но что, если мы сможем автоматизировать этот процесс выделения дубликатов или любых других значений в соответствии с нашим требованием. Критерии, которые мы можем определить с помощью условного форматирования в Excel, также могут быть выполнены в VBA. Для применения условного форматирования мы можем выбрать любую ячейку, диапазон которой доступен на листе Excel. Условное форматирование работает только тогда, когда определенные критерии соответствуют требованию. Иначе, это не покажет никакого изменения цвета. С помощью условного форматирования в VBA мы можем изменить цвет любой ячейки или содержимого ячейки, удалить цвет ячейки или удалить цвет. Помимо изменения цвета ячейки, мы можем изменить содержимое ячейки на текст, выделенный жирным шрифтом или курсивом . После этого мы можем отменить все изменения.

Как использовать условное форматирование в Excel VBA?

Ниже приведены различные примеры использования функции условного форматирования в Excel с использованием кода VBA.

Вы можете скачать этот шаблон Excel для условного форматирования VBA здесь — Шаблон Excel для условного форматирования VBA

Условное форматирование VBA — пример № 1

У нас есть данные о некоторых числах и тексте, как показано ниже в столбцах A и B. Теперь мы уже классифицировали цвет, который нам нужно присвоить числу и тексту, который находится в ячейке D2. Мы определили желтый цвет для номера 1 и алфавита A и зеленый цвет для номера 2 и алфавита B.

Хотя условное форматирование VBA может быть реализовано в модуле, но написание кода для условного форматирования на листе заставит код работать только на этом листе. Для этого вместо того, чтобы перейти к опции «Модуль», нажмите на вкладку «Вставка», чтобы вставить модуль.

Шаг 1: Теперь в первом раскрывающемся списке выберите « Рабочий лист», который по умолчанию будет общим, и в раскрывающемся списке «Выбор» он автоматически выберет параметр SelectionChange, как показано ниже.

Шаг 2: Как только мы это сделаем, он автоматически активирует частную подкатегорию, и целевая ячейка будет в диапазоне.

Код:

 Private Sub Worksheet_SelectionChange (цель ByVal в качестве диапазона) End Sub 

Шаг 3: Теперь напишите код, сначала определите переменную MyRange как Range . Или вы можете выбрать любое другое имя вместо MyRange согласно вашему выбору.

Код:

 Private Sub Worksheet_SelectionChange (ByVal Target As Range) Dim MyRange As Sub End Sub 

Шаг 4: Используйте Set и выберите определенный диапазон, как показано ниже.

Код:

 Private Sub Worksheet_SelectionChange (ByVal Target As Range) Dim MyRange As Range Set MyRange = End Sub 

Шаг 5: После этого выберите Рабочий лист, к которому мы хотим применить условное форматирование. Здесь наш лист Sheet1. Мы можем поставить последовательность также как 1 вместо записи Sheet1. А затем выберите диапазон тех ячеек, которые нам нужно отформатировать. Здесь наш диапазон от ячейки A1 до B8.

Код:

 Private Sub Worksheet_SelectionChange (ByVal Target As Range) Dim MyRange As Set Range MyRange = Worksheets ("Sheet1"). Range ("A1: B8") End Sub 

Шаг 6: Теперь откройте цикл For Each-Next, как показано ниже. И начнем с выбора переменной MyRange, определенной в Cell .

Код:

 Private Sub Worksheet_SelectionChange (ByVal Target As Range) Dim MyRange As Range Set MyRange = Worksheets ("Sheet1"). Range ("A1: B8") для каждой ячейки в MyRange Next End Sub 

Шаг 7: Теперь снова откройте цикл If-Else.

Код:

 Private Sub Worksheet_SelectionChange (ByVal Target As Range) Dim MyRange As Range Set MyRange = Worksheets ("Sheet1"). Range ("A1: B8") для каждой ячейки в MyRange, если End If Next End Sub 

Это регион, в котором мы назначаем цвета всем числам и алфавитам, имеющимся в нашем ассортименте.

Шаг 8: Напишите код, если значение ячейки равно 1, тогда цвет интерьера: выбранная ячейка диапазона от A1 до B8 будет зеленого цвета. А для зеленого у нас есть цветовой код, назначенный ему как 6.

Код:

 Private Sub Worksheet_SelectionChange (ByVal Target As Range) Dim MyRange As Range Set MyRange = Worksheets ("Sheet1"). Range ("A1: B8") для каждой ячейки в MyRange, если Cell.Value Like "1", то Cell.Interior.ColorIndex = 6 End If Next End Sub 

Шаг 9: Теперь для значения ячейки номер 2. Иначе, если значение ячейки любой ячейки из выбранного диапазона равно 2, то цвет внутренней части этой ячейки будет желтым. А для желтого у нас есть код цвета, назначенный ему как 4.

Код:

 Private Sub Worksheet_SelectionChange (ByVal Target As Range) Dim MyRange As Range Set MyRange = Worksheets ("Sheet1"). Range ("A1: B8") для каждой ячейки в MyRange, если Cell.Value Like "1", то Cell.Interior.ColorIndex = 6 ElseIf Cell.Value Как "2", то Cell.Interior.ColorIndex = 4 End If Next End Sub 

Для каждого цвета у нас есть разные цветовые коды, назначенные им, которые начинаются с 1 до 56. Принимая во внимание, что числовой код 1 назначается черному цвету, а номер 56 назначается темно-серому цвету. Между прочим, у нас есть другие цвета, которые мы можем найти в Microsoft Documents.

Шаг 10: Если что-либо из перечисленного

условие — ЛОЖЬ, тогда у нас будет другое условие, если если значение ячейки равно А, то внутренний цвет ячейки будет Желтым. И для желтого снова мы назначим код как 6.

Код:

 Private Sub Worksheet_SelectionChange (ByVal Target As Range) Dim MyRange As Range Set MyRange = Worksheets ("Sheet1"). Range ("A1: B8") для каждой ячейки в MyRange, если Cell.Value Like "1", то Cell.Interior.ColorIndex = 6 ElseIf Cell.Value как «2», затем Cell.Interior.ColorIndex = 4 ElseIf Cell.Value, как «A», то Cell.Interior.ColorIndex = 6 End If Next End Sub 

Шаг 11: Сделайте то же самое для значения ячейки B, с цветовым кодом 4, как зеленый.

Код:

 Private Sub Worksheet_SelectionChange (ByVal Target As Range) Dim MyRange As Range Set MyRange = Worksheets ("Sheet1"). Range ("A1: B8") для каждой ячейки в MyRange, если Cell.Value Like "1", то Cell.Interior.ColorIndex = 6 ElseIf Cell.Value Как «2» Тогда Cell.Interior.ColorIndex = 4 ElseIf Cell.Value Как «A» Тогда Cell.Interior.ColorIndex = 6 ElseIf Cell.Value Как «B» Тогда Cell.Interior.ColorIndex = 4 End If Next End Sub 

Шаг 12: Если какое-либо из условий не TRUE, то для Else мы предпочтем выбрать цветовой код как None .

Код:

 Private Sub Worksheet_SelectionChange (ByVal Target As Range) Dim MyRange As Range Set MyRange = Worksheets ("Sheet1"). Range ("A1: B8") для каждой ячейки в MyRange, если Cell.Value Like "1", то Cell.Interior.ColorIndex = 6 ElseIf Cell.Value Как «2» Тогда Cell.Interior.ColorIndex = 4 ElseIf Cell.Value Как «A» Тогда Cell.Interior.ColorIndex = 6 ElseIf Cell.Value Как «B» Тогда Cell.Interior.ColorIndex = 4 Else Cell.Ineterios.ColorIndex = xlNone End If Next End Sub 

Шаг 13: Поскольку код большой, для компиляции каждого шага кода нажмите функциональную клавишу F8. Если ошибки не найдены, нажмите кнопку воспроизведения, чтобы запустить весь код за один раз. Мы увидим, что согласно правилу условного форматирования, определенному в коде VBA, цвет ячеек был изменен на выбранные цветовые коды, как показано ниже.

Шаг 14: Это форматирование теперь исправлено. Если мы хотим увидеть изменения в цвете, для теста давайте изменим значение любой ячейки, считая А1 с 1 на 2. Мы увидим, что цвет ячейки А1 меняется на Зеленый.

Это связано с тем, что мы объявили, что в диапазоне от A1 до B8 любая ячейка, содержащая числа 1 и 2 и алфавиты A и B, будет отформатирована в желтый и зеленый цвета, как показано в ячейках D2-E3.

Плюсы и минусы

  • Это дает мгновенный вывод, если у нас есть огромные данные. Принимая во внимание, что если мы применим то же самое из пункта меню Excel, потребуется время, чтобы очистить форматирование для большого набора данных.
  • Мы можем выполнять все типы функций, которые доступны в Excel для условного форматирования в VBA.
  • Не рекомендуется применять условное форматирование VBA для небольшого набора данных.

То, что нужно запомнить

  • Есть много других функций, кроме выделения дубликатов и одинаковых ячеек значений. Мы можем изменить формат ячейки любым способом, таким как полужирный шрифт, текст курсивом, изменение цвета шрифта, изменение цвета фона, выделение значений в некотором определенном диапазоне.
  • После применения условного форматирования мы можем изменить правило, фактически мы можем также удалить условия форматирования. Так что наши данные вернутся к норме.
  • Мы можем применить более одного условия в одном макросе.

Рекомендуемые статьи

Это руководство по условному форматированию VBA. Здесь мы обсудим, как использовать функцию условного форматирования Excel VBA вместе с практическими примерами и загружаемым шаблоном Excel. Вы также можете просмотреть наши другие предлагаемые статьи —

  1. Функция копирования и вставки в VBA
  2. Функция подстроки Excel
  3. Индекс VBA вне диапазона
  4. Excel ISNUMBER Formula
  5. Условное форматирование для дат в Excel

Very often I need to create conditional formating rules on my excel worksheets, not always on the same range, to format the text color depending on what’s written.

The most common situation is turning all the cells in the range that have the text «Effective» green and bold, and «Not effective» red and bold.

I tried to create this macro using the Record Macro function on the Developer tab, but it didn’t work, the code was blank.

As I have zero knowledge on VBA, I was wondering if somebody could give me a help creating this macro.

Definitions:

  • There’s no fixed range, it needs to capture the selected range;
  • Format based on text, if «Effective» green and bold, if «Not effective» red and bold.
  • Only for one sheet.

[Solved]

Sub EffectiveNot()
'
' EffectiveNot Macro
'
    Dim rStart As Range
    Set rStart = Selection
    Selection.FormatConditions.Add Type:=xlTextString, String:="Effective", _
        TextOperator:=xlContains
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Font
        .Bold = True
        .Italic = False
        .Color = -11489280
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    Selection.FormatConditions.Add Type:=xlTextString, String:="Not effective", _
        TextOperator:=xlContains
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Font
        .Bold = True
        .Italic = False
        .Color = -16776961
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
End Sub

В данном примере написаны исходные коды VBA-макросов для проверки ячеек на наличие выпадающих списков (или любых средств, созданных инструментом «проверка данных»). А также код макроса для проверки и получения доступа к ячейкам, которые содержат условное форматирование.

Макрос поиска ячейки с выпадающим списком

Допустим у нас имеется таблица Excel сформированная в результате экспорта журнала фактур из истории взаиморасчетов с клиентами фирмы, как показано ниже на рисунке:

Таблица с выпадающими списками.

Нам необходимо найти все выпадающие списки или определить каким ячейкам присвоена проверка вводимых данных, создана инструментом: «ДАННЫЕ»-«Работа с данными»-«Проверка данных».

Проверка данных.

В программе Excel по умолчанию есть встроенный инструмент для поиска ячеек с проверкой правил вводимых значений. Чтобы его использовать следует выбрать: ГЛАВНАЯ»-«Редактирование»-«Найти и выделить»-«Выделить группу ячеек». В появившемся диалоговом окне следует отметить опцию «проверка данных» и нажать на кнопку ОК.
Выделить группу ячеек.
Но как всегда более гибким решением является написание своего специального макроса. Ведь в такие случаи всегда можно усовершенствовать инструмент и дописать много других полезных функций. А этот код макроса послужит прекрасным началом программы.

Откройте редактор макросов Visual Basic (ALT+F11) и создайте новый модуль выбрав в редакторе инструмент: «Insert»-«Module». В созданный модуль введите VBA код макроса:

Sub ProvDan()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
On Error Resume Next
   For i = 1 To diapaz1.Count
     If IsError(diapaz1(i).Validation.Type) Then
       Else
       If diapaz2 Is Nothing Then
       Set diapaz2 = diapaz1(i)
       Else
       Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
       End If
     End If
   Next
On Error GoTo 0
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной ячейки!"
Else
  diapaz2.Select
  MsgBox "Найдено: " & diapaz2.Count & " ячеек!"
End If
End Sub

Visual Basic ALT+F11.

Если нужно выделить все ячейки в таблице, которые содержат проверку вводимых значений включенной инструментом «Проверка данных», тогда выберите инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«ProvDan»-«Выполнить».

В результате выделились 14 ячеек в столбце G, для которых включена проверка данных в стиле выпадающего списка:

Проверка данных.

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

Cells.Select

После, определяем диапазон ячеек на листе, который использует исходная таблица и с которыми будет работать наш макрос. Чтобы определить диапазон таблицы на рабочем листе Excel, мы могли бы использовать свойство UsedRange при создании экземпляра объекта Range в переменной diapaz1. Данное свойство охватывает только непустые ячейки, а это может быть даже несмежный диапазон. Но таблица может содержать пустые ячейки для, которых присвоена проверка ввода значений. Чтобы наш макрос не игнорировал пустые ячейки внутри таблицы мы определяем смежный (неразрывный) диапазон, который начинается с ячейки A1 и заканчивается последней используемой ячейкой на рабочем листе Excel.

Set diapaz1 = Application.Range(ActiveSheet.Range(«A1»), ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))

Последняя ячейка находиться наиболее отдаленно от ячейки A1 (в данном примере – это G15) и была использована на листе (это обязательное условие). При чем использована в прямом смысле, она может даже не содержать значения, но иметь измененный числовой формат, другой цвет фона, другие границы, объединение и т.п. Чтобы найти последнюю используемую ячейку на листе стандартными средствами Excel, выберите инструмент: «ГЛАВНАЯ»-«Редактирование»-«Найти и выделить»-«Выделить группу ячеек».

Ячейки с выпадающими списками.

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

Можно даже при создании экземпляра объекта Range в переменной diapaz1 использовать диапазон целого листа. Для этого просто замените выше описанную инструкцию на:

Set diapaz1 = Selection

Так на первый взгляд даже проще, но тогда макрос будет проверять все ячейки на листе и потребует больше ресурсов. Особенно если мы при изменении этой инструкции не удалим инструкцию выделения всех ячеек на листе Excel. Таким кодом макроса, можно существенно снизить производительность работы программы Excel при его выполнении. Поэтому так делать не рекомендуется. Проверяйте ячейки только те, которые были использованы на листе. Так вы получите в десятки раз меньший диапазон и выше производительность макроса.

Далее в коде макроса перед циклом прописана инструкция для выключения обработки ошибок, выполняемых в коде.

On Error Resume Next

Но после конца цикла обработка ошибок снова включается.

On Error GoTo 0

Внутри цикла проверяться по отдельности все ячейки на наличие включенной проверки вводимых значений инструментом «Проверка данных». Если ячейка содержит проверку вводимых значений?

If IsError(diapaz1(i).Validation.Type) Then

Тогда она присоединяется к диапазону ячеек, находящихся в переменной diapaz2.

Set diapaz2 = Application.Union(diapaz2, diapaz1(i))

В конце кода выделяется несмежный диапазон переменной diapaz2, который включает в себя все выпадающие списки на текущем рабочем листе Excel. И сразу же выводиться сообщение о количестве найденных и выделенных ячеек в этом же диапазоне.

MsgBox «Найдено: » & diapaz2.Count & » ячеек!»



Макрос поиска ячейки с условным форматированием

Некоторые ячейки в исходной таблице содержат условное форматирование, а пользователю Excel необходимо их все найти и выделить. Очень часто нельзя визуально определить присвоено ли ячейке условное форматирование или нет. Чтобы найти и выделить ячейки с условным форматированием в Excel можно воспользоваться встроенным инструментом. Просто необходимо выбрать опцию в меню: «ГЛАВНАЯ»-«Редактирование»-«Найти и выделить»-«Выделить группу ячеек».

В появившемся окне отмечаем опцию «условные форматы» и нажимаем кнопку ОК.

Но если мы хотим получить доступ к каждой выделенной ячейки и проделать с ними какие-либо операции, тогда следует воспользоваться более гибким инструментом. А конкретнее написать макрос. В данном примере мы напишем макрос, который будет автоматически выделять и считать количество ячеек с условным форматированием.

Снова откройте редактор Visual Basic (ALT+F11) и в уже созданный модуль добавьте новый код для нового макроса:

Sub ProvFormat()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
   For i = 1 To diapaz1.Count
     If diapaz1(i).FormatConditions.Count > 0 Then
       If diapaz2 Is Nothing Then
       Set diapaz2 = diapaz1(i)
       Else
       Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
       End If
     End If
   Next
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной ячейки!"
Else
  diapaz2.Select
  MsgBox "Найдено: " & diapaz2.Count & " ячеек!"
End If
End Sub

Теперь чтобы проверить, посчитать и выделить все ячейки для которых было применено любое условное форматирование запустите макрос: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«ProvFormat»-«Выполнить».

В результате будут выделены все соответствующие ячейки и отобразиться сообщение с информацией о их количестве:

Диапазон с условным форматированием.

В этом макросе уже нет необходимости отключать контроль ошибок в процессе выполнения инструкций внутри цикла.

Проверка ячеек на наличие условного форматирования выполняется с помощью свойства Cuont для объекта FormatConditions. Если данное свойство возвращает значение 0, то для текущей ячейки не применялось ни одно условное форматирование.

If diapaz1(i).FormatConditions.Count > 0 Then

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

Группа: Проверенные

Ранг: Обитатель

Сообщений: 341


Репутация:

0

±

Замечаний:
60% ±


Excel 2013

здравствуйте Pelena,
вся проблема в том что при применении макроса вставки строк (копирования либо вставки шаблонов с другого листа почему то сбиваются форматы ячеек) там где даты- вместо 22.08.2020 заменяет 8.4.20 там где числа — денежный формат где просто красным выделяются отрицательные значения — пишет отрмицательные красным но в скобках…..как победить? в чем проблема-может есть настройки какие ? думал победить УФ

макрорекордером когда применяются Select и Activate другие макросы тупят….применил решение бороды для тех ячеек что цветом выделяются а вот для того что бы даты и числа победить не допедриваю…..

Понравилась статья? Поделить с друзьями:
  • Макрос для удаления строк по значению в excel
  • Макрос для удаления строк в excel по условию макрос
  • Макрос для удаления стилей в excel
  • Макрос для удаления скрытых имен в excel
  • Макрос для удаления пустых столбцов excel