Funzione Utente =COLORE. - dal 06/02/05 pagina vista: volte

Questo esercizio per concetto apparterrebbe alla sezione "Formule" di questo sito, ma dal momento che useremo il Vba per crearci una Funzione Utente, lo inseriamo in questa sezione.

L'esigenza di usare una funzione "fai da te" (vedi "Funzioni Utente in vba" sull'altro sito) è stata motivata da una richiesta pervenutami: " esiste in excel una condizione che individui un colore come in Vba? esempio : nella cella D1 vorrei mettere questa condizione SE la cella A1 è di colore giallo mi devi sottrarre la cella C1-B1".

Non ho trovato nessuna indicazione di Funzioni Native di Excel su come "intercettare la modifica" del colore di una cella, (la funzione =CELLA non serve in questo caso) e non si può usare la "Formattazione Condizionale" che lavora soltanto su condizioni legate a valori o formule (e non a colori). Anzi, se il colore in una cella viene modificato in base ad una Formattazione Condizionale predisposta dall'utente, il colore che vedremo NON è lo stesso che otterremo usando la proprietà ColorIndex di Interior di una cella, tramite la selezione di un colore dalla palette Colori di Excel. La formattazione condizionale non modifica il ColorIndex delle celle, ma è come se alle celle venisse "aggiunto" un colore sopra il reale colore che il Vba vede.

Questo è un aspetto di cui non ho ancora chiaro il perchè e se qualche pellegrino mi spiegherà l'arcano, sarà il benvenuto. Tanto per capire meglio, vediamo un esempio e come vengono identificati diversamente i colori. Impostiamo nella cella A1 una formattazione condizionale come in questo esempio: se il valore nella cella sarà tra 0 e 15, nessun colore, se tra 16 e 30 vogliamo la cella gialla, vediamo l'immagine dell'impostazione data:

Inserendo 25 nella cella A1 otterremo l'attivazione della Formatt. Cond. e questo sarà il risultato visivo:

noi vediamo quindi il colore giallo, MA IL CODICE VBA non è daccordo: infatti vede la cella come se fosse al naturale - cioè senza colore: come indice colore assume questo valore : = -4142 , che è lo stesso equivalente a ColorIndex = xlNone, questo è quello che il codice vede:

Se invece togliamo la formattazione condizionale e il colore giallo alla cella lo applichiamo manualmente, usando la palette colori (oppure da Formato Celle/Motivo), il colore viene correttamente identificato dal codice (il codice colore del giallo è 6), infatti:

 

Dopo queste premesse, presento quindi una semplice Funzione, che ho chiamato COLORE, e che andrà posta in un modulo standard, potendola poi richiamare come una normale funzione sul foglio di lavoro (ma anche in macro vba). La sua sintassi è questa:

  • COLORE(rif ; indice) - dove con rif si metterà il riferimento alla cella di cui controllare il colore, e con indice indicheremo il codice colore che vogliamo verificare. La funzione l'ho impostata per restituire un valore logico, VERO o FALSO. (per i codici colore vedi tabella in fondo alla pagina).

Per cui, in risposta alla domanda sopra, la formula da inserire nella cella D1 sarebbe questa:

  • =SE(COLORE(A1;3);C1-B1;"") - cioè : se e vero che il colore della cella A1 è rosso (3), allora mi sottrai B1 da C1, altrimenti mi lasci la cella vuota (la D1).

E questa la funzione, che tradotta in "pellegrinese", recita: se la cella (primo argomento della funzione) ha il colore di fondo diverso dal codice colore rappresentato da indice (secondo argomento della funzione) mi restituisci FALSO alla funzione stessa, altrimenti VERO:

Public Function COLORE(Cella As Range, indice As Long) As Boolean
If Cella.Interior.ColorIndex <> indice Then
COLORE = False
Else
COLORE = True
End If
End Function

La funzione agirà comunque NON al cambio manuale del colore in una cella (evento questo che non viene intercettato da nessun "evento" tipico del foglio di lavoro), ma al variare di uno o più valori nelle celle richiamate nella formula.

Non so a questo punto a chi potrà servire una funzione come questa, ma tantè, e chi la cercava ora la trova disponibile.

La tabella dei codici colore della palette colori standard:


 

Buon lavoro.

prelevato sul sito www.ennius.altervista.org