2011-09-13 20 views
6

estoy usando una escala de colores para mi formato condicional en Excel 2007 y estoy teniendo dificultades para encontrar el código de color de relleno para las células condicionalmente formateados. Sé que Interior.Color devuelve el valor de color predeterminado, pero eso no ayuda cuando se utiliza el formato condicional. Estoy retransmitido bastante sorprendido de lo difícil que ha sido hacer.¿Cómo puedo encontrar el valor de color de relleno de una celda con formato condicional en Excel 2007 utilizando VBA?

Gracias.

+0

Vea aquí: http://stackoverflow.com/questions/996384/excel-2007-conditional-formatting-how-to-get-cell-color – RBarryYoung

Respuesta

2

El código de abajo fue tomada de VBAExpress, todo el crédito también el autor original - byundt.

Es posible que tenga que ser modificado para Excel 2007.

Original Link

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 
7

Se puede acceder al interior de color de las condiciones fomatting (no lo que actualmente es la célula) como así, suponiendo que esta se aplica la primera condición de la célula:

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

Aquí es una función que devolverá los códigos de color para todos los formatos condicionales una célula contiene No devolverá nada si no hay condiciones, y si hay una condición pero no se establece ningún color para ella, entonces le dice "ninguna".

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 

ACTUALIZACIÓN: En caso de que son curiosos (que estaba), el código de color que utiliza Excel en realidad es BGR, no RGB. Así que si quería convertir el código para valores RGB, puede utilizar esto:

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 
5

Hola Las respuestas que ha proporcionado no funcionó porque estoy utilizando una escala de colores por lo que no devuelve los 3 valores normales de condición .

Después de mucho más la búsqueda encontré una solución que funciona. Eso es tomar los datos y ponerlo en palabras a continuación, copiar de nuevo en Excel haciendo el rango de ir a un verdadero color de la celda para Interior.Color funcionará. Encontré a alguien que lo tomó y lo puso en VBA. Aquí está el link si alguien más está buscando hacer esto.

+0

Correcto, la segunda línea de la función 'If Range (celda .Address) .FormatConditions (i) .Interior.Color <> 0 Then' genera > error 438 'El objeto no admite esta propiedad o el método' > Esto se debe a que utilizamos más de 3 condiciones. Su solución alternativa (pegar en Word y luego volver a Excel) parece ser la mejor opción. – ProtoVB

+1

¿Alguien sabe lo que sucede al pegar desde Excel a Word? Si entendemos que podríamos extraer el código de color. – ProtoVB

-3

manera fácil: pantalla Imprimir la hoja de cálculo. Pégalo en la pintura. Use la herramienta de pipeteo para encontrar el color. Haga clic en Editar color.

BOOM encontró su información RGB que se puede introducir de nuevo en Excel

2

no tengo una respuesta que funciona con Excel 2007 o inferior, pero desde Excel 2010 en adelante se puede utilizar el siguiente (cambiando el rango para adaptarse):

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

Afortunadamente, mientras que el software para el que lo necesite se admite en Excel 2003 en adelante, lo único que realmente lo requieren en un procedimiento de prueba y el módulo de prueba se retira de las versiones de producción.

Cuestiones relacionadas