В VBA цвет — это число типа Long, которое Excel интерпретирует как цвет. Способов задать это число несколько, и каждый применяется в своих задачах.
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
*о том, откуда берутся эти огромные цифры, поговорим чуть позже.
ColorIndex — это свойство, равное индексу от 1 до 56. Именно столько базовых цветов в палитре VBA Excel. Способ старый и ограниченный, без возможности точного управления оттенками.
Пример в коде:
Range("A1").Interior.ColorIndex = 10
| Индекс | Название (рус) | Название (англ) | Цвет индекса | 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
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 сильно упростит работу и составление своих собственных макросов под ваши задачи.
Ячейки 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