VBA Excel. Основные способы задать цвет в VBA

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

1 способ. Цвет через стандартные константы цвета VBA

VBA содержит 8 встроенных цветовых констант:

Название Цвет
vbBlack
vbWhite
vbGreen
vbYellow
vbRed
vbCyan
vbMagenta
vbBlue

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

Фактически, каждый из этих цветов имеет свой числовой код, из-за чего цвету и присваивается тип данных Long.

Пример в коде задаёт цвет шрифта:

Range("A1").Font.Color = vbRed
Range("A2").Font.Color = vbBlue

Это то же самое, что и:

Range("A1").Font.Color = 255
Range("A2").Font.Color = 16711680

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

2 способ. Цвет через ColorIndex

ColorIndex — это свойство, равное индексу от 1 до 56. Именно столько базовых цветов в палитре VBA Excel. Способ старый и ограниченный, без возможности точного управления оттенками.

Пример в коде:

Range("A1").Interior.ColorIndex = 10

Соответствие цветов индексам VBA

Индекс Название (рус) Название (англ) Цвет индекса RGB
1 Чёрный Black RGB(0, 0, 0)
2 Белый White RGB(255, 255, 255)
3 Красный Red RGB(255, 0, 0)
4 Лайм Lime RGB(0, 255, 0)
5 Синий Blue RGB(0, 0, 255)
6 Желтый Yellow RGB(255, 255, 0)
7 Маджента Magenta RGB(255, 0, 255)
8 Цвет морской волны Aqua RGB(0, 255, 255)
9 Темно-бордовый Maroon RGB(128, 0, 0)
10 Зеленый Green RGB(0, 128, 0)
11 Темно-синий Navy blue RGB(0, 0, 128)
12 Оливковый Olive RGB(128, 128, 0)
13 Пурпурный Purple RGB(128, 0, 128)
14 Бирюзовый Teal RGB(0, 128, 128)
15 Серебряный Silver RGB(192, 192, 192)
16 Серый Gray RGB(128, 128, 128)
17 Светло-пурпурно-синий Light purple blue RGB(153, 153, 255)
18 Розовато-лиловый Mauve RGB(153, 51, 102)
19 Бледно-желто-зеленый Pale yellow green RGB(255, 255, 204)
20 Бледно-голубой Pale blue RGB(204, 255, 255)
21 Сливовый Plum RGB(102, 0, 102)
22 Лососевый Salmon RGB(255, 128, 128)
23 Темно-сине-голубой Light navy blue RGB(0, 102, 204)
24 Барвинок Periwinkle RGB(204, 204, 255)
25 Темно-синий Navy blue RGB(0, 0, 128)
26 Фуксия Fuchsia RGB(255, 0, 255)
27 Желтый Yellow RGB(255, 255, 0)
28 Цвет морской волны Aqua RGB(0, 255, 255)
29 Пурпурный Purple RGB(128, 0, 128)
30 Коричнево-малиновый Maroon RGB(128, 0, 0)
31 Сине-зеленый Teal RGB(0, 128, 128)
32 Синий Blue RGB(0, 0, 255)
33 Небесно-голубой Vivid sky blue RGB(0, 204, 255)
34 Бледно-голубой Pale blue RGB(204, 255, 255)
35 Бледно-зеленый Pale green RGB(204, 255, 204)
36 Светло-желтый Light yellow RGB(255, 255, 153)
37 Сине-голубой Shade of blue RGB(153, 204, 255)
38 Бледно-пурпурно-розовый Pale magenta pink RGB(255, 153, 204)
39 Светло-сиреневый Light lilac RGB(204, 153, 255)
40 Оранжево-персиковый Peach-orange RGB(255, 204, 153)
41 Светло-синий Light blue RGB(51, 102, 255)
42 Светло-бирюзовый Light turquoise RGB(51, 204, 204)
43 Желто-зеленый Yellow green RGB(153, 204, 0)
44 Желтый мандарин Tangerine yellow RGB(255, 204, 0)
45 Сигнальный оранжевый Safety orange RGB(255, 153, 0)
46 Оранжевый Orange RGB(255, 102, 0)
47 Темно-сине-серый Dark blue gray RGB(102, 102, 153)
48 Светло-серый Light gray RGB(150, 150, 150)
49 Полуночно-синий Midnight blue RGB(0, 51, 102)
50 Зеленая трава Green grass RGB(51, 153, 102)
51 Темно-зеленый Dark green RGB(0, 51, 0)
52 Темно-коричневый Dark brown RGB(51, 51, 0)
53 Темно-красный Dark red RGB(153, 51, 0)
54 Розовато-лиловый Mauve RGB(153, 51, 102)
55 Синий пигмент Blue pigment RGB(51, 51, 153)
56 Темный уголь Dark charcoal RGB(51, 51, 51)

Названия цветов приведены информативно. Через текст можно задать только 8 стандартных цветовых констант.

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

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

Макрос для вывода палитры на активный лист в диапазон ячеек A1:B56:

Sub test()
    Dim a As Integer
    Cells(1, 1) = 1
    For a = 2 To 56
        Cells(a, 1) = Cells(a - 1, 1) + 1
    Next a
    For a = 1 To 56
        Cells(a, 2).Interior.ColorIndex = Cells(a, 1)
    Next a
End Sub

3 способ. RGB — основной и универсальный

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

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

Пример в коде:

Range("A1").Interior.Color = RGB(255, 0, 0)
Range("B1").Interior.Color = RGB(0, 0, 255)

Это то же самое, что и:

Range("A1").Interior.Color = 255
Range("B1").Interior.Color = 16711680

*опять эти непонятные огромные числа, пора их обсудить

Важно! Числа в свойствах Color и ColorIndex – это не одно и то же. В свойстве ColorIndex это заданные 56 значений, а в свойстве Color это число, рассчитанное на основе RGB по формуле:

Color = B * 65536 + G * 256 + R

Вот теперь все встало на свои места. Из-за такого способа хранения цвета в Excel, цвет и является переменной типа Long.

Конечно, лучше в свойстве Color не использовать числа, а записывать цвет в формате RGB, но понимание принципов обработки информации в Excel сильно упростит работу и составление своих собственных макросов под ваши задачи.

4. Еще немного про цвет в VBA. Прозрачность и определение цвета

Ячейки Excel не поддерживают прозрачность, но фигуры — поддерживают. Задать прозрачность можно с помощью свойства Transparency

Пример в коде, который закрашивает прямоугольник с именем "Rectangle_1":

With ActiveSheet.Shapes.Range(Array("Rectangle_1")).Fill
    .ForeColor.RGB = RGB(0, 255, 255)
    .Transparency = 0.5
End With

Если имеется файл с заданными цветами ячеек или объектов, то вы можете получить этот цвет и разложить на RGB (тут нам и пригодятся знания формулы для расчета цвета в VBA). Пример макроса, который берет цвет из ячейки А1 и записывает его RGB код в ячейку В1:

Sub test2()
    Dim clr As Long
    clr = Range("A1").Interior.Color
    r = clr Mod 256
    g = (clr \ 256) Mod 256
    b = clr \ 65536
    Range("B1") = "RGB(" & r & ", " & g & ", " & b & ")"
End Sub