Перейти к содержимому

VBA Excel. Цвет ячейки (заливка, фон)

Заливка ячейки цветом в VBA Excel. Фон ячейки. Свойства .Interior.Color и .Interior.ColorIndex. Цветовая модель RGB. Стандартная палитра из 56 цветов. Предопределенные константы.

  1. Свойство .Interior.Color объекта Range
  2. Свойство .Interior.ColorIndex объекта Range

Свойство .Interior.Color объекта Range

Начиная с Excel 2007 основным способом заливки диапазона или отдельной ячейки цветом (зарисовки, добавления, изменения фона) является использование свойства .Interior.Color объекта Range путем присваивания ему значения цвета в виде десятичного числа от 0 до 16777215 (всего 16777216 цветов).

Заливка ячейки цветом в VBA Excel

Пример кода 1:

Sub ColorTest1()
Range("A1").Interior.Color = 31569
Range("A4:D8").Interior.Color = 4569325
Range("C12:D17").Cells(4).Interior.Color = 568569
Cells(3, 6).Interior.Color = 12659
End Sub

Поместите пример кода в свой программный модуль и нажмите кнопку на панели инструментов «Run Sub» или на клавиатуре «F5», курсор должен быть внутри выполняемой программы. На активном листе Excel ячейки и диапазон, выбранные в коде, окрасятся в соответствующие цвета.

Есть один интересный нюанс: если присвоить свойству .Interior.Color отрицательное значение от -16777215 до -1, то цвет будет соответствовать значению, равному сумме максимального значения палитры (16777215) и присвоенного отрицательного значения. Например, заливка всех трех ячеек после выполнения следующего кода будет одинакова:

Sub ColorTest11()
Cells(1, 1).Interior.Color = -12207890
Cells(2, 1).Interior.Color = 16777215 + (-12207890)
Cells(3, 1).Interior.Color = 4569325
End Sub

Проверено в Excel 2016.

Вывод сообщений о числовых значениях цветов

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

Пример кода 2:

Sub ColorTest2()
MsgBox Range("A1").Interior.Color
MsgBox Range("A4:D8").Interior.Color
MsgBox Range("C12:D17").Cells(4).Interior.Color
MsgBox Cells(3, 6).Interior.Color
End Sub

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

Использование предопределенных констант

В VBA Excel есть предопределенные константы часто используемых цветов для заливки ячеек:

Предопределенная константа Наименование цвета
vbBlack Черный
vbBlue Голубой
vbCyan Бирюзовый
vbGreen Зеленый
vbMagenta Пурпурный
vbRed Красный
vbWhite Белый
vbYellow Желтый

Присваивается цвет ячейке предопределенной константой в VBA Excel точно так же, как и числовым значением:

Пример кода 3:

Range("A1").Interior.Color = vbGreen

Цветовая модель RGB

Цветовая система RGB представляет собой комбинацию различных по интенсивности основных трех цветов: красного, зеленого и синего. Они могут принимать значения от 0 до 255. Если все значения равны 0 - это черный цвет, если все значения равны 255 - это белый цвет.

Выбрать цвет и узнать его значения RGB можно с помощью палитры Excel:

Палитра Excel
Палитра Excel

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

Пример кода 4:

Range("A1").Interior.Color = RGB(100, 150, 200)

Свойство .Interior.ColorIndex объекта Range

До появления Excel 2007 существовала только ограниченная палитра для заливки ячеек фоном, состоявшая из 56 цветов, которая сохранилась и в настоящее время. Каждому цвету в этой палитре присвоен индекс от 1 до 56. Присвоить цвет ячейке по индексу или вывести сообщение о нем можно с помощью свойства .Interior.ColorIndex:

Пример кода 5:

Range("A1").Interior.ColorIndex = 8
MsgBox Range("A1").Interior.ColorIndex

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

Пример кода 6:

Sub ColorIndex()
Dim i As Byte
For i = 1 To 56
Cells(i, 1).Interior.ColorIndex = i
Next
End Sub

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

Готовую стандартную палитру из 56 цветов можете посмотреть здесь.

VBA Excel. Цвет ячейки (заливка, фон): 14 комментариев

  1. Виктор

    Спасибо, наконец то разобрался во всех перипетиях заливки и цвета шрифта.

  2. Евгений (автор статьи)

    Пожалуйста, Виктор. Очень рад, что статья пригодилась.

  3. Евгений (автор статьи)

    Привет, Надежда!
    Фон у ячейки есть всегда, по умолчанию - белый. Отсутствие цветного фона можно определить, проверив, является ли цвет ячейки белым:

    Sub Primer()
      If Cells(1, 1).Interior.Color = 16777215 Then
        MsgBox "Цвет ячейки - белый"
      Else
        MsgBox "Цвет ячейки отличается от белого"
      End If
    End Sub
    
  4. Иван

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

  5. Евгений (автор статьи)

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

    Sub Primer()
    Dim tsvet As Long, myCell As Range, n As Long
    tsvet = ActiveCell.Interior.Color
      For Each myCell In ActiveCell.CurrentRegion
        If myCell.Interior.Color = tsvet Then
          n = n + 1
        End If
      Next
    MsgBox n
    End Sub
    
  6. Фарин

    Каким образом можно использовать не в процедуре, а именно в пользовательской функции VBA свойство .Interior.Color?
    Скажем, проверять функцией значение какой-то ячейки и подкрашивать ячейку в зависимости от этого.

  7. Евгений (автор статьи)

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

    Однако, с помощью пользовательской функции VBA можно вывести значения свойств ячейки, в которой она размещена:

    Function Test()
    Test = Application.ThisCell.Address
    'Test = Application.ThisCell.Row
    'Test = Application.ThisCell.Column
    'Test = Application.ThisCell.Interior.ColorIndex
    End Function
    

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

    Для подкрашивания ячейки в зависимости от ее значения используйте процедуру Sub или штатный инструмент Excel – условное форматирование.

    1. Лев

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

    2. Евгений (автор статьи)

      Лев, закрасить пустые ячейки можно с помощью цикла For Each... Next:

      Sub Primer()
      Dim myCell As Range
        For Each myCell In Range("A1:F10")
          If myCell = "" Then myCell.Interior.Color = 5555555
        Next
      End Sub
      
  8. Александр

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

    1. Евгений (автор статьи)

      Привет, Александр!
      Используйте функцию InStr, чтобы найти положение разделителей, а дальше функции Left и Mid. Смотрите пример с пробелом в качестве разделителя:

      Sub Test1()
      Dim n1 As Byte, n2 As Byte
      Range("A1") = "100 180 50"
      n1 = InStr(Range("A1"), " ")
      n2 = InStr(n1 + 1, Range("A1"), " ")
      Range("A1").Interior.Color = RGB(Left(Range("A1"), n1 - 1), _
      Mid(Range("A1"), n1 + 1, n2 - n1 - 1), Mid(Range("A1"), n2 + 1))
      End Sub
      

      Или еще проще с помощью функции Split:

      Sub Test2()
      Dim a() As String
      Range("A1") = "90 180 550"
      a = Split(Range("A1"))
      Range("A1").Interior.Color = RGB(a(0), a(1), a(2))
      End Sub
      

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

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