formattazione condizionale excel 2003
Hai un problema con Excel? 
formattazione condizionale excel 2003
di meonly data: 10/12/2012 22:02:31
ciao,
uso questo piccolo codice per formattare le celle di un foglio di lavoro (excel 2003 ha solo tre possibilità di formattazione condizionale) a seconda di quello che c'è scritto dentro. Il tutto funziona fino a quando però per cancellare non seleziono più celle insieme. Allora il codice si blocca sulla prima riga del "case" e mi da come errore "tipo non corrispondente" .
Qualcuno sa come ovviare all'inconveniente?
Grazie e saluti
me
Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("d5:d88")) Is Nothing Then Exit Sub
Select Case Target
Case ""
Target.Interior.ColorIndex = None
Case "11.30"
Target.Interior.ColorIndex = 20
Case "12.00"
Target.Interior.ColorIndex = 4
Case "16.00"
Target.Interior.ColorIndex = 3
Case "16.30"
Target.Interior.ColorIndex = 6
Case "17.00"
Target.Interior.ColorIndex = 43
Case "17.30"
Target.Interior.ColorIndex = 35
Case "18.00"
Target.Interior.ColorIndex = 36
End Select
End Sub |
di Vecchio Frac data: 11/12/2012 10:03:51
Fai le modifiche secondo il codice rivisitato.
In particolare nota:
- ricevi l'errore perchè il Select Case si aspetta di lavorare solo su una cella e non su più celle come accade quando ne selezioni diverse. Quindi bisogna introdurre un piccolo ciclo per ogni cella del Target, che viene eseguito su tutte le celle della selezione
- la costante del primo Case è xlNone, non None solamente
- è meglio disattivare gli eventi prima di modificare una cella durante un evento di modifica (con Application.EnableEvents) e riattivarli all'uscita
- l'inconveniente di consentire la selezione di più celle è che se selezioni, poniamo, D3:D7 e poi digiti "12.00", allora con questo codice anche le celle D3 e D4, che non dovrebbero essere consentite, ricadono nel Target e quindi colorizzate.
Spunti di miglioramento:
- Il codice deve prevedere anche la possibilità che l'utente digiti altri caratteri oltre il punto (è un orario vero? a me piace scrivere gli orari così: 11:50).
- Se l'utente batte uno spazio dopo il numero e poi preme invio che succede?
- per rendere più elegante e leggibile il codice, indentalo meglio
- puoi sfruttare With per scrivere meno codice ridondante
edit: mi sono accorto di un errore rispetto a un mio post precedente di cui non bisogna tener conto, sorry.
'codice rivisitato
Sub Worksheet_Change(ByVal Target As Range)
Dim cella As Range
If Intersect(Target, Range("d5:d88")) Is Nothing Then Exit Sub
Application.EnableEvents = False
For Each cella In Target
Select Case cella
Case ""
cella.Interior.ColorIndex = xlNone 'non None
Case "11.30"
cella.Interior.ColorIndex = 20
Case "12.00"
cella.Interior.ColorIndex = 4
Case "16.00"
cella.Interior.ColorIndex = 3
Case "16.30"
cella.Interior.ColorIndex = 6
Case "17.00"
cella.Interior.ColorIndex = 43
Case "17.30"
cella.Interior.ColorIndex = 35
Case "18.00"
cella.Interior.ColorIndex = 36
End Select
Next
Application.EnableEvents = True
End Sub |
di meonly (utente non iscritto) data: 11/12/2012 22:01:40
Grazie, funziona tutto.
Se penso che ci ho passato tre giorni a pensare come fare e tu in tre minuti mi hai risolto il problema mi sento davvero un po' gnocco!
E' da poco che scrivo codici in VBA e mi arrabatto come posso, copiando qua e là ed utilizzando il registratore macro per poi modificare i risultati a mio uso e consumo.
Si infatti sono orari, ed anche a me piace scriverli in altro modo, ma i dati provengono da un gestionale e me li devo tenere così. Sui fogli di excel gli orari vengono "pescati" da un elenco ed è impossibile scriverli diversamente.
Grazie davvero!
Sull'indentazione hai ragione, ma era un codice talmente corto che non ci ho badato.
di Vecchio Frac data: 12/12/2012 10:15:58
Non sentirti in imbarazzo, siamo qui tutti per imparare uno dall'altro.
Fai bene sia ad usare il registratore, sia a rivederlo perchè alle volte dà risultati sconcertanti.
Piuttosto verifica che gli orari che provengono da altra fonte dati siano davvero considerati orari e non testo (guarda la differenza tra scrivere "12.00" e "12:00").
Sugli spunti di miglioramento, ci hai ragionato un po' sopra per vedere se devi modificare opportunamente il tuo codice? :)
Vuoi Approfondire?