Discussione:
Formattazione condizionale con più condizioni
(troppo vecchio per rispondere)
AndreaExcel
2006-04-24 13:05:02 UTC
Permalink
Ciao a tutti.
In un foglio ho una cella che può contenere 6 diversi valori. Devo fare in
modo che ad ogni valore corrisponda un colore di sfondo della cella
differente.
La formattazione condizionale mi consente di gestire al massimo 3
condizioni. Come posso fare per le restanti?

Esempio:
VALORE COLORE SFONDO
A Rosso
B Giallo
C Blu
D Verde
E Arancio
F Azzurro

Mi andrebbe bene, eventualmente, anche una macro VBA.

Grazie a tutti.
Andrea
Mauro Gamberini
2006-04-24 13:13:54 UTC
Permalink
Post by AndreaExcel
In un foglio ho una cella che può contenere 6 diversi valori. Devo fare in
modo che ad ogni valore corrisponda un colore di sfondo della cella
differente.
La formattazione condizionale mi consente di gestire al massimo 3
condizioni. Come posso fare per le restanti?
Google è tuo amico:

http://groups.google.it/groups/search?hl=it&q=excel+formattazione+condizionale+pi%C3%B9+di+3
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
AndreaExcel
2006-04-26 09:59:02 UTC
Permalink
Ho provato a seguire il tuo (saggio) consiglio di ricercare su Google un
aiuto al mio problema, purtroppo non sono riuscito a mettere in pratica
compiutamente le informazioni che ho trovato.

Nel codice VBA del mio foglio Excel ho creato un sub con il seguente codice:

Sub Worksheet_Change(strNomeSheet As String)
Dim rng As Range
Dim rCell As Range
Dim sStr As String
Dim Target As Range
On Error GoTo EsciWorksheet_Change

ThisWorkbook.Sheets(strNomeSheet).Activate


Set rng = Range("H:H")


If Not Intersect(Target, rng) Is Nothing Then
For Each rCell In Target.Cells
With rCell
Select Case Trim(LCase(.Value))


Case LCase("No Change")
.Interior.ColorIndex = 1


Case LCase("Slipping")
.Interior.ColorIndex = 2


Case LCase("Ahead")
.Interior.ColorIndex = 3


Case LCase("On time")
.Interior.ColorIndex = 4


Case LCase("Finished")
.Interior.ColorIndex = 5

Case Else
.Interior.ColorIndex = xlNone


End Select


End With
Next
End If
EsciWorksheet_Change:
MsgBox CStr(Err.Number) & " " & Err.Description

End Sub

A questo sub devo necessariamente passare come parametro il nome dello sheet
su cui eseguire la macro; infatti questo sub viene richiamato in un Public
Sub che accorpa ed esegue assieme alcuni sub che ho già creato.

Compilando il Progetto VBA non ho errori, ma quando lancio il report ottengo
l’errore “5 chiamata di routine o argomento non validi”: il risultato è che
vengono correttamente eseguite gli altri sub, ma non quello della
formattazione condizionale. Come posso ovviare all’errore? Credo che il
problema stia nella variabile Target. Non è possibile semplificare il codice,
dicendo di controllare i valori delle celle della colonna H e applicare le
regole di formattazione di cui sopra?

Grazie.
Andrea
Mauro Gamberini
2006-04-26 10:19:54 UTC
Permalink
Post by AndreaExcel
Sub Worksheet_Change(strNomeSheet As String)
Se(se) ho capito comincerei a dare un'occhiatina
a:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

End Sub

nel modulo di codice di ThisWorkbook.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
AndreaExcel
2006-04-26 10:18:02 UTC
Permalink
Scusa Mauro, ho capito come risolvere il problema. E' proprio vero che ogni
tanto una pausa caffé serve...

Grazie ancora, siete stati tutti gentilissimi.
Andrea
Post by AndreaExcel
Ho provato a seguire il tuo (saggio) consiglio di ricercare su Google un
aiuto al mio problema, purtroppo non sono riuscito a mettere in pratica
compiutamente le informazioni che ho trovato.
Sub Worksheet_Change(strNomeSheet As String)
Dim rng As Range
Dim rCell As Range
Dim sStr As String
Dim Target As Range
On Error GoTo EsciWorksheet_Change
ThisWorkbook.Sheets(strNomeSheet).Activate
Set rng = Range("H:H")
If Not Intersect(Target, rng) Is Nothing Then
For Each rCell In Target.Cells
With rCell
Select Case Trim(LCase(.Value))
Case LCase("No Change")
.Interior.ColorIndex = 1
Case LCase("Slipping")
.Interior.ColorIndex = 2
Case LCase("Ahead")
.Interior.ColorIndex = 3
Case LCase("On time")
.Interior.ColorIndex = 4
Case LCase("Finished")
.Interior.ColorIndex = 5
Case Else
.Interior.ColorIndex = xlNone
End Select
End With
Next
End If
MsgBox CStr(Err.Number) & " " & Err.Description
End Sub
A questo sub devo necessariamente passare come parametro il nome dello sheet
su cui eseguire la macro; infatti questo sub viene richiamato in un Public
Sub che accorpa ed esegue assieme alcuni sub che ho già creato.
Compilando il Progetto VBA non ho errori, ma quando lancio il report ottengo
l’errore “5 chiamata di routine o argomento non validi”: il risultato è che
vengono correttamente eseguite gli altri sub, ma non quello della
formattazione condizionale. Come posso ovviare all’errore? Credo che il
problema stia nella variabile Target. Non è possibile semplificare il codice,
dicendo di controllare i valori delle celle della colonna H e applicare le
regole di formattazione di cui sopra?
Grazie.
Andrea
AndreaExcel
2006-04-26 11:15:02 UTC
Permalink
Mi è bastato solo aggiungere l'istruzione

Set Target = Range("37:47")

per limitare il range di righe all'interno del quale applicare le regole di
formattazione.

Ciao.
Andrea
Post by AndreaExcel
Scusa Mauro, ho capito come risolvere il problema. E' proprio vero che ogni
tanto una pausa caffé serve...
Ah, bene.
Però forse qualcun altro sta seguendo il thread e se postassi
la soluzione potresti risolvergli un problema.
Buon lavoro.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
Mauro Gamberini
2006-04-26 10:28:20 UTC
Permalink
Post by AndreaExcel
Scusa Mauro, ho capito come risolvere il problema. E' proprio vero che ogni
tanto una pausa caffé serve...
Ah, bene.
Però forse qualcun altro sta seguendo il thread e se postassi
la soluzione potresti risolvergli un problema.
Buon lavoro.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
Thunder
2006-04-24 13:49:33 UTC
Permalink
Post by AndreaExcel
Ciao a tutti.
In un foglio ho una cella che può contenere 6 diversi valori. Devo fare in
modo che ad ogni valore corrisponda un colore di sfondo della cella
differente.
La formattazione condizionale mi consente di gestire al massimo 3
condizioni. Come posso fare per le restanti?
VALORE COLORE SFONDO
A Rosso
B Giallo
C Blu
D Verde
E Arancio
F Azzurro
Mi andrebbe bene, eventualmente, anche una macro VBA.
Grazie a tutti.
Andrea
Ciao Andrea,

prima di tutto vorrei dire che Mauro (ciao) ti ha dato un consiglio che
spesso viene sottovalutato o addirittura tralasciato: con Google ottieni
risposte più veloci ed immediate. In più si evita di aprire decine e decine
di thread contenenti gli stessi casi`.

Comunque, non sapendo quanta dimestichezza hai con VBA, ti allego il codice
che potrebbe fare al caso tuo:

fai click col tasto dx del mouse sulla linguetta del tuo foglio e poi su
Visualizza codice. Poi incolla quanto segue:

Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Value
Case Is = "a"
Target.Interior.ColorIndex = 1
Case Is = "b"
Target.Interior.ColorIndex = 2
Case Is = "c"
Target.Interior.ColorIndex = 3
Case Is = "d"
Target.Interior.ColorIndex = 4
Case Is = "e"
Target.Interior.ColorIndex = 5
Case Is = "f"
Target.Interior.ColorIndex = 6
End Select
End Sub

Chiaramente devi acmbiare i valori secondo le tue necessità.

Ciao
Thunder
Pippo
2006-04-24 18:20:22 UTC
Permalink
Post by AndreaExcel
La formattazione condizionale mi consente di gestire al massimo 3
condizioni. Come posso fare per le restanti?
VALORE COLORE SFONDO
A Rosso
B Giallo
C Blu
D Verde
E Arancio
F Azzurro
Mi andrebbe bene, eventualmente, anche una macro VBA.
Dai uno sguardo alla seguente macro (segnalata da Tiziano Marmiroli nel
post http://snipurl.com/pm8q) da adattare al tuo caso:

'------------------------------------------------------------------------------------

Private Sub Worksheet_Change(ByVal Target As Range)

Dim icolor As Integer
If Not Intersect(Target, Range("A1:A10")) is Nothing Then
Select Case Target
Case 1 To 5
icolor = 6
Case 6 To 10
icolor = 12
Case 11 To 15
icolor = 7
Case 16 To 20
icolor = 53
Case 21 To 25
icolor = 15
Case 26 To 30
icolor = 42
Case Else
'Whatever
End Select
Target.Interior.ColorIndex = icolor
End If

End Sub

'---------------------------------------------------------


PS:La macro e' stata trovata, come suggeriva Mauro Gamberini, mediante
ricerche con "goole"!!! ... ;-)) ...

Ciao
Pippo
2006-04-24 18:28:30 UTC
Permalink
Post by Pippo
PS:La macro e' stata trovata, come suggeriva Mauro Gamberini, mediante
ricerche con
"goole"!!! ... ;-)) ...
^^^^^^^^^

Rettifico:
volevo scrivere.... mediante ricerche con "google" !! ;-))

Ciao
Antonio
2006-05-01 09:34:01 UTC
Permalink
Andrea scusa il ritardo con cui ti scrivo ma mancavo da molto dal forum
comunque se non hai ancora risolto prova con il seguente codice cambiando il
range relativo alle celle interessate che possono essere anche più di sei
basta aggiungere righe di codice cambia anche valori io ho messo 10,20,30 ecc
tu metti i tuoi lascia invariata la prima riga :

Case ""
Target.Interior.ColorIndex = None

in quanto ti permette in caso di dato cancellato, di ripristinare lo sfondo
di default del foglio di lavoro


Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A1:A6")) Is Nothing Then Exit Sub

Select Case Target
Case ""
Target.Interior.ColorIndex = None
Case "10"
Target.Interior.ColorIndex = 3
Case "20"
Target.Interior.ColorIndex = 4
Case "30"
Target.Interior.ColorIndex = 6
Case "40"
Target.Interior.ColorIndex = 7
Case "50"
Target.Interior.ColorIndex = 14
Case "60"
Target.Interior.ColorIndex = 32


End Select
End Sub


Ciao Antonio

Loading...