2014-06-10 7 views
8

Stavo cercando di modificare in modo incrementale il colore di sfondo di una cella in nero, e ho scoperto che il metodo Range.Interior.Color restituisce un Long che è apparentemente arbitrario. Guardando la documentazione su MSDN, non c'è quasi nulla su ciò che rappresenta questo numero. C'è un modo per restituire il valore RGB da questo lungo. Ho effettivamente bisogno del contrario della funzione RGB (rosso, verde, blu).Restituisce i valori RGB da Range.Interior.Color (o qualsiasi altra proprietà Color)

risposta

12

Risposta breve:

Non v'è alcun costruito in funzione di questo. Devi scrivere la tua funzione.

lungo Risposta:

Il tempo che viene restituito dalla proprietà Interior.Color è una conversione decimale dei numeri esadecimali tipici che siamo abituati a vedere per i colori in HTML per esempio "66FF66". Inoltre, la costante xlNone (-4142) può essere passata per impostare la cella in modo che non abbia colore sullo sfondo, tuttavia tali celle sono contrassegnate in bianco RGB(255, 255, 255) dalla proprietà Get. Sapendo questo, possiamo scrivere una funzione che restituisce uno o tutti i valori RGB appropriati.

Fortunatamente, un tipo che il signor Allan Wyatt ha fatto proprio qui!

Determining the RGB Value of a Color

26

Questo numero "arbitrario" è una combinazione matematica dei valori RGB (R * 256^2 + G * 256 + B) e una conversione del valore di colore esadecimale in un numero decimale (base 16 alla base 10), a seconda del modo in cui si desidera guardarlo. Solo basi diverse. Di seguito è riportato il metodo che utilizzo nel file addin XLAM che ho scritto per Excel. Questo metodo è tornato utile molte volte. Ho incluso la documentazione nel mio file di addin.

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
' Function   Color 
' Purpose    Determine the Background Color Of a Cell 
' @Param rng   Range to Determine Background Color of 
' @Param formatType Default Value = 0 
'      0 Integer 
'      1 Hex 
'      2 RGB 
'      3 Excel Color Index 
' Usage    Color(A1)  --> 9507341 
'      Color(A1, 0) --> 9507341 
'      Color(A1, 1) --> 91120D 
'      Color(A1, 2) --> 13, 18, 145 
'      Color(A1, 3) --> 6 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
Function Color(rng As Range, Optional formatType As Integer = 0)  As Variant 
    Dim colorVal As Variant 
    colorVal = Cells(rng.Row, rng.Column).Interior.Color 
    Select Case formatType 
     Case 1 
      Color = Hex(colorVal) 
     Case 2 
      Color = (colorVal Mod 256) & ", " & ((colorVal \ 256) Mod 256) & ", " & (colorVal \ 65536) 
     Case 3 
      Color = Cells(rng.Row, rng.Column).Interior.ColorIndex 
     Case Else 
      Color = colorVal 
    End Select 
End Function 
10

bello vedere che il signor Wyatt utilizza il metodo veloce di colore in RGB

R = C Mod 256 
G = C \ 256 Mod 256 
B = C \ 65536 Mod 256 

che è molte volte più veloce di quelli che utilizzano esadecimale str con sinistro metà destra che alcuni consigliamo

2

L'altra risposta non ha funzionato per me. Ho trovato che:

R = C And 255 
G = C \ 256 And 255 
B = C \ 256^2 And 255 

e ha funzionato correttamente.

+0

Sia Yours che Harry lavorano entrambi. F.I. Valore rosso di 'RGB (50,100,200) = RGB (50,100,200) Mod 256' e valore rosso di 'RGB (50,100,200) = RGB (50,100,200) E 255' – Mill

Problemi correlati