Как полностью раскрасить таблицу Excel красивенько, имея только 3 цифры -- RGB

Привет! Совсем недавно я делился своими первыми наработки в области цвета. Я предложил тебе макрос, который создает целые палитры цветов по заданным образцам. Если интересно, можешь глянуть предыдущую статью, но сейчас я предлагаю нечто еще более крутое!
↑ теперь ты сможешь сам раскрасить свою таблицу, преобразив ее в такой стиль. При этом ты можешь использовать абсолютно любой цвет в качестве основного. Для того, чтобы получить цвет тебе понадобится только 3 цифры -- значения RGB -- красного, зеленого и голубого.

Немного о цветах на экране

Напомню, что все цвета, которые ты видишь на экране, во многих программах принято кодировать тремя цифрами:
RED -- красный
GREEN -- зеленый
BLUE -- синий
Каждый их этих цветов по сути отражает количество света, которое падает на монитор. Значения каждого света может варьироваться от 0 до 255. Если все три света будут равны 0, то ты получишь черный цвет -- отсутствие света. Если каждый будет равен 255 -- максимальному значению -- то ты получишь белый цвет. Все логично. Я немного исследовал этот вопрос и написал следующий макрос.

Макрос по созданию своего стиля таблиц

При запуске макрос сперва предложит тебе выбрать диапазон с тремя клетками, где будут вписаны соответствующие параметры RGB. После этого он запомнит твой выбор и попросит выбрать диапазон с самой таблицей. И, наконец, он раскрасит твою таблицу по выбранному образцу!
В макросе предусмотрено 2 стиля. Первый применяется, если таблица содержит менее пяти колонок. Он попроще:

Если же количество колонок 5 или более, то макрос раскрасит таблицу так:

Если ты немного смыслишь в программировании, то можешь создать свой стиль или целую коллекцию стилей, которые будет применять данный макрос.
Для того, чтобы запустить макрос и попробовать все самому, вставь в свой редактор следующий код:
Option Explicit
Sub СделатьСтильТаблицы()
'
' СделатьСтильТаблицы Макрос
'

'
    Dim rR As Range, cel As Range, nR As Range
    Dim i As Integer, x As Long, y As Long
    Dim Col(3) As Long
    Dim Avg As Long
    Dim R As Long, G As Long, B As Long
    Dim Rt As Long, Gt As Long, Bt As Long
    Dim h As Long, l As Long
    
    ' просим указать диапазон РЖБ
    Application.DisplayAlerts = False
    On Error Resume Next
    Set rR = Application.InputBox("Выбери диапазон " & _
    "RGB, 3 ячейки:", "Выбор", Type:=8)
    Application.DisplayAlerts = True

    
    ' проверка правильности выбора диапазона
    If rR.Cells.Count <> 3 Then
        MsgBox "Выбранный диапазон должен содержать 3 ячейки", _
        vbCritical, "Останавливаю макрос =("
        Exit Sub
    End If
    On Error GoTo 0
    'запускаем присвоение базовых цветов
    i = 1
    For Each cel In rR
        If Not IsNumeric(cel) Then
            Col(i) = 255
        Else
            Col(i) = cel
        End If
        i = i + 1
    Next
      
      
    ' Запуск проверки на светлоту и темноту
    Avg = _
    Application.WorksheetFunction.Average(Col(1), Col(2), Col(3))
    Select Case Avg
        Case Is > 210
            R = Int((Col(1) * 630) / (Col(1) + Col(2) + Col(3)))
            G = Int((Col(2) * 630) / (Col(1) + Col(2) + Col(3)))
            B = Int((Col(3) * 630) / (Col(1) + Col(2) + Col(3)))
        Case 0
            R = 140
            G = 140
            B = 140
        Case Is < 65
            R = Int((Col(1) * 195) / (Col(1) + Col(2) + Col(3)))
            G = Int((Col(2) * 195) / (Col(1) + Col(2) + Col(3)))
            B = Int((Col(3) * 195) / (Col(1) + Col(2) + Col(3)))
        Case Else
            R = Col(1)
            G = Col(2)
            B = Col(3)
    End Select
 
 
    ' просим указать диапазон с таблицей
    Application.DisplayAlerts = False
    On Error Resume Next
    Set nR = Application.InputBox("Выдели таблицу, " & _
    "которую будем красить", "Выбор", Type:=8)
    Application.DisplayAlerts = True
    
    ' проверка правильности выбора диапазона
    If nR.Cells.Count = 0 Then
        MsgBox "Выбранный диапазон не может быть пустым", _
        vbCritical, "Останавливаю макрос =("
        Exit Sub
    End If
    On Error GoTo 0
    
    
    'определяем ширину и высоту диапазона
    h = nR.Rows.Count
    l = nR.Columns.Count

    ' К - Р - А - С - И - М !
    ' если выбрана одна строка, то красим ее в ключевой цвет
    If h = 1 Then
        nR.Interior.Color = RGB(R, G, B)
        Exit Sub
    End If
    
    'перебираем все клетки, красим внутренность
    For x = 1 To l
        For y = 1 To 3
        Select Case x Mod 2 + (y Mod 2) * 10
            Case 11
        i = 10
        Rt = R + Int((255 - R) * i * 0.05)
        Gt = G + Int((255 - G) * i * 0.05)
        Bt = B + Int((255 - B) * i * 0.05)
        nR(y, x).Interior.Color = RGB(Rt, Gt, Bt)
            Case 10
        i = 7
        Rt = R + Int((255 - R) * i * 0.05)
        Gt = G + Int((255 - G) * i * 0.05)
        Bt = B + Int((255 - B) * i * 0.05)
        nR(y, x).Interior.Color = RGB(Rt, Gt, Bt)
            Case 1
        i = 8
        Rt = R + Int((255 - R) * i * 0.05)
        Gt = G + Int((255 - G) * i * 0.05)
        Bt = B + Int((255 - B) * i * 0.05)
        nR(y, x).Interior.Color = RGB(Rt, Gt, Bt)
            Case 0
        i = 5
        Rt = R + Int((255 - R) * i * 0.05)
        Gt = G + Int((255 - G) * i * 0.05)
        Bt = B + Int((255 - B) * i * 0.05)
        nR(y, x).Interior.Color = RGB(Rt, Gt, Bt)
        End Select
        Next y
    Next x

    'если таблица содержит более 4 колонок, красим веселее
    If l > 4 Then
    For x = 1 To l
        For y = 1 To 3
        Select Case x Mod 2 + (y Mod 2) * 10 + x * 100
            Case 111
        i = 14
        Rt = R + Int((255 - R) * i * 0.05)
        Gt = G + Int((255 - G) * i * 0.05)
        Bt = B + Int((255 - B) * i * 0.05)
        nR(y, x).Interior.Color = RGB(Rt, Gt, Bt)

            Case 101
        i = 13
        Rt = R + Int((255 - R) * i * 0.05)
        Gt = G + Int((255 - G) * i * 0.05)
        Bt = B + Int((255 - B) * i * 0.05)
        nR(y, x).Interior.Color = RGB(Rt, Gt, Bt)
            
            Case nR.Columns.Count * 100 + 1
        With nR(y, x).Interior
            .Pattern = xlPatternLinearGradient
            .Gradient.Degree = 0
            .Gradient.ColorStops.Clear
        End With
        i = 1
        With nR(y, x).Interior.Gradient.ColorStops.Add(0)
            .Color = RGB(R + Int((255 - R) * i * 0.05), _
                         G + Int((255 - G) * i * 0.05), _
                         B + Int((255 - B) * i * 0.05))
            .TintAndShade = 0
        End With
        i = 5
        With nR(y, x).Interior.Gradient.ColorStops.Add(1)
            .Color = RGB(R + Int((255 - R) * i * 0.05), _
                         G + Int((255 - G) * i * 0.05), _
                         B + Int((255 - B) * i * 0.05))
            .TintAndShade = 0
        End With
        
            Case nR.Columns.Count * 100 + 11
        With nR(y, x).Interior
            .Pattern = xlPatternLinearGradient
            .Gradient.Degree = 0
            .Gradient.ColorStops.Clear
        End With
        i = 0
        With nR(y, x).Interior.Gradient.ColorStops.Add(0)
            .Color = RGB(R + Int((255 - R) * i * 0.05), _
                         G + Int((255 - G) * i * 0.05), _
                         B + Int((255 - B) * i * 0.05))
            .TintAndShade = 0
        End With
        i = 4
        With nR(y, x).Interior.Gradient.ColorStops.Add(1)
            .Color = RGB(R + Int((255 - R) * i * 0.05), _
                         G + Int((255 - G) * i * 0.05), _
                         B + Int((255 - B) * i * 0.05))
            .TintAndShade = 0
        End With
        
        End Select
        Next y
    Next x
    End If
    
    'перебираем все клетки, красим шапку
    For x = 1 To l
        With nR(1, x).Interior
            .Pattern = xlPatternLinearGradient
            .Gradient.Degree = 90
            .Gradient.ColorStops.Clear
        End With
        i = 7
        With nR(1, x).Interior.Gradient.ColorStops.Add(0)
            .Color = RGB(Int(R * (1 - i * 0.05)), _
                         Int(G * (1 - i * 0.05)), _
                         Int(B * (1 - i * 0.05)))
            .TintAndShade = 0
        End With
        i = 9
        With nR(1, x).Interior.Gradient.ColorStops.Add(1)
            .Color = RGB(Int(R * (1 - i * 0.05)), _
                         Int(G * (1 - i * 0.05)), _
                         Int(B * (1 - i * 0.05)))
            .TintAndShade = 0
        End With
        With nR(1, x).Font
            .Bold = True
            .ThemeColor = xlThemeColorDark1
        End With
    Next x
    
    'если колонок > 4, красим шапку еще немного
    If l > 4 Then
        i = 9
        With nR(1, l).Interior.Gradient.ColorStops.Add(0)
            .Color = RGB(Int(R * (1 - i * 0.05)), _
                         Int(G * (1 - i * 0.05)), _
                         Int(B * (1 - i * 0.05)))
            .TintAndShade = 0
        End With
        i = 11
        With nR(1, l).Interior.Gradient.ColorStops.Add(1)
            .Color = RGB(Int(R * (1 - i * 0.05)), _
                         Int(G * (1 - i * 0.05)), _
                         Int(B * (1 - i * 0.05)))
            .TintAndShade = 0
        End With
    End If
    
' раскрашиваем по образцу, думаю, это ускорит работу макроса
    nR.Rows("2:3").Copy
    nR.Rows("2:" & h).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    
End Sub

Хотелось бы немного раскрыть карты и рассказать о том, как я работаю с цветом. Во-первых, проведя ряд экспериментов, я понял, что некоторые цвета слишком темные, а некоторые -- наоборот -- слишком светлые. У светлых среднее значение RGB более 210. Их я умышленно затемняю для получения ключевых параметров. Темные цвета содержат мало света, их среднее значение RGB менее 65. Их я осветляю. Потом уже идет сама раскраска. Красим в светлые тона внутренность таблицы и в темные ее шапку -- мне так нравится. Буду очень рад, если кто-нибудь из умельцев в программировании создаст и предоставит мне код для создания собственных стилей. Может быть, это будет стиль на базе двух и более цветов. Экспериментируй!

И еще одно небольшое наблюдение для любознательных. Если на один и тот же процент менять значения RGB, то получим оттенки этого цвета: более светлые или темные. Если же изменить пропорцию  RGB, то получим другой цвет! В этом ключ к созданию различных сочетаний. Думаю, что красивые сочетания цветов имеют определенный код, разгадав который, можно создавать новые образцы.

 Где искать цвета

Я бы хотел сказать "Черпай вдохновение в природе!", но вместо этого  предлагаю исследовать этот сайт. Еще мне была полезна просто статья в Википедии про RGB. Изначально же меня впечатлили таблицы из этой статьи.



















Всё!

Комментарии

Отправить комментарий

Популярные сообщения из этого блога

Запросы (query) в Google Docs, как инструмент для профессиональной разработки отчетов и приложений

Связанные выпадающие списки в табличках Google

Замечательная функция Фильтра (FILTER) в таблицах Гугла (Google Spreadsheets)