Условие excel vba по цвету

На работе столкнулся с такой задачей — имеется таблица в Excel, в которой ведется табель выходов рабочих в цеху.

В таблице подсчитывается количество часов, фактически отработанных; часов переработки и часов сверх нормы. Так вот, необходимо сделать так, чтобы производилась автоматическая выборка ячеек таблицы по цвету заливки последних.

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

Чтобы было понятнее, приведу изображение подобной таблицы. В ней необходимо произвести подсчет ячеек с заливкой зеленого цвета:

Табель выходов с зелеными ячейками

В Excel нет встроенных (готовых) инструментов для выборки подобного рода; можно отбирать ячейки только по одному условию — по значению, находящемуся в них. Поэтому решение задачи получалось только одно — через VBA (пользовательские функции).

Прекрасное и готовое решение моей задачи я нашел на сайте http://www.excel-vba.ru/. Даже не одно, а целых два решения, под разные условия. Ниже привожу последовательность шагов, которые привели меня к успеху.

Сразу скажу, что изображения были сделаны в Excel 2007. В Excel 2010 все несколько по другому, но запутаться невозможно, если что.

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

Переходим в “Пуск — Параметры Excel” и находим в левом списке пункт “Надстройки”:

Excel - надстройка VBA

Выбираем в основном окне строчку “Пакет анализа — VBA” и жмем кнопочку “Перейти” в самом низу окна. Откроется еще одно окошко со списком доступных под Excel расширений (надстроек). Снова выбираем в этом списке “Пакет анализа — VBA” и соглашаемся, что хотим установить его, нажав кнопку “ОК”:

Excel - Пакет анализа VBA

Потребуется установочный диск с Microsoft Office на нем (или же подключение к Интернет) чтобы программа получила необходимые пакеты для инсталляции. Если установка прошла успешно, то в “Ленте” появиться пункт “Разработчик” (Excel 2010). Можно перейти в него через эту панель или же с помощью сочетания клавиш Alt + F11.

Появиться окно, в котором выполняется написание кода на языке VBA, то есть фактически создаются пользовательские функции. Я писать их не буду, так как языка VBA не знаю и знать особого желания нет (все знать невозможно).

Вставка готовых функций в Excel VBA

Но есть готовые решения, которые я вставлю в виде кода с помощью меню “Insert — Module”. Просто берем отсюда код функций и вставляем в свой Excel. Затем сохраняем файл Excel с поддержкой VBA (макросов) и все готово для дальнейшей работы.

Вставленные функции появятся в списке формул таблицы:

Excel - пользовательские функции

Ниже представлен готовый код двух функций на VBA, написанных их автором Дмитрием Щербаковым. Первая функция с именем “CountByInteriorColor” выполняет подсчет количества ячеек по цвету заливки.

Вторая функция с именем “SumByInteriorColor” выполняет выборку ячеек по цвету заливки и суммирует все значения в этих ячейках.

Обе функции имеют одинаковый синтаксис и принимают три входных аргумента, первые два из которых обязательные, а третий — необязательный:


  • 1
    
    rRange
    

    — диапазон с ячейками для подсчета


  • 1
    
    rColorCell
    

    — ячейка-образец с цветом заливки


  • 1
    
    bSumHide
    

    1
    
    ИСТИНА
    

    или

    1
    
    1
    

    учитывает скрытые ячейки;

    1
    
    ЛОЖЬ
    

    ,

    1
    
    0
    

    или опущен(по умолчанию) — скрытые ячейки не подсчитываются.

Функция подсчета количества ячеек

'---------------------------------------------------------------------------------------
' Procedure : CountByInteriorColor
' Author    : The_Prist(Щербаков Дмитрий)
'             http://www.excel-vba.ru
' Purpose   : Функция подсчета ячеек на основе цвета заливки.
' Аргументы:
'             rRange     - диапазон с ячейками для подсчета.
'             rColorCell - ячейка-образец с цветом заливки.
'             bSumHide   - ИСТИНА или 1 учитывает скрытые ячейки.
'                          ЛОЖЬ, 0 или опущен(по умолчанию) - скрытые ячейки не подсчитываются.
'---------------------------------------------------------------------------------------
Function CountByInteriorColor(rRange As Range, rColorCell As Range, Optional bSumHide As Boolean = False)
  Dim lColor As Long, rCell As Range, lCnt As Long, vVal
  lColor = rColorCell.Interior.Color
  For Each rCell In rRange
      If rCell.Interior.Color = lColor Then
          If rCell.EntireRow.Hidden Or rCell.EntireColumn.Hidden Then
              If bSumHide Then lCnt = lCnt + 1
          Else
              lCnt = lCnt + 1
          End If
      End If
  Next rCell
  CountByInteriorColor = lCnt
End Function

Синтаксис этой функции прост:

=CountByInteriorColor(D8:AG8;$E$65)

Функция подсчета суммы ячеек

'---------------------------------------------------------------------------------------
' Procedure : SumByInteriorColor
' Author    : The_Prist(Щербаков Дмитрий)
'             http://www.excel-vba.ru
' Purpose   : Функция суммирования ячеек на основе цвета заливки.
' Аргументы:
'             rRange     - диапазон с ячейками для суммирования.
'             rColorCell - ячейка-образец с цветом заливки.
'             bSumHide   - ИСТИНА или 1 учитывает скрытые ячейки.
'                          ЛОЖЬ, 0 или опущен(по умолчанию) - скрытые ячейки не суммируются.
'---------------------------------------------------------------------------------------
Function SumByInteriorColor(rRange As Range, rColorCell As Range, Optional bSumHide As Boolean = False)
  Dim lColor As Long, rCell As Range, dblSum As Double, vVal
  lColor = rColorCell.Interior.Color
  For Each rCell In rRange
      If rCell.Interior.Color = lColor Then
          vVal = rCell.Value
          If IsNumeric(vVal) Then
              If rCell.EntireRow.Hidden Or rCell.EntireColumn.Hidden Then
                  If bSumHide Then dblSum = dblSum + vVal
              Else
                  dblSum = dblSum + vVal
              End If
          End If
      End If
  Next rCell
  SumByInteriorColor = dblSum
End Function

Синтаксис этой функции следующий:

=SumByInteriorColor(D8:AG37;E63)

При вставке пользовательской функции “CountByInteriorColor” и “SumByInteriorColor” можно воспользоваться либо “Мастером функций”, либо произвести указание диапазона ячеек и ячейку-критерий вручную.

Описание рабочей формулы

Готовый пример работы функции “CountByInteriorColor” можно посмотреть на рисунке “Табель выходов с зелеными ячейками”. В нем подсчет отработанного времени производится по следующей формуле:

=((Сумма фактически отработанных часов) - (Норма часов выхода за месяц)) + ((Кол-во дней с переработкой)*4)

Фактически эта формула получается такой (смотри строку №13 на рисунке):

=(AH13-AI13) + (CountByInteriorColor(D13:AG13;$E$65)*4)

Думаю, что больше сказать по поводу создания (точнее — вставки готового решения) пользовательских функций и способа выборки ячеек в таблице по цвету их заливки мне нечего.


У Вас лишняя буква r прицепилась :)

.Interior.Color = vbRed 
.Interior.Color = RGB(255, 0, 0)
.Interior.Color = 255

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

     Sub PaintCells()
            Dim r1 As Range, r2 As Range
            Dim c As Range
                Set r1 = Range("A1:C10") ' диапазон в переменную
                r1.Interior.Pattern = xlNone ' убираем заливку
'               r1.Interior.ColorIndex = 0 ' или так 

                For Each c In r1 ' цикл по ячейкам диапазона
                    If c.Value = 25 Then ' если условие выполняется
                        If r2 Is Nothing Then '  диапазон еще пустой
                            Set r2 = c ' формируем диапазон
                        Else
                            Set r2 = Union(r2, c) ' пополняем диапазон
                        End If
                    End If
                Next c

                If Not r2 Is Nothing Then r2.Interior.Color = 255 ' заливаем
                Set r1 = Nothing: Set r2 = Nothing ' освобождаем память
            End Sub

Залить строки по условию в ячейке:

For i = 1 To r1.Rows.Count ' цикл по строкам диапазона
    If r1(i, 1).Value = 25 Then ' если левая ячейка диапазона...
        If r2 Is Nothing Then '  диапазон еще пустой
            Set r2 = Range(Cells(i, 1), Cells(i, 3)) ' формируем диапазон
        Else
            Set r2 = Union(r2, Range(Cells(i, 1), Cells(i, 3))) ' пополняем диапазон
        End If
    End If
Next i

Вычисления по цвету ячеек

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

Чтобы исправить этот существенный недостаток можно использовать несложные пользовательские макрофункции на Visual Basic, которые позволят нам суммировать/подсчитывать количество/среднее арифметическое ячеек с определенным цветом заливки/шрифта.

На вкладке Разработчик (Developer) нажмите кнопку Visual Basic или сочетание клавиш Alt+F11, чтобы открыть редактор макросов. Если такой вкладки у вас не видно, то включите ее в настройках Файл — Параметры — Настройка ленты (File — Options — Customize Ribbon).

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

Function CountByColor(DataRange As Range, ColorSample As Range) As Long
    Dim cell As Range, n As Long
    
    For Each cell In DataRange
        If cell.Interior.Color = ColorSample.Interior.Color Then n = n + 1
    Next cell
    CountByColor = n
End Function

Function SumByColor(DataRange As Range, ColorSample As Range) As Double
    Dim cell As Range, total As Double
    
    For Each cell In DataRange
        If IsNumeric(cell) And cell.Interior.Color = ColorSample.Interior.Color Then total = total + cell.Value
    Next cell
    SumByColor = total
End Function

Function AverageByColor(DataRange As Range, ColorSample As Range) As Double
    Dim cell As Range, total As Double, n As Long
    
    For Each cell In DataRange
        If IsNumeric(cell) And cell.Interior.Color = ColorSample.Interior.Color Then
            total = total + cell.Value
            n = n + 1
        End If
    Next cell
    AverageByColor = total / n
End Function
 

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

  • DataRange — диапазон исходных ячеек с числами, раскрашенных в разные цвета
  • ColorSample — ячейка, цвет заливки которой мы берём за образец

Если теперь вернуться в Excel, то в Мастере функций (вкладка Формулы — кнопка Вставить функцию) в появившейся там категории Определенные пользователем (User Defined) можно найти наши функции и вставить их на лист. Либо напрямую ввести их в строку формул, как любые другие функции Excel:

Сумма, количество и среднее ячеек с заданным цветом заливки

Добавление условий

Аналогичный подход можно легко масштабировать, добавляя, при необходимости, дополнительные условия в проверку (команда if … then…). Так, например, если нам нужно при вычислении среднего арифметического учитывать не только цвет заливки, но и цвет шрифта (т.е. считать не просто жёлтые, а именно жёлто-красные ячейки), то код нашей макро-функции будет выглядеть так:

 Function AverageByColor2(DataRange As Range, ColorSample As Range) As Double
    Dim cell As Range, total As Double, n As Long
    
    For Each cell In DataRange
        If IsNumeric(cell) And cell.Interior.Color = ColorSample.Interior.Color And cell.Font.Color = ColorSample.Font.Color Then
            total = total + cell.Value
            n = n + 1
        End If
    Next cell
    AverageByColor2 = total / n
End Function

Разница только в добавленном через логическую связку «И» (and) условии на проверку соответствия цвета шрифта очередной проверяемой ячейки cell.Font.Color цвету шрифта ячейки-образца ColorSample.Font.Color.

Ограничения и нюансы пересчёта

У созданных нами макрофункций есть 2 важных нюанса.

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

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

Полностью решить эту проблему невозможно, но есть несколько способов её обойти:

  • Сделать двойной щелчок левой кнопкой мыши по ячейки с нашей формулой и нажать на Enter, т.е. имитировать повторный ввод функции в ячейку — Excel её заново пересчитает и выдаст обновленный результат.
  • Можно использовать сочетание клавиш Ctrl+Alt+F9, которое принудительно заставит Excel пересчитать всё формулы и функции независимо от того, изменились ли для них исходные данные. Но это сочетание нужно будет не забывать нажимать каждый раз при изменении исходных данных.
  • Добавить в код наших макрофункций (в любое место) команду Application.Volatile True. Эта команда языка Visual Basic заставляет Excel пересчитывать результаты нашей функции при изменении любой ячейки на листе (или по нажатию  F9). Однако, в этом случае, скорость работы наших функций заметно снизится, т.к. их пересчёт будет происходить постоянно — даже когда мы не меняли цвета или значения ячеек в исходных данных. Пользуйтесь этим методом осторожно.

И помните о том, что наша функция перебирает все (и пустые тоже) ячейки в диапазоне DataRange и не задавайте в качестве первого аргумента целый столбец — «думать» будет долго :)

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

  • Сортировка строк по цвету
  • Функции подсчета количества и суммы ячеек по цвету из надстройки PLEX
  • Что такое «ад условного форматирования» и как его победить

1 / 1 / 0

Регистрация: 12.02.2017

Сообщений: 52

1

Добавить текст ячейки в зависимости от цвета ячейки

12.02.2017, 12:30. Показов 8219. Ответов 16


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

Здравствуйте. Я не могу разобраться в написании формулы или макроса.
В определенном диапазоне ячеек требуется: в зависимости от цвета ячейки добавить текст с названием цвета в ячейку справа.
Количество цветов ячеек ограниченно.
То есть, если ячейка желтого цвета, то в ячейке справа должен появиться текст «желтый», если красного -«красный».

Нужен код для VBA excel.
HELP ME!!!



0



aequit

223 / 134 / 45

Регистрация: 08.09.2012

Сообщений: 283

Записей в блоге: 1

12.02.2017, 14:22

2

Visual Basic
1
if Range("A1").Interior.Color = 65535 Then Range("B1").Value = "Желтый"

Файл нужно прикладывать со своими наработками, что не получилось…
Почему именно VBA? Условным форматированием может удобнее было-бы…



0



Xiaohny

1 / 1 / 0

Регистрация: 12.02.2017

Сообщений: 52

13.02.2017, 11:46

 [ТС]

3

в ячейке D9 находиться пример цвета.

Visual Basic
1
2
3
4
5
Public Function examV(DataRange As Range)
     
     If DataRange.Interior.Color = Range("D9").Interior.Color Then Range("B1").Value = "желтый"
     
 End Function

Добавлено через 17 часов 20 минут

Цитата
Сообщение от aequit
Посмотреть сообщение

Visual Basic
1
if Range("A1").Interior.Color = 65535 Then Range("B1").Value = "Желтый"

Файл нужно прикладывать со своими наработками, что не получилось…
Почему именно VBA? Условным форматированием может удобнее было-бы…

Разве можно задать в словном форматировании условие определения цвета?
Формула, прикрепленная выше не работает, что может быть неправильным?



0



223 / 134 / 45

Регистрация: 08.09.2012

Сообщений: 283

Записей в блоге: 1

13.02.2017, 14:40

4

Да, условным форматированием данную задачу нельзя сделать (или я не знаю как)…

Вариант условия из первого поста «если ячейка желтого цвета, то в ячейке справа должен появиться текст «желтый», если красного -«красный» можно реализовать циклом по ячейкам из диапазона «справа» и в зависимости от результата в ячейках «слева» писать текст. Для этого в коде нужно запрограммировать соответствие 65535 = «Желтый» и т.д. Например, используя Select Case.
Прикладываю файл, там номера и названия цветов, может пригодится. Поэкспериментировал с цветами, формулой, как Вы хотели, не получается.
Больше мыслей нет.



0



Xiaohny

1 / 1 / 0

Регистрация: 12.02.2017

Сообщений: 52

13.02.2017, 16:33

 [ТС]

5

Изменил формулу, в результате в ячейке результат «#ЗНАЧ!»
Подозреваю, что неправильно указываю тип переменной, т.к. при использовании формулы цвета из ячеек D9 и D10, то результат #ЗНАЧ!, иначе пустая ячейка.
Что может быть не так в моей формуле?

Visual Basic
1
2
3
4
5
6
Public Function examV1(DataRange As Range, DataRange2 As Range) As String
 
     If DataRange.Interior.Color = Range("D9").Interior.Color Then DataRange2.Value = "желтый"
     If DataRange.Interior.Color = Range("D10").Interior.Color Then DataRange2.Value = "красный"
     
 End Function

Вложения

Тип файла: xlsx color-vba-2017.xlsm.xlsx (9.4 Кб, 14 просмотров)



0



es geht mir gut

11264 / 4746 / 1183

Регистрация: 27.07.2011

Сообщений: 11,437

13.02.2017, 16:38

6

Цитата
Сообщение от Xiaohny
Посмотреть сообщение

Что может быть не так в моей формуле?

А функции-то и нет.



0



1 / 1 / 0

Регистрация: 12.02.2017

Сообщений: 52

13.02.2017, 16:40

 [ТС]

7

Прикрепить файл с макросом не могу, пардоньте



0



3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,930

13.02.2017, 16:51

8

заархивируйте тогда прицепится.



0



1 / 1 / 0

Регистрация: 12.02.2017

Сообщений: 52

13.02.2017, 16:54

 [ТС]

9

Готово.
Функция examV1



0



Vlad999

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,930

13.02.2017, 16:58

10

Лучший ответ Сообщение было отмечено Xiaohny как решение

Решение

для начала так. файл не смотрел

Visual Basic
1
2
3
4
5
6
Public Function examV1(DataRange As Range) As String
 
     If DataRange.Interior.Color = Range("D9").Interior.Color Then examV1 = "æåëòûé"
     If DataRange.Interior.Color = Range("D10").Interior.Color Then examV1 = "êðàñíûé"
     
 End Function



2



1 / 1 / 0

Регистрация: 12.02.2017

Сообщений: 52

13.02.2017, 17:19

 [ТС]

11

Работает, спасибо!



0



aequit

223 / 134 / 45

Регистрация: 08.09.2012

Сообщений: 283

Записей в блоге: 1

13.02.2017, 17:20

12

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

Visual Basic
1
2
3
4
5
6
Public Function examV1(DataRange As Range) As String
   Select Case DataRange.Interior.Color
     Case Is = 65535: examV1 = "Желтый"
     Case Is = 255: examV1 = "Красный"
   End Select
 End Function



0



Xiaohny

1 / 1 / 0

Регистрация: 12.02.2017

Сообщений: 52

14.02.2017, 15:21

 [ТС]

13

Функция работает только при вводе вручную, но при автозаполнении результатов не дает.
В чем может быть проблема?

Visual Basic
1
2
3
4
5
6
Public Function examV2(DataRange As Range, DataRange1 As Range)
 
     If DataRange = "желтый" Then DataRange1.Interior.Color = Range("D9").Interior.Color
     If DataRange = "красный" Then DataRange1.Interior.Color = Range("D10").Interior.Color
     
 End Function



0



Vlad999

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,930

14.02.2017, 16:00

14

добавьте второй строкой

Visual Basic
1
Application.Volatile



0



1 / 1 / 0

Регистрация: 12.02.2017

Сообщений: 52

14.02.2017, 16:27

 [ТС]

15

Не работает



0



3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,930

14.02.2017, 17:52

16

вы опять не правильно пишите ф-цию. у вас в ф-ции должна быть строка examV2=….., а у вас её нет.



0



1062 / 506 / 137

Регистрация: 27.02.2013

Сообщений: 1,451

14.02.2017, 19:34

17

Лучший ответ Сообщение было отмечено Xiaohny как решение

Решение

Xiaohny, посмотрите файл.Я когда-то занимался подобной проблемой.Там я привел пример как вам надо используя функции ClosestRGBConstantColorName() и CellColor(),объединив их.
P.S. Названия цветов и их значения вбиваются в соответствующие массивы



2



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

14.02.2017, 19:34

Помогаю со студенческими работами здесь

Изменение цвета строки(ячейки) в зависимости от свойств реквизита спрв
Как в зависимости от свойств реквизита справочника,документа,ячейки таблицы значений можно…

Изменение цвета ячейки в таблице Excel в зависимости от сегодняшней даты
День добрый!! Подскажите пожалуйста, как настроить таблицу Эксель, что бы менялся цвет ячейки в…

Как задать значение для ячейки в зависимости от значения другой ячейки
Здравствуйте! Подскажите, как задать значение для ячейки в зависимости от значения другой ячейки….

Изменения формата ячейки Excel средствами VBA в зависимости от значения другой ячейки
Здравствуйте.
Столкнулся с проблемой. Необходимо на листе Excel Залить, предположим, ячейку "C4"…

Перенесение результатов ячейки в ячейку на другой лист, в зависимости от значения исходной ячейки
Добрый день, — прошу помощи экспертов! Есть такая таблица (в вложении).
Суть вопроса такова:
Есть…

Изменения формата ячейки в зависимости от значения другой ячейки
Здравствуйте, помогите решить такой вопрос.

Задача, которая в принципе решается средствами…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

17

Содержание

  • Условное форматирование Excel
  • Условное форматирование в VBA
  • Практическое использование условного форматирования в VBA
  • Простой пример создания условного формата для диапазона

Условное форматирование Excel позволяет определять правила, определяющие форматирование ячеек.

Например, вы можете создать правило, выделяющее ячейки, соответствующие определенным критериям. Примеры включают:

  • Числа, попадающие в определенный диапазон (например, меньше 0).
  • 10 первых пунктов списка.
  • Создание «тепловой карты».
  • «Формульные» правила практически для любого условного форматирования.

В Excel условное форматирование можно найти на ленте в разделе Главная> Стили (ALT> H> L).

Чтобы создать собственное правило, нажмите «Новое правило», и откроется новое окно:

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

Доступ ко всем этим функциям условного форматирования можно получить с помощью VBA.

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

Правила условного форматирования также сохраняются при сохранении рабочего листа.

Правила условного форматирования применяются конкретно к определенному листу и определенному диапазону ячеек. Если они нужны где-то еще в книге, то они также должны быть настроены на этом листе.

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

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

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

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

Кроме того, в необработанных импортированных данных вы можете выделить, где числа смехотворно велики или смехотворно малы. Импортируемый диапазон данных обычно имеет разный размер для каждого периода, поэтому вы можете использовать VBA для оценки размера нового диапазона данных и вставки условного форматирования только для этого диапазона.

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

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

Простой пример создания условного формата для диапазона

В этом примере настраивается условное форматирование для диапазона ячеек (A1: A10) на листе. Если число в диапазоне от 100 до 150, то цвет фона ячейки будет красным, в противном случае он не будет иметь цвета.

1234567891011121314 Sub ConditionalFormattingExample ()‘Определить диапазонDim MyRange As RangeУстановите MyRange = Range («A1: A10»)‘Удалить существующее условное форматирование из диапазонаMyRange.FormatConditions.Delete‘Применить условное форматированиеMyRange.FormatConditions.Add Тип: = xlCellValue, оператор: = xlBetween, _Formula1: = «= 100», Formula2: = «= 150″MyRange.FormatConditions (1) .Interior.Color = RGB (255, 0, 0)Конец подписки

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

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

Цвета представлены числовыми значениями. Для этого рекомендуется использовать обозначение RGB (красный, зеленый, синий). Для этого можно использовать стандартные цветовые константы, например. vbRed, vbBlue, но вы можете выбрать один из восьми цветов.

Доступно более 16,7 млн ​​цветов, и с помощью RGB можно получить доступ ко всем. Это намного проще, чем пытаться вспомнить, какое число соответствует какому цвету. Каждый из трех номеров цветов RGB составляет от 0 до 255.

Обратите внимание, что параметр «xlBetween» является включительным, поэтому значения ячеек 100 или 150 будут удовлетворять условию.

Многовариантное форматирование

Вы можете настроить несколько условных правил в пределах своего диапазона данных, чтобы все значения в диапазоне охватывались разными условиями:

12345678910111213141516171819 Sub MultipleConditionalFormattingExample ()Dim MyRange As Range’Создать объект диапазонаУстановите MyRange = Range («A1: A10»)’Удалить предыдущие условные форматыMyRange.FormatConditions.Delete’Добавить первое правилоMyRange.FormatConditions.Add Тип: = xlCellValue, оператор: = xlBetween, _Formula1: = «= 100», Formula2: = «= 150″MyRange.FormatConditions (1) .Interior.Color = RGB (255, 0, 0)’Добавить второе правилоMyRange.FormatConditions.Add Тип: = xlCellValue, оператор: = xlLess, _Formula1: = «= 100″MyRange.FormatConditions (2) .Interior.Color = vbBlue’Добавить третье правилоMyRange.FormatConditions.Add Тип: = xlCellValue, оператор: = xlGreater, _Formula1: = «= 150″MyRange.FormatConditions (3) .Interior.Color = vbYellowКонец подписки

В этом примере устанавливается первое правило, как и раньше, с красным цветом ячейки, если значение ячейки находится в диапазоне от 100 до 150.

Затем добавляются еще два правила. Если значение ячейки меньше 100, то цвет ячейки синий, а если больше 150, то цвет ячейки желтый.

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

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

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

1234567891011121314151617181920212223 Sub MultipleConditionalFormattingExample ()Dim MyRange As Range’Создать объект диапазонаУстановите MyRange = Range («A1: A10»)’Удалить предыдущие условные форматыMyRange.FormatConditions.Delete’Добавить первое правилоMyRange.FormatConditions.Add Тип: = xlExpression, Formula1: = _»= LEN (TRIM (A1)) = 0″MyRange.FormatConditions (1) .Interior.Pattern = xlNone’Добавить второе правилоMyRange.FormatConditions.Add Тип: = xlCellValue, оператор: = xlBetween, _Formula1: = «= 100», Formula2: = «= 150″MyRange.FormatConditions (2) .Interior.Color = RGB (255, 0, 0)’Добавить третье правилоMyRange.FormatConditions.Add Тип: = xlCellValue, оператор: = xlLess, _Formula1: = «= 100″MyRange.FormatConditions (3) .Interior.Color = vbBlue’Добавить четвертое правилоMyRange.FormatConditions.Add Тип: = xlCellValue, оператор: = xlGreater, _Formula1: = «= 150″MyRange.FormatConditions (4) .Interior.Color = RGB (0, 255, 0)Конец подписки

При этом используется тип xlExpression, а затем используется стандартная формула Excel, чтобы определить, является ли ячейка пустой, а не числовым значением.

Объект FormatConditions является частью объекта Range. Он действует так же, как коллекция с индексом, начинающимся с 1. Вы можете перебирать этот объект, используя цикл For… Next или For… Each.

Удаление правила

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

12345678910111213 Sub DeleteConditionalFormattingExample ()Dim MyRange As Range’Создать объект диапазонаУстановите MyRange = Range («A1: A10»)’Удалить предыдущие условные форматыMyRange.FormatConditions.Delete’Добавить первое правилоMyRange.FormatConditions.Add Тип: = xlCellValue, оператор: = xlBetween, _Formula1: = «= 100», Formula2: = «= 150″MyRange.FormatConditions (1) .Interior.Color = RGB (255, 0, 0)’Удалить правилоMyRange.FormatConditions (1) .DeleteКонец подписки

Этот код создает новое правило для диапазона A1: A10, а затем удаляет его. Вы должны использовать правильный номер индекса для удаления, поэтому проверьте «Управление правилами» в интерфейсе Excel (это покажет правила в порядке выполнения), чтобы убедиться, что вы получили правильный номер индекса. Обратите внимание, что в Excel нет возможности отмены, если вы удаляете правило условного форматирования в VBA, в отличие от того, если вы делаете это через интерфейс Excel.

Изменение правила

Поскольку правила представляют собой набор объектов на основе указанного диапазона, вы можете легко вносить изменения в определенные правила с помощью VBA. Фактические свойства после добавления правила доступны только для чтения, но вы можете использовать метод Modify для их изменения. Доступны для чтения / записи такие свойства, как цвета.

123456789101112131415 Sub ChangeConditionalFormattingExample ()Dim MyRange As Range’Создать объект диапазонаУстановите MyRange = Range («A1: A10»)’Удалить предыдущие условные форматыMyRange.FormatConditions.Delete’Добавить первое правилоMyRange.FormatConditions.Add Тип: = xlCellValue, оператор: = xlBetween, _Formula1: = «= 100», Formula2: = «= 150″MyRange.FormatConditions (1) .Interior.Color = RGB (255, 0, 0)’Изменить правилоMyRange.FormatConditions (1) .Modify xlCellValue, xlLess, «10»‘Изменить цвет правилаMyRange.FormatConditions (1) .Interior.Color = vbGreenКонец подписки

Этот код создает объект диапазона (A1: A10) и добавляет правило для чисел от 100 до 150. Если условие истинно, цвет ячейки меняется на красный.

Затем код изменяет правило на числа меньше 10. Если условие истинно, цвет ячейки теперь меняется на зеленый.

Использование градуированной цветовой схемы

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

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

1234567891011121314151617181920212223242526272829 Sub GraduatedColors ()Dim MyRange As Range’Создать объект диапазонаУстановите MyRange = Range («A1: A10»)’Удалить предыдущие условные форматыMyRange.FormatConditions.Delete’Определить тип шкалыMyRange.FormatConditions.AddColorScale ColorScaleType: = 3’Выберите цвет для наименьшего значения в диапазонеMyRange.FormatConditions (1) .ColorScaleCriteria (1) .Type = _xlConditionValueLowestValueС MyRange.FormatConditions (1) .ColorScaleCriteria (1) .FormatColor.Color = 7039480.Конец с’Выберите цвет для средних значений в диапазонеMyRange.FormatConditions (1) .ColorScaleCriteria (2) .Type = _xlConditionValuePercentileMyRange.FormatConditions (1) .ColorScaleCriteria (2) .Value = 50’Выберите цвет для средней точки диапазонаС MyRange.FormatConditions (1) .ColorScaleCriteria (2) .FormatColor.Color = 8711167.Конец с’Выберите цвет для максимального значения в диапазонеMyRange.FormatConditions (1) .ColorScaleCriteria (3) .Type = _xlConditionValueHighestValueС MyRange.FormatConditions (1) .ColorScaleCriteria (3) .FormatColor.Color = 8109667.Конец сКонец подписки

Когда этот код запускается, он будет градуировать цвета ячеек в соответствии с возрастающими значениями в диапазоне A1: A10.

Это очень впечатляющий способ отображения данных, который наверняка привлечет внимание пользователей.

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

Когда у вас огромный объем данных, вы можете легко пропустить значение ошибки в различных таблицах. Если это будет представлено пользователю без разрешения, это может привести к большим проблемам, и пользователь потеряет уверенность в цифрах. Это использует тип правила xlExpression и функцию Excel IsError для оценки ячейки.

Вы можете создать код, чтобы все ячейки с ошибками имели красный цвет:

1234567891011 Sub ErrorConditionalFormattingExample ()Dim MyRange As Range’Создать объект диапазонаУстановите MyRange = Range («A1: A10»)’Удалить предыдущие условные форматыMyRange.FormatConditions.Delete’Добавить правило ошибкиMyRange.FormatConditions.Add Тип: = xlExpression, Formula1: = «= IsError (A1) = true»‘Установить красный цвет салона.MyRange.FormatConditions (1) .Interior.Color = RGB (255, 0, 0)Конец подписки

Условное форматирование дат в прошлом

У вас могут быть импортированные данные там, где вы хотите выделить даты, которые были в прошлом. Примером этого может быть отчет по дебиторам, в котором вы хотите выделить любые старые даты в счетах-фактурах старше 30 дней.

Этот код использует тип правила xlExpression и функцию Excel для оценки дат.

1234567891011 Подложка DateInPastConditionalFormattingExample ()Dim MyRange As Range’Создать объект диапазона на основе столбца датУстановите MyRange = Range («A1: A10»)’Удалить предыдущие условные форматыMyRange.FormatConditions.Delete’Добавить правило ошибки для прошлых датMyRange.FormatConditions.Add Тип: = xlExpression, Formula1: = «= Now () — A1> 30″‘Установить красный цвет салона.MyRange.FormatConditions (1) .Interior.Color = RGB (255, 0, 0)Конец подписки

Этот код принимает диапазон дат в диапазоне A1: A10 и устанавливает красный цвет ячейки для любой даты, прошедшей более 30 дней.

В формуле, используемой в условии, Now () указывает текущую дату и время. Это будет продолжать пересчитывать каждый раз, когда рабочий лист пересчитывается, поэтому форматирование будет меняться от одного дня к другому.

Использование панелей данных в условном форматировании VBA

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

123456 Sub DataBarFormattingExample ()Dim MyRange As RangeУстановите MyRange = Range («A1: A10»)MyRange.FormatConditions.DeleteMyRange.FormatConditions.AddDatabarКонец подписки

Ваши данные на листе будут выглядеть так:

Использование значков в условном форматировании VBA

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

12345678910111213141516171819202122232425 Sub IconSetsExample ()Dim MyRange As Range’Создать объект диапазонаУстановите MyRange = Range («A1: A10»)’Удалить предыдущие условные форматыMyRange.FormatConditions.Delete’Добавить набор иконок в объект FormatConditionsMyRange.FormatConditions.AddIconSetCondition’Установите набор иконок в стрелки — условие 1С MyRange.FormatConditions (1).IconSet = ActiveWorkbook.IconSets (xl3Arrows)Конец с’установить критерии значка для требуемого процентного значения — условие 2С MyRange.FormatConditions (1) .IconCriteria (2).Type = xlConditionValuePercent.Значение = 33.Operator = xlGreaterEqualКонец с’установить критерии значка для требуемого процентного значения — условие 3С MyRange.FormatConditions (1) .IconCriteria (3).Type = xlConditionValuePercent.Значение = 67.Operator = xlGreaterEqualКонец сКонец подписки

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

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

Вы можете использовать код VBA, чтобы выделить 5 первых чисел в диапазоне данных. Вы используете параметр под названием «AddTop10», но вы можете настроить номер ранга в коде на 5. Пользователь может захотеть увидеть самые высокие числа в диапазоне без предварительной сортировки данных.

1234567891011121314151617181920212223 Sub Top5Example ()Dim MyRange As Range’Создать объект диапазонаУстановите MyRange = Range («A1: A10»)’Удалить предыдущие условные форматыMyRange.FormatConditions.Delete’Добавить условие Top10MyRange.FormatConditions.AddTop10С MyRange.FormatConditions (1)’Установить параметр сверху вниз.TopBottom = xlTop10Top’Установить только топ 5.Ранг = 5Конец сС MyRange.FormatConditions (1) .Font’Установить цвет шрифта.Color = -16383844.Конец сС MyRange.FormatConditions (1) .Interior’Установить цвет фона ячейки.Color = 13551615Конец сКонец подписки

Данные на вашем листе после запуска кода будут выглядеть так:

Обратите внимание, что значение 145 появляется дважды, поэтому выделяются шесть ячеек.

Значение параметров StopIfTrue и SetFirstPriority

StopIfTrue имеет значение, если диапазон ячеек имеет несколько правил условного форматирования. Одиночная ячейка в пределах диапазона может удовлетворять первому правилу, но также может удовлетворять последующим правилам. Как разработчик, вы можете захотеть, чтобы форматирование отображалось только для первого правила. Другие критерии правила могут перекрываться и вносить непреднамеренные изменения, если им разрешено продолжить работу по списку правил.

По умолчанию для этого параметра установлено значение True, но вы можете изменить его, если хотите, чтобы учитывались все остальные правила для этой ячейки:

1 MyRange. FormatConditions (1) .StopIfTrue = False

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

1 MyRange. FormatConditions (1) .SetFirstPriority

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

Вы можете изменить приоритет правила:

1 MyRange. FormatConditions (1) .Priority = 3

Это изменит относительное положение любых других правил в списке условного формата.

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

Это то, чего нельзя сделать с помощью условного форматирования Excel. Однако для этого вы можете создать свой собственный код VBA.

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

Следующий код выполнит поиск по вашему списку чисел, отыщет в соседней ячейке форматирование текста, а затем отформатирует число, как требуется:

123456789101112131415161718192021 Sub ReferToAnotherCellForConditionalFormatting ()’Создайте переменные для хранения количества строк для табличных данныхDim Row as long, N as long’Захватить количество строк в диапазоне табличных данныхRRow = ActiveSheet.UsedRange.Rows.Count’Перебрать все строки в диапазоне табличных данныхДля N = 1 в ряд’Используйте оператор Select Case для оценки форматирования на основе столбца 2Выберите Case ActiveSheet.Cells (N, 2) .Value.’Преврати цвет салона в синийКорпус «Синий»ActiveSheet.Cells (N, 1) .Interior.Color = vbBlue’Преврати цвет салона в красныйКейс «Красный»ActiveSheet.Cells (N, 1) .Interior.Color = vbRed’Преврати цвет салона в зеленыйКорпус «Зеленый»ActiveSheet.Cells (N, 1) .Interior.Color = vbGreenКонец ВыбратьСледующий NКонец подписки

После того, как этот код был запущен, ваш рабочий лист теперь будет выглядеть так:

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

Операторы, которые можно использовать в операторах условного форматирования

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

Существует ряд этих операторов, которые можно использовать в зависимости от того, как вы хотите указать критерии правила.

Имя Ценить Описание
xlBetween 1 Между. Может использоваться только при наличии двух формул.
xlEqual 3 Равный.
xlGreater 5 Больше чем.
xlGreaterEqual 7 Больше или равно.
xl Меньше 6 Меньше, чем.
xlLessEqual 8 Меньше или равно.
xlNotBetween 2 Не между. Может использоваться только при наличии двух формул.
xlNotEqual 4 Не равный.

Понравилась статья? Поделить с друзьями:
  • Усиленный фильтр в excel это
  • Уроки по информатике что такое таблица excel
  • Условие case vba excel
  • Уроки сводных таблиц в excel
  • Уроки по информатике на тему текстовый редактор word