Конвертация цвета из числового значения Long в RGB формат из кода VBA Excel с помощью пользовательской функции ColorLongToRGB. Примеры.
Функция ColorLongToRGB
Пользовательская функция ColorLongToRGB по своему действию является обратной для встроенной в VBA Excel функции RGB, которая значения цветов по системе RGB переводит в значения типа Long.
Для конвертации цвета из Long в RGB нам понадобится функция Windows API CopyMemory
(копирование блока памяти из одного расположения в другое), которую следует объявить в разделе Declarations стандартного модуля:
1 |
Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr) |
Это вариант для 64-разрядных версий VBA Excel, для 32-разрядных платформ из объявления следует убрать ключевое слово PtrSafe и, возможно, тип данных LongPtr заменить на Long.
Параметры функции CopyMemory
:
- Destination — указатель на начальный адрес места назначения скопированного блока;
- Source — указатель на начальный адрес копируемого блока памяти;
- Длина — размер копируемого блока памяти в байтах.
Кроме того, нам понадобится переменная пользовательского типа данных, которую следует объявить в разделе Declarations:
1 2 3 4 5 |
Type myRGB r As Byte g As Byte b As Byte End Type |
Элементы пользовательского типа данных myRGB:
- r — интенсивность красного цвета;
- g — интенсивность зеленого цвета;
- b — интенсивность синего цвета.
Код функции ColorLongToRGB, предназначенной для конвертации цвета из Long в RGB:
1 2 3 |
Function ColorLongToRGB(d As Long) As myRGB CopyMemory ColorLongToRGB, d, 3 End Function |
d — числовое значение цвета типа Long.
В данном случае, числовое значение цвета типа Long распознается как массив из четырех байтов, значение первого из которых соответствует интенсивности красного цвета, второго — интенсивности зеленого цвета, третьего — интенсивности синего цвета. Четвертый байт может содержать значение альфа-канала (информация о прозрачности рисунка), который в Excel не используется.
Функция ColorLongToRGB с помощью функции Windows API CopyMemory
копирует массив из первых трех байтов числового значения цвета в три элемента пользовательского типа данных myRGB (r, g, b).
Конвертация цвета в RGB
Код функции ColorLongToRGB в сборке с объявлением функция Windows API CopyMemory
и пользовательского типа данных myRGB:
1 2 3 4 5 6 7 8 9 10 11 |
Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr) Type myRGB r As Byte g As Byte b As Byte End Type Function ColorLongToRGB(d As Long) As myRGB CopyMemory ColorLongToRGB, d, 3 End Function |
Пример 1
Проверка работоспособности пользовательской функции ColorLongToRGB:
1 2 3 4 5 6 |
Sub Primer1() Dim x As myRGB, a As Long a = RGB(red:=120, green:=200, blue:=150) x = ColorLongToRGB(a) MsgBox "r = " & x.r & vbNewLine & "g = " & x.g & vbNewLine & "b = " & x.b End Sub |
Результат работы кода:
Пример 2
Есть таблица, первый столбец которой заполнен произвольными цветами:
Необходимо числовой код каждого цвета типа Long преобразовать в RGB формат и заполнить его элементами пустые ячейки таблицы.
Код VBA Excel для решения данной задачи:
1 2 3 4 5 6 7 8 9 |
Sub Primer2() Dim x As myRGB, myCell As Range For Each myCell In Range("A2:A6") x = ColorLongToRGB(myCell.Interior.Color) myCell.Offset(0, 1) = x.r myCell.Offset(0, 2) = x.g myCell.Offset(0, 3) = x.b Next End Sub |
Результат работы кода:
Пример 3
Пример функции ColorLongToRGBA c альфа-каналом в сборке с объявлением функция Windows API CopyMemory
и пользовательского типа данных myRGBA:
1 2 3 4 5 6 7 8 9 10 11 12 |
Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr) Type myRGBA r As Byte g As Byte b As Byte a As Byte End Type Function ColorLongToRGBA(d As Long) As myRGBA CopyMemory ColorLongToRGBA, d, 4 End Function |
Элемент a
пользовательского типа данных myRGBA — это альфа-канал, который содержит информацию о прозрачности рисунка.