2009-06-15 8 views
12

Supponiamo Ho la seguente gamma da (A1: C3)Formattazione condizionale di Excel 2007: come ottenere il colore della cella?

A B C 
1 -1 1 1 
2 -1 0 0 
3 0 0 1 

ora ho selezionato la seguente gamma, e formattati utilizzando Formattazione condizionale (utilizzando di default giallo rosso scala di colore verde) .... ora colori di serie divennero

A   B   C 
1 Green Red  Red 
2 Green Yellow Yellow 
3 Yellow Yellow Red 

Ora voglio chiedere il colore di qualsiasi cella nell'intervallo, per esempio MsgBox range ("A1"). Interior.Color ma non dire che è verde, perché? Plz puoi aiutarmi?

Range ("A1"). Interior.Color restituisce sempre 16777215 Range ("A1"). Interior.ColorIndex restituisce sempre -4142

(non importa se il colore della A1 è rosso, blu, verde , ...)

Range ("A1", "C3"). FormatConditions.Count questo restituisce sempre 0, perché?

risposta

0

poiché io possa avere più di tre colori differenti in un tempo ... non ho trovato un buon modo di gestire questo con i colori di default di formattazione condizionale ... ho fatto in questo modo. poi ogni volta che chiedo il colore della cella, recupero il colore giusto!

for (int t = 0; t < d_distinct.Length; t++) 
{       
    Excel.FormatCondition cond = 
    (Excel.FormatCondition)range.FormatConditions.Add(
    Excel.XlFormatConditionType.xlCellValue, 
    Excel.XlFormatConditionOperator.xlEqual, 
    "="+d_distinct[t], 
    mis, mis, mis, mis, mis); 
    cond.Interior.PatternColorIndex = 
    Excel.Constants.xlAutomatic; 
    cond.Interior.TintAndShade = 0; 
    cond.Interior.Color = ColorTranslator.ToWin32(c[t]); 
    cond.StopIfTrue = false;       
} 

d_distinct contiene tutti i valori distinti in un intervallo ... c è un colore [] che contiene colori distinti per ogni valore distinto! questo codice può essere facilmente tradotto in vb!

0

Secondo XlColorIndex EnumerationColorIndex=-4142 mezzi nessun colore

Quanto al perché questo accade io sono all'oscuro. Il valore restituito sembra essere la rappresentazione decimale del valore RGB. La versione migliorata del this script per decifrare il valore in notazione esadecimale RGB

Function RGB(CellRef As Variant) 
    RGB = ToHex(Range(CellRef).Interior.Color) 
End Function 

Function ToHex(ByVal N As Long) As String 
    strH = "" 
    For i = 1 To 6 
     d = N Mod 16 
     strH = Chr(48 + (d Mod 9) + 16 * (d \ 9)) & strH 
     N = N \ 16 
    Next i 
    strH2 = "" 
    strH2 = Right$(strH, 2) & Mid$(strH, 3, 2) & Left$(strH, 2) 
    ToHex = strH2 
End Function 
+1

Sono interessato solo nel colore o ColorIndex della cellula (che è di colore utilizzando la formattazione condizionale) solo ... In ogni modo, grazie –

0

Per ottenere il colore di una cella in un intervallo, è necessario fare riferimento alla singola cella all'interno della matrice in forma di Range ("A1" , "C3"). Celle (1,1) (per la cella A1). L'aiuto di Excel è abbastanza buono se cerchi il nome della proprietà con cui stai avendo problemi.

Inoltre, Excel 2007 utilizza Integers per i suoi tipi di colore, quindi la soluzione migliore è assegnare l'indice del colore a un numero intero e utilizzarlo nel programma. Per il vostro esempio, provate:

Green = Range("A1","C3").Cells(1,1).Interior.Color 
Yellow = Range("A1","C3").Cells(1,3).Interior.Color 
Red = Range("A1","C3").Cells(2,1).Interior.Color 

E poi per passare i colori per tutto rosso:

Range("A1","C3").Interior.Color = Red 

Anche in questo caso, consultare l'aiuto di Excel per come usare le cellule ([RowIndex], [ColumnIndex]) .

Se quanto sopra non funziona per voi, controllare per vedere che .Interior.PatternColorIndex è uguale a. In genere lo lascio impostato su xlAutomatic (a tinta unita) e potrebbe essere impostato su qualcos'altro se il colore non cambia.

+0

Intervallo MsgBox ("A1", "C3"). Cells (1, 1) .Interior.Color Intervallo MsgBox ("A1", "C3"). Cells (1, 1) .Interior.ColorIndex Questi due ancora restituire lo stesso 16777215 e -4142, rispettivamente –

+0

Intervallo MsgBox ("A1", "C3"). Cells (1, 1) .Interior.PatternColorIndex restituisce -4142 –

+0

Hai provato a cambiare manualmente il colore di sfondo tramite codice? –

10

.Interior.Color restituisce il colore "reale", non il risultato del colore con formattazione condizionale.

@sss: non è disponibile tramite l'API.

Il meglio che puoi fare è testare le stesse condizioni che hai usato nella formattazione condizionale.

Per evitare che ciò si traduca in un codice duplicato, suggerisco di spostare i criteri condizionali su un UDF.Esempi:

Function IsGroup1(ByVal testvalue As Variant) As Boolean 
    IsGroup1 = (testvalue < 0) 
End Function 

Function IsGroup2(ByVal testvalue As Variant) As Boolean 
    IsGroup1 = (testvalue = 0) 
End Function 

Function IsGroup3(ByVal testvalue As Variant) As Boolean 
    IsGroup1 = (testvalue > 0) 
End Function 

quindi utilizzare queste formule nella formattazione condizionale:

=IsGroup1(A1) 
=IsGroup2(A1) 
=IsGroup3(A1) 

Poi il codice, piuttosto che guardare al colore delle cellule, guarda per vedere se la condizione è soddisfatta:

If IsGroup1(Range("$A$1").Value) Then MsgBox "I'm red!" 
+0

puoi mostrarmi come ottenere il colore con formattazione condizionale? –

+1

come posso aumentare l'importanza della risposta? –

+0

Fare clic sul pulsante "su" sopra il numero "0" a sinistra della risposta, oppure se è la risposta che si desidera accettare, fare clic sul "segno" delineato visualizzato a sinistra della risposta. – richardtallent

0

Non sembra che il colore "Formato condizionale" sia disponibile a livello di programmazione. Quello che suggerirei, invece, è scrivere una piccola funzione che calcola il colore della cella, e quindi basta impostare una macro per eseguirla sulla cella attiva ogni volta che hai modificato il valore. Per esempio (scusate per la pseudo-codice - Io non sono un esperto di VBA più):

Function GetColorForThisCell(Optional WhatCell as String) as Int 

    If WhatCell="" Then WhatCell = ActiveCell 

    If Range(WhatCell).value = -1 then GetColorForThisCell = vbGreen 
    If Range(WhatCell).value = 0 then GetColorForThisCell = vbYellow 
    If Range(WhatCell).value = 1 then GetColorForThisCell = vbRed 
End Function 

Sub JustEditedCell 
    ActiveCell.color = GetColorForThisCell() 
End Sub 

Sub GetColorOfACell(WhatCell as string) 
    Msgbox(GetColorForThisCell(WhatCell)) 
End Sub 

Anche se non sarebbe in grado di utilizzare il built-in Excel Formattazione condizionale, questo sarebbe ottenere la stessa cosa e sarai in grado di leggere il colore dal codice. Ha senso ciò?

6

È necessario fare riferimento allo <Cell>.FormatConditions(index that is active).Interior.ColorIndex per recuperare il colore di formattazione condizionale di una cella.

Si può fare riferimento al link qui sotto per un esempio:

http://www.xldynamic.com/source/xld.CFConditions.html#specific

+0

+1, ma si noti che ' .FormatConditions (index che è attivo)' restituisce un oggetto che sarà necessario eseguire il cast per digitare 'FormatCondition'. –

Problemi correlati