Как найти значение цвета заливки условно отформатированной ячейки в Excel 2007 с помощью vba? - PullRequest
6 голосов
/ 14 сентября 2011

Я использую цветовую шкалу для условного форматирования в Excel 2007, и мне трудно найти цветовой код заливки для условно отформатированных ячеек. Я знаю, что Interior.Color возвращает значение цвета по умолчанию, но это не помогает при использовании условного форматирования. Я очень удивлен тем, как тяжело это было сделать.

Спасибо.

Ответы [ 5 ]

7 голосов
/ 14 сентября 2011

Вы можете получить доступ к внутреннему цвету условий пенообразования (а не к тому, какой ячейка в настоящее время является), если предположить, что это первое условие, примененное к ячейке:

Range("A1").FormatConditions(1).interior.color

Вот функция, которая будет возвращать цветовые коды для всех условных форматов, которые содержит ячейка. Он не вернет ничего, если нет условий, и если есть условие, но для него не установлен цвет, то он сообщает «нет».

Function ConditionalColor(ByVal cell As Range)

Dim colors As String
Dim i As Long

For i = 1 To Range(cell.Address).FormatConditions.count
    If Range(cell.Address).FormatConditions(i).Interior.Color <> 0 Then
        colors = colors & "Condition " & i & ": " & _
        Range(cell.Address).FormatConditions(i).Interior.Color & vbLf
    Else
        colors = colors & "Condition " & i & ": None" & vbLf
    End If
Next

If Len(colors) <> 0 Then
    colors = Left(colors, Len(colors) - 1)
End If

ConditionalColor = colors

End Function

UPDATE : В случае, если вам интересно (я был), цветовой код, который использует Excel, на самом деле BGR, а не RGB. Поэтому, если вы хотите преобразовать код в значения RGB, вы можете использовать это:

Function GetRGB(ByVal cell As range) As String

Dim R As String, G As String
Dim B As String, hexColor As String
hexCode = Hex(cell.Interior.Color)

'Note the order excel uses for hex is BGR.
B = Val("&H" & Mid(hexCode, 1, 2))
G = Val("&H" & Mid(hexCode, 3, 2))
R = Val("&H" & Mid(hexCode, 5, 2))

GetRGB = R & ":" & G & ":" & B
End Function
6 голосов
/ 21 сентября 2011

Привет. Ответы, которые вы предоставили, не сработали, потому что я использую цветовую шкалу, поэтому она не возвращает нормальные 3 значения условия.

После долгих поисков я нашел один обходной путь, который работает.То есть взять данные и поместить их в слово, а затем скопировать обратно в Excel, чтобы диапазон в ячейке приобрел истинный цвет, чтобы сработал Interior.Color.Я нашел кого-то, кто взял и поместил это в VBA.Вот ссылка , если кто-то еще хочет это сделать.

4 голосов
/ 19 ноября 2015

У меня нет ответа, который работает с Excel 2007 или ниже, но начиная с Excel 2010 и далее вы можете использовать следующее (изменяя диапазон в соответствии с требованиями):

Range("A1").DisplayFormat.Interior.ColorIndex

К счастью, хотя программное обеспечениекоторый мне нужен, поддерживается в Excel 2003 и более поздних версиях, на самом деле он требуется только в процедуре тестирования, а модуль тестирования удален из рабочих версий.

2 голосов
/ 14 сентября 2011

Приведенный ниже код был взят из VBAExpress, все авторские права также на автора - byundt.

Возможно, потребуется изменить его для Excel 2007.

Исходная ссылка

Function ConditionalColor(rg As Range, FormatType As String) As Long
     'Returns the color index (either font or interior) of the first cell in range rg. If no _
    conditional format conditions apply, Then returns the regular color of the cell. _
    FormatType Is either "Font" Or "Interior"
    Dim cel As Range
    Dim tmp As Variant
    Dim boo As Boolean
    Dim frmla As String, frmlaR1C1 As String, frmlaA1 As String
    Dim i As Long

     'Application.Volatile    'This statement required if Conditional Formatting for rg is determined by the _
    value of other cells

    Set cel = rg.Cells(1, 1)
    Select Case Left(LCase(FormatType), 1)
    Case "f" 'Font color
        ConditionalColor = cel.Font.ColorIndex
    Case Else 'Interior or highlight color
        ConditionalColor = cel.Interior.ColorIndex
    End Select

    If cel.FormatConditions.Count > 0 Then
         'On Error Resume Next
        With cel.FormatConditions
            For i = 1 To .Count 'Loop through the three possible format conditions for each cell
                frmla = .Item(i).Formula1
                If Left(frmla, 1) = "=" Then 'If "Formula Is", then evaluate if it is True
                     'Conditional Formatting is interpreted relative to the active cell. _
                    This cause the wrong results If the formula isn 't restated relative to the cell containing the _
                    Conditional Formatting--hence the workaround using ConvertFormula twice In a row. _
                    If the Function were Not called using a worksheet formula, you could just activate the cell instead.
                    frmlaR1C1 = Application.ConvertFormula(frmla, xlA1, xlR1C1, , ActiveCell)
                    frmlaA1 = Application.ConvertFormula(frmlaR1C1, xlR1C1, xlA1, xlAbsolute, cel)
                    boo = Application.Evaluate(frmlaA1)
                Else 'If "Value Is", then identify the type of comparison operator and build comparison formula
                    Select Case .Item(i).Operator
                    Case xlEqual ' = x
                        frmla = cel & "=" & .Item(i).Formula1
                    Case xlNotEqual ' <> x
                        frmla = cel & "<>" & .Item(i).Formula1
                    Case xlBetween 'x <= cel <= y
                        frmla = "AND(" & .Item(i).Formula1 & "<=" & cel & "," & cel & "<=" & .Item(i).Formula2 & ")"
                    Case xlNotBetween 'x > cel or cel > y
                        frmla = "OR(" & .Item(i).Formula1 & ">" & cel & "," & cel & ">" & .Item(i).Formula2 & ")"
                    Case xlLess ' < x
                        frmla = cel & "<" & .Item(i).Formula1
                    Case xlLessEqual ' <= x
                        frmla = cel & "<=" & .Item(i).Formula1
                    Case xlGreater ' > x
                        frmla = cel & ">" & .Item(i).Formula1
                    Case xlGreaterEqual ' >= x
                        frmla = cel & ">=" & .Item(i).Formula1
                    End Select
                    boo = Application.Evaluate(frmla) 'Evaluate the "Value Is" comparison formula
                End If

                If boo Then 'If this Format Condition is satisfied
                    On Error Resume Next
                    Select Case Left(LCase(FormatType), 1)
                    Case "f" 'Font color
                        tmp = .Item(i).Font.ColorIndex
                    Case Else 'Interior or highlight color
                        tmp = .Item(i).Interior.ColorIndex
                    End Select
                    If Err = 0 Then ConditionalColor = tmp
                    Err.Clear
                    On Error GoTo 0
                    Exit For 'Since Format Condition is satisfied, exit the inner loop
                End If
            Next i
        End With
    End If

End Function
0 голосов
/ 24 августа 2015

Простой способ: распечатать электронную таблицу.Вставьте его в краску.Используйте инструмент пипетки, чтобы найти цвет.Нажмите Редактировать цвет.

BOOM нашел вашу информацию RGB, которую вы можете ввести обратно в excel

...