› Sviluppare funzionalita su Microsoft Office con VBA › Coloro cella attiva
-
AutoreArticoli
-
Buongiorno, chiedo un consiglio per questo quesito, nel file che allego, ho creato con Vba il seguente codice, quando seleziono la cella attiva vuota mi colora la cella, ma se seleziono la cella con la formattazione condizionale (A1) questa non cambia colore è possibile con un codice che ciò avvenga oppure non è possibile?
nel file che allego
Allega il file perchè non c'è
se seleziono la cella con la formattazione condizionale (A1) questa non cambia colore è possibile con un codice che ciò avvenga oppure non è possibile?
Comunque credo che la formattazione condizionale abbia la precedenza alla formattazione manuale, anche se pilotata da codice.
Comunque credo che la formattazione condizionale abbia la precedenza alla formattazione manuale, anche se pilotata da codice.
Esatto! O da codice o preparata manualmente, la formattazione condizionale ha la priorità sulla formazione normale proprio per la funzione che ricopre
Confermo, ho fatto un po' di prove e la formattazione condizionale è dominanete rispetto sia alla formattazione "manuale" che impostata da Codice.
Il colore impostato in una cella dalla formattazione condizionale è leggibile tramite la proprietà DisplayFormat.Interior.Color che però è in sola lettura ovvero non può essere modificato.
Ciao Luca
Un'idea pazzesca, e valida solo a scopo didattico, è questa: se mi imbatto in una cella con formattazione condizionale allora ne salvo le impostazioni in una variabile pubblica (posizione e formati della condizione), quindi cancello la formattazione condizionale (e la cella assume il colore desiderato quando si sposta la selezione). Poi quando mi sposto in altra cella, prima di tutto reimposto la precedente recuperandole, se c'erano per quella cella, le impostazioni di formattazione condizionale. Quindi passo a esaminare la cella corrente e ricomincio il processo.
Non ne vale molto la pena però anche se sarebbe una sfida da proporre
Scusa ma con una formattazione condizionale multipla non ti sbrighi prima? Qualche giorno fa ho risposto ad un utente (ancora non l'ho rivisto) preparando un file con solo formattazione condizionale. Non ricordo quale fosse il topic, ma era verificare la data inserita e se minore di 1 mese cella gialla, invece se oltre la data cella rossa.
Dovrei avere ancora il file, potrei postarlo se può interessare, spero solo di ricordarne il nome
non posso aprirlo per verificare!!
Ecco qui una proposta. Solo per giocare, sia chiaro
(Il codice sostituisce tutto il tuo)
Option Explicit Private mycell As tCell Private Sub Workbook_SheetSelectionChange(ByVal sh As Object, ByVal Target As Range) 'Funziona If Target.FormatConditions.Count > 0 Then With mycell .addr = Target.Address .formul1 = Target.FormatConditions(1).Formula1 .coloridx = Target.FormatConditions(1).Interior.ColorIndex .hasformat = True End With Target.FormatConditions.Delete Target.Interior.ColorIndex = 8 ElseIf mycell.hasformat Then With sh.Range(mycell.addr) .FormatConditions.Add Type:=xlExpression, Formula1:=mycell.formul1 .FormatConditions(1).Interior.ColorIndex = mycell.coloridx .FormatConditions(1).StopIfTrue = False End With mycell.hasformat = False Else If mycell.addr <> "" Then sh.Range(mycell.addr).Interior.ColorIndex = 0 With mycell .addr = Target.Address .formul1 = "" .coloridx = 0 .hasformat = False End With Target.Interior.ColorIndex = 8 End If End Sub
Scusa ma con una formattazione condizionale multipla non ti sbrighi prima?
Ma cosa intendi di preciso? La formattazione condizionale si può attivare "se la cella è attiva" ? perchè lui voleva l'effetto visivo di una cella che si colora di azzurro quando sposta il cursore, mantenendo la formattazione esistente.
Nota sul mio codice di poco fa: se ci sono formattazioni multiple su una cella, queste non vengono mantenute. Bisogna ricrearle nel codice che però era solo un esempio della fattibilità, ma in produzione non complicherei così le cose.
Mi ero perso questo passaggio
perchè lui voleva l'effetto visivo di una cella che si colora di azzurro quando sposta il cursore, mantenendo la formattazione esistente
Con lo spostamento della cella non penso, ma basterebbe inserire un qualsiasi valore e magari impostare tramite formattazione condizionale lo stesso colore tra font e sfondo della cella
Ciao VF, ma funziona anche se la cella Avesse una Formattazione Condizionale condivisa con altre in un range
Ad esempio se io metto in formattazione condizionale il Range A1:A5?
A me dà errore sulla dichiarazione di variabile
Private mycell As tCell
User defined type not defined
Proposta completamente alternativa che ho applicato in un mio file.
Avevo preparato un calendario abnnuale in cui avevo riempito di formttazioni condizionali in intervalli non adiacenti
c'erano sabati, domeniche, festività, giorni di ferie, di malattia,di riposo, giorno presente e giorni lavorati,.....
PIù le relative combinazione (es festività in domenica)
Ad un certo punto la formattazione condizionale è diventata talmente complicata e macchinosa che ho preferito gestire la la colorazione di tutte le celle tramite macro.
Una macro scatenata da un Worksheet_Change.
Così' mi sono permesso di uscire anche dai limiti della formattazione condizionale (ad esempio lo spessore / tipo dei bordi) e di modificare anche altezze e larghezze delle celle.
Con la mia macro ho perso sicuramente in velocità di esecuzione ma per qullo che serviva a me e l'uso che facevo del file era perfetta.
Nota sul mio codice di poco fa: se ci sono formattazioni multiple su una cella, queste non vengono mantenute
Ciao,
una soluzione semplice: anziché togliere la FC alle eventuali celle con FC e poi colorarle, semplicemente aggiungiamo una nuova regola che imposti lo sfondo alla cella selezionata e la elimini quando viene "deselezionata". Il seguente codice (funzionante) dovrebbe chiarire:
Private Sub Workbook_SheetSelectionChange(ByVal sh As Object, ByVal Target As Range) 'Funziona Static rPrevCell As Range If Not rPrevCell Is Nothing Then With rPrevCell.FormatConditions If .Count > 0 Then .Item(1).Delete End With End If With Target(1, 1).FormatConditions.Add(xlCellValue, xlEqual, Formula1:=Target(1, 1)) .Priority = 1 .Interior.ColorIndex = 36 End With Set rPrevCell = Target(1, 1) End Sub
Notare la riga .Priority = 1 che mette in "primo piano" la nuova regola, che diventerà l'item(1).
Il codice andrebbe integrato ad esempio memorizzando la rPrevCell in un named range in modo da non perderlo quando si chiude il file o in caso debba funzionare su più fogli, anzi sarebbe meglio comuqne usare proprio un named range al posto della variabile static.
semplicemente aggiungiamo una nuova regola che imposti lo sfondo alla cella selezionata e la elimini quando viene "deselezionata"
Le cose più semplici e ovvie sono anche le più eleganti.
+1
-
AutoreArticoli