Как выделить ячейку, используя шестнадцатеричное значение цвета внутри ячейки?

У меня есть таблица символов и соответствующих шестнадцатеричных цветов. Я хочу заполнить саму ячейку (или ту, что рядом с ней) шестнадцатеричным цветом внутри ячейки. Я немного читал об «условном форматировании» и думаю, что это способ сделать это.

Как я могу добиться желаемого результата?


person knowbody    schedule 04.05.2012    source источник
comment
Я не думаю, что условное форматирование сделает это за вас. Я думаю, вам нужно запустить макрос, который считывает значение ячейки и устанавливает Range("A1:A6").Interior.Color = RGB(200,160,35). Это означает, что вам также придется выполнять математические вычисления для преобразования в RGB или использовать странный шестнадцатеричный подход Excel.   -  person Marc    schedule 05.05.2012


Ответы (6)


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

Предполагая: строка 1 содержит метки данных, набор данных не имеет пробелов, цвет HEX предназначен для заливки, а не для шрифта, вы проанализировали значения цвета HEX (числа, а не формулы) в столбцах C: E (R, G, B) и что вам не требуется делать это часто, то может подойти макрос ColourCells:

Sub ColourCells()
Dim HowMany As Integer
On Error Resume Next
Application.DisplayAlerts = False
HowMany = Application.InputBox _
(Prompt:="Enter last row number.", Title:="To apply to how many rows?", Type:=1)
On Error GoTo 0
Application.DisplayAlerts = True
If HowMany = 0 Then
Exit Sub
Else
   Dim i As Integer
   For i = 2 To HowMany
      Cells(i, 3).Interior.Color = RGB(Cells(i, 3), Cells(i, 4), Cells(i, 5))
   Next i
End If
End Sub

и введите желаемое значение для n при появлении запроса.

Пример вывода и формулы и т.д.:

SO11466034

Функция Excel RGB() фактически создает значение BGR (я не думаю, что кто-то, кто может знать, почему, говорит, почему), поэтому Excel показывает кусочки в обратном порядке. Поскольку код Columns3,4,5 был логичным, но BGR, а не обычный RGB в изображении, я подумал, может выглядеть странно. Для F на изображении значение C3 (столбец LEFT из трех столбцов RGB) получается путем применения RIGHT() к шестнадцатеричному цвету.

person pnuts    schedule 13.07.2012
comment
Можно увидеть, где это можно использовать для иллюстрации данных о температуре гораздо более привлекательным способом, чем просто табличные данные. +1 - person ryyker; 19.06.2014
comment
Из всех этих комментариев я предполагаю, что в VBA нет функции цвета HEX? следовательно, его нужно преобразовать в RGB? - person GenDemo; 02.11.2020

Незначительное редактирование ответа Джона Пельтье. Его функция ПОЧТИ работает, но цвета, которые она отображает, неверны из-за того, что Excel будет отображать как BGR, а не RGB. Вот исправленная функция, которая меняет пары шестнадцатеричных значений в «правильном» порядке:

Sub ColorCellsByHex()
  Dim rSelection As Range, rCell As Range, tHex As String

  If TypeName(Selection) = "Range" Then
  Set rSelection = Selection
    For Each rCell In rSelection
      tHex = Mid(rCell.Text, 6, 2) & Mid(rCell.Text, 4, 2) & Mid(rCell.Text, 2, 2)
      rCell.Interior.Color = WorksheetFunction.Hex2Dec(tHex)
    Next
  End If
End Sub
person user3646932    schedule 18.05.2016
comment
Намного лучше! Просто выберите диапазон и выполните макрос. Это действительно хороший ответ. Большое спасибо. - person Killer; 30.11.2017
comment
если вы хотите, чтобы код цвета также был скрыт, добавьте следующую строку непосредственно перед Next: rCell.Font.Color = WorksheetFunction.Hex2Dec(tHex) - person Stefan de Kok; 03.05.2018

Гораздо проще:

ActiveCell.Interior.Color = WorksheetFunction.Hex2Dec(Mid$(ActiveCell.Text, 2))

Mid удаляет начальный «#», Hex2Dec превращает шестнадцатеричное число в десятичное значение, которое может использовать VBA.

Итак, выберите диапазон для обработки и запустите это:

Sub ColorCellsByHexInCells()
  Dim rSelection As Range, rCell As Range

  If TypeName(Selection) = "Range" Then
  Set rSelection = Selection
    For Each rCell In rSelection
      rCell.Interior.Color = WorksheetFunction.Hex2Dec(Mid$(rCell.Text, 2))
    Next
  End If
End Sub
person Jon Peltier    schedule 07.07.2015
comment
Можно ли изменить эту функцию, чтобы ее можно было использовать прямо в условном форматировании? IfHexColour() -- таким образом, он обнаруживает # как первый элемент, затем проверяет 6 символов, затем преобразует в RGB и устанавливает цвет - для активной ячейки - person snh_nl; 24.05.2017
comment
Я не понимаю, как встроенное условное форматирование может справиться с этим. Но вы можете использовать VBA, чтобы обнаружить строку, начинающуюся с #, проверить ее как допустимую шестнадцатеричную строку и соответствующим образом раскрасить ячейку. - person Jon Peltier; 25.05.2017

Нет необходимости многократно преодолевать барьер VBA/Worksheet для преобразования. Эта оптимизированная версия имеет правильный порядок байтов:

Sub ColorCellsByHex()
    Dim r
    If TypeName(Selection) <> "Range" Then Exit Sub
    For Each r In Selection
        r.Interior.Color = Abs(("&H" & Mid(r, 6, 2) & Mid(r, 4, 2) & Mid(r, 2, 2)))
    Next
End Sub
person Excel Hero    schedule 04.05.2020

Для этого пользовательскую форму можно создать с помощью функции Hex2Dec.

Function Hex2Dec(n1 As String) As Long
    Dim nl1 As Long
    Dim nGVal As Long
    Dim nSteper As Long
    Dim nCount As Long
    Dim x As Long
    Dim nVal As Long
    Dim Stepit As Long
    Dim hVal As String

    nl1 = Len(n1)
    nGVal = 0
    nSteper = 16
    nCount = 1
    For x = nl1 To 1 Step -1
       hVal = UCase(Mid$(n1, x, 1))
       Select Case hVal
         Case "A"
           nVal = 10
         Case "B"
           nVal = 11
         Case "C"
           nVal = 12
         Case "D"
           nVal = 13
         Case "E"
           nVal = 14
         Case "F"
           nVal = 15
         Case Else
           nVal = Val(hVal)
       End Select
       Stepit = (nSteper ^ (nCount - 1))
       nGVal = nGVal + nVal * Stepit
       nCount = nCount + 1
    Next x
    Hex2Dec = nGVal
End Function
...
UserForm1.TextBox1 = "RGB(" & Hex2Dec(UserForm1.txtHex1.Value) & "," & _
           Hex2Dec(UserForm1.txtHex2.Value) & "," & Hex2Dec(UserForm1.txtHex3.Value) & ")"

Например, введенное значение в текстовое поле: #FF8800 - Результат: RGB(255,136,0)

person kadrleyn    schedule 04.01.2017

Это еще один вариант — он обновляет цвет ячейки, когда вы выбираете ячейку, предполагая, что значение в ячейке начинается с «#» и составляет 7 символов.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If (Left(ActiveCell.Text, 1) = "#" And Len(ActiveCell.Text) = 7) Then
    ActiveCell.Interior.Color = WorksheetFunction.Hex2Dec(Mid$(ActiveCell.Text, 2))
End If

End Sub
person Rich Morey    schedule 19.02.2020