Заливка ячейки цветом в VBA Excel. Фон ячейки. Свойства .Interior.Color и .Interior.ColorIndex. Цветовая модель RGB. Стандартная палитра. Очистка фона ячейки.
Свойство .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 | Желтый |
xlNone | Нет заливки |
Присваивается цвет ячейке предопределенной константой в VBA Excel точно так же, как и числовым значением:
Пример кода 3:
Range(«A1»).Interior.Color = vbGreen |
Цветовая модель RGB
Цветовая система RGB представляет собой комбинацию различных по интенсивности основных трех цветов: красного, зеленого и синего. Они могут принимать значения от 0 до 255. Если все значения равны 0 — это черный цвет, если все значения равны 255 — это белый цвет.
Выбрать цвет и узнать его значения RGB можно с помощью палитры Excel:
Палитра Excel
Чтобы можно было присвоить ячейке или диапазону цвет с помощью значений RGB, их необходимо перевести в десятичное число, обозначающее цвет. Для этого существует функция VBA Excel, которая так и называется — RGB.
Пример кода 4:
Range(«A1»).Interior.Color = RGB(100, 150, 200) |
Список стандартных цветов с RGB-кодами смотрите в статье: HTML. Коды и названия цветов.
Очистка ячейки (диапазона) от заливки
Для очистки ячейки (диапазона) от заливки используется константа xlNone
:
Range(«A1»).Interior.Color = xlNone |
Свойство .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 будут соответствовать индексу цвета, а ячейка в первом столбце будет залита соответствующим индексу фоном.
Подробнее о стандартной палитре Excel смотрите в статье: Стандартная палитра из 56 цветов, а также о том, как добавить узор в ячейку.
У Вас лишняя буква 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
Закрасить ячейки по условию VBA |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Иван Ж Пользователь Сообщений: 17 |
Здравствуйте! Прикладываю два файла: Книга1 и Книга2. Изменено: Иван Ж — 26.05.2021 18:41:56 |
Mershik Пользователь Сообщений: 8277 |
#2 26.05.2021 20:48:30
почему не называть все своими именами — сделать за вас) Не бойтесь совершенства. Вам его не достичь. |
||
Иван Ж Пользователь Сообщений: 17 |
#3 26.05.2021 21:19:33 Согласен с вам, правильнее было бы написать именно так. Т.к. на данный момент я не очень понимаю с чего нужно начать (как именно задать параметры и условия проверки).
|
||
Jack Famous Пользователь Сообщений: 10852 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Иван Ж, здравствуйте Не понял, с чем у вас проблема — сформулируйте точнее и короче Изменено: Jack Famous — 26.05.2021 22:15:18 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Иван Ж Пользователь Сообщений: 17 |
#5 27.05.2021 06:55:07
К сожалению, получилось не очень коротко, но я постарался более точно описать предполагаемый механизм работы/результата. У меня пока трудности со сложным кодом (где объединяются несколько действий). Т.е. лучше больше (длиннее), но понятнее — сказывается отсутствие большого опыта. Попробую разобраться в ваших пунктах 1 и 2, надеюсь, что пойму. спасибо за совет! |
||
Jack Famous Пользователь Сообщений: 10852 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Иван Ж, если вы вообще не понимаете в коде, то какой смысл городить такую пирамиду условий, если решение вы даже не поймёте Изменено: Jack Famous — 27.05.2021 09:20:32 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Иван Ж Пользователь Сообщений: 17 |
#7 27.05.2021 19:51:32
Не уверен, что я вас правильно понял. Условия, вроде-как, вполне ясные. На мой взгляд у меня проблема именно в составлении правильного-работающего кода, с последовательностью: цикл проверки — цикл вывода результата.
Исходя из вашего совета (пункт 2), убрал из условий проверку по цвету, заменил ее дополнительным значением (в книге2, столбец E, значение 1) и проверкой на наличие в ячейке данных (для закрашиваемой ячейки книга1 — не равно «пусто» или <>»»). Файлы дополнительно приложил. Если мой код, хоть как-то похож на «заготовку» для нормального макроса, который будет выполнять требуемую мне задачу, прошу подсказать (дописать за меня© Mershik ) недостающие строки.
А можно уточнить, для общего развития и понимания принципов работы VBA, почему лучше не применять в условиях поиска аргумент с заливкой? Прикрепленные файлы
Изменено: Иван Ж — 27.05.2021 19:53:35 |
||||||
Jack Famous Пользователь Сообщений: 10852 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Иван Ж, почему значения лучше заливки: Завтра гляну ваши файлы Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Иван Ж Пользователь Сообщений: 17 |
#9 27.05.2021 20:13:55
Спасибо, понял! |
||
Jack Famous Пользователь Сообщений: 10852 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#10 28.05.2021 10:09:51
Файл «Книга2.xlsx» должен лежать в папке с файлом «Тут макрос» (у него название можно менять) и быть ЗАКРЫТ на момент запуска макроса (можно исправить) Прикрепленные файлы
Изменено: Jack Famous — 28.05.2021 10:10:27 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
|
Иван Ж Пользователь Сообщений: 17 |
#11 28.05.2021 20:40:09 Jack Famous, спасибо! То, что нужно!
Остался один момент, я заранее не уточнил. Связан с предыдущим пунктом:
Что необходимо заменить для сбора данных из открытого (буду открывать сам) файла «Книга2»? Т.к. иногда необходимо оперативно что-то поменять, получается не всегда удобно открывать/закрывать файл для запуска макроса. |
||||
Jack Famous Пользователь Сообщений: 10852 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Иван Ж, вопрос не по теме Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Иван Ж Пользователь Сообщений: 17 |
#13 29.05.2021 20:25:58
Я про то, что макрос, при считывании данных, берет их из активной книги, а не через условие типа:
и предположил, что фраза «можно исправить» именно на это и намекает
Итого. Как и писал ранее, макрос работает отлично, еще раз большое спасибо! Изменено: Иван Ж — 29.05.2021 20:26:08 |
||||||
Иван Ж Пользователь Сообщений: 17 |
#14 03.06.2021 22:55:30 Столкнулся с еще одной проблемой, не продумал это сразу..:
Для сравнения попробовал скрыть данные только в файле «Тут макрос» — ничего не изменилось, макрос выполнил свою задачу правильно. |
||
Jack Famous Пользователь Сообщений: 10852 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Иван Ж, n (последняя строка/столбец) для обоих книг определяется методом «прыжка» (Ctrl+Arrows), а он не видит скрытые, получается словарь из закрытой книги не создаётся (нет данных), а для этого случая я написал вызов ошибки (Err.Raise xlErrNA), т.к. вы не писали, как это обходить надо и что делать тут почитайте про метод определения с помощью ActiveSheet.UsedRange Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Иван Ж Пользователь Сообщений: 17 |
#16 27.07.2021 22:55:37
Еще раз спасибо за совет и ссылку. |
||
Доброго времени суток, Друзья! |
|
Bema Пользователь Сообщений: 6761 |
Алексей, добрый и Вам. Обязательно нужен макрос? Можно и при помощи УФ такое сделать. Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл |
Bema
, и Вам доброго….без макроса никуда к сожалению |
|
Bema Пользователь Сообщений: 6761 |
Дело хозяйское Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл |
А если бы в макросе были бы еще комментарии что за что отвечает и счетчик сколько то или иное условие встречалось ранее(вывод счетчика в той же окрашенной ячейки), то этот макрос был бы очень хорошим) |
|
Kuzmich Пользователь Сообщений: 7998 |
Сделайте небольшой пример |
Kuzmich
, возможности сделать хотя бы очень маленький пример не имею т.к. незнаю как… |
|
Kuzmich Пользователь Сообщений: 7998 |
#8 05.07.2017 21:36:15 Макрос (в модуль листа) срабатывает на изменение значений в ячейках столбцов H:O
|
||
Kuzmich
, спасибо большое, но у меня чего-то не работает)))) Kuzmich , скажите, а этот счетчик можно вывести именно в ту ячейку которая должна окрасится? Изменено: Aleksey.g84 — 05.07.2017 21:54:57 |
|
Kuzmich Пользователь Сообщений: 7998 |
#10 05.07.2017 22:23:05
Скопируйте и вставьте код при русской раскладке клавиатуры |
||
Kuzmich
, не помогает смена раскладки…. |
|
Kuzmich Пользователь Сообщений: 7998 |
|
Kuzmich
, грешу все таки на то, что у меня макбук… |
|
Kuzmich Пользователь Сообщений: 7998 |
#14 05.07.2017 23:11:29 Сравните ваши строки в макросе
И то, что у меня в примере Изменено: Kuzmich — 05.07.2017 23:27:50 |
||
Aleksey.g84 Пользователь Сообщений: 80 |
#15 05.07.2017 23:14:30 совершенно идентичны…
|
||
Kuzmich Пользователь Сообщений: 7998 |
У вас в коде «_7», «_4» и «_10» |
И все же Kuzmich продолжаю грешить на то, что у меня макбук….сделал как вы сказали…скопировал прямо из книги в редактор…сохранил и ничего))) |
|
Kuzmich Пользователь Сообщений: 7998 |
Мой пример из сообщения 12 у вас работает? |
Kuzmich
, к сожалению нет…. |
|
vikttur Пользователь Сообщений: 47199 |
Для MAC есть отдельная ветка форума. |
Kuzmich Пользователь Сообщений: 7998 |
#21 05.07.2017 23:37:30
Не надо ничего нажимать. Sub iSumma() это от другого примера |
||
vikttur
, прекрасно вас понимаю…но на данный момент это похоже на расизм….аааа…у тебя мак…пошел вон от сюда… |
|
Aleksey.g84 Пользователь Сообщений: 80 |
#23 05.07.2017 23:42:56 Kuzmich
, немного поменял код…
получилось ничего) Прикрепленные файлы
|
||
Kuzmich Пользователь Сообщений: 7998 |
Вы сделали то, что я вам говорил в #16 ? |
Obelisk Пользователь Сообщений: 49 |
У меня так получилось, все работает: |
vikttur Пользователь Сообщений: 47199 |
#26 05.07.2017 23:49:36
Да при чем здесь рассизм?! MAC имеет отличия в работе с VBA |
||
Kuzmich
, совершенно верно….сейчас еще раз повторил…. |
|
vikttur
, не принимайте близко))) |
|
Kuzmich Пользователь Сообщений: 7998 |
#29 05.07.2017 23:56:38 Obelisk
Ваш макрос только для первой строки
|
||
Obelisk Пользователь Сообщений: 49 |
#30 05.07.2017 23:58:27
я так понял.. |
||