Formattazione condizionale con VBA

Storico discussioni

Formattazione condiz. VBA di Barbara
Salve ragazzi, complimenti per il forum innanzitutto, è interessantissimo, mi è stato spesso molto utile, ma stavolta ho proprio bisogno del vostro aiuto per risolvere un paio di problemi:
ho una serie di 4 colonne (b,c,d,e,f,) con dati che vengono aggiunti più o meno giornalmente ed avrei bisogno:
1- che il valore più alto ed il più basso delle colonne b, d, e, f vengano evidenziati con due colori del testo diversi;
2-poichè il valore del dato nella colonna c varia molto di rado vorrei che solo in corrispondenza della variazione venisse evidenziata l'intera riga ad es. con testo in grassetto o con sfondo diverso.
So che che non sono cose difficili ma non saprei proprio da dove partire, ... me la date una mano ? grazie in anticipo !!!!

di Mauro
Ciao Barbara,
La routine sottostante scorre la colonna A ed evidenzia in colore diverso il testo della cella col valore + alto. Lascio a te trovare la routine di calcolo x il valore + basso
Sub TrovaMax()
indi = 1
ComVal = 0
Do Until Range("A" & indi) = ""
If Range("A" & indi).Value > ComVal Then
ComVal = Range("A" & indi).Value
indRif = indi
End If
indi = indi + 1
Loop
Range("A" & indRif).Font.ColorIndex = 6
End Sub

Scorre la colonna A in corrispondenza della variazione evidenzia l'intera riga
Sub TrovaCamb()
indi = 2
Do Until Range("A" & indi) = ""
If Range("A" & indi).Value <> Range("A" & indi - 1).Value Then
Rows(indi & ":" & indi).Select
With Selection.Interior
.ColorIndex = 33
.Pattern = xlSolid
End With
End If
indi = indi + 1
Loop
End Sub

di Barbara
ciao Mauro, grazie tante per l'aiuto innanzitutto...ho provato il tuo codice ed ho adattato cosi' la prima parte perchè avevo bisogno che riportasse al colore originale i valori precedenti:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
indi = 2 'questo perchè nella prima è intestazione e non numeri
ComVal = 0

Do Until Range("B" & indi) = ""
If Range("B" & indi).Value >= ComVal Then
ComVal = Range("B" & indi).Value
indRif = indi
End If
indi = indi + 1
Loop
Range("B:B").Interior.ColorIndex = xlColorIndexNone
Range("B:B").Font.ColorIndex = xlColorIndexAutomatic
Range("B" & indRif).Interior.ColorIndex = 3
Range("B" & indRif).Font.ColorIndex = 2

potrebbe anche andare anche se mi da qualche problemino:
1) ovviamente mi cancella lo sfondo anche della cella B1 dove c'è il titolo della colonna e che non dovrebbe variare.
2) in assenza di numeri mi da errore
3) domanda: per ottenere la stessa cosa anche per la colonne D E ed F devo ripetere la routine per 4 volte? oppure c'è un modo più semplice visto che lo stesso lavoro vorrei farlo per i valori più bassi (mi troverei così la analoga routine ripetuta per 8 volte)?

per quanto riguarda la seconda parte invece ci dev'eesere proprio qualcosa che non va perchè non mi va ad evidenziare con il grassetto il testo delle celle corrispondenti al variare della cella B, ma semplicemente mi mantiene selezionata l'intera riga senza peraltro darmi modo di fare nient'altro
....so che forse sto approfittando della tua disponibilità, ma per me sarebbe veramente importante riuscire finalmente a finire questa cosa Grazie !!!!

di Mauro
Riguardo i problemini:
1) x evitare di modificare la prima riga devi operare cella x cella o dopo avere modificato la colonna ripristini la prima riga.
2)la funzione che testa la numericità di un campo è IsNumeric()
3)o ripeti 4 volte il ciclo o usi una routine con passaggio parametri

per quanto riguarda la seconda parte non ti mantiene selezionata l'intera riga semplicemente la colora! Se non vuoi modificare lo sfondo ma mettere il carattere grassetto, fai qualche prova con il generatore di macro e vedi come varia il codice.

Se vuoi sdebitarti un modo c'è, tieni d'occhio il forum e dai il tuo aiuto se vedi una discussione a cui riesci a rispondere. C'è la possibilità di ricevere via mail l'avviso di nuova discussione con relativo link diretto.
Ciao

Alternativa di Ricky
Non so se ti possa essere ancora utile ma io lo risolverei così:

Sub Min_MaX()
Set MinimoB = Range("B:B")
Set massimoB = Range("B:B")
MinimoB = WorksheetFunction.Min(MinimoB)
massimoB = WorksheetFunction.Max(massimoB)

Columns("B:B").Select
Selection.FormatConditions.Delete

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:=MinimoB
If MinimoB <> 0 Then
Selection.FormatConditions(1).Interior.ColorIndex = 36
Else
Selection.FormatConditions.Delete
End If
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:=massimoB
If massimoB <> 0 Then
Selection.FormatConditions(2).Interior.ColorIndex = 3
Selection.FormatConditions(2).Font.ColorIndex = 2

Else
Selection.FormatConditions.Delete
End If
' Trova il valore minimo e massimo colonna D
Set MinimoD = Range("D:D")
Set massimoD = Range("D:D")
MinimoD = WorksheetFunction.Min(MinimoD)
massimoD = WorksheetFunction.Max(massimoD)

Columns("D:D").Select
Selection.FormatConditions.Delete

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:=MinimoD
If MinimoD <> 0 Then
Selection.FormatConditions(1).Interior.ColorIndex = 36
Else
Selection.FormatConditions.Delete
End If
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:=massimoD
If massimoD <> 0 Then
Selection.FormatConditions(2).Interior.ColorIndex = 3
Selection.FormatConditions(2).Font.ColorIndex = 2
Else
Selection.FormatConditions.Delete
End If
' Trova il valore minimo e massimo colonna E
Set MinimoE = Range("E:E")
Set massimoE = Range("E:E")
MinimoE = WorksheetFunction.Min(MinimoE)
massimoE = WorksheetFunction.Max(massimoE)

Columns("E:E").Select
Selection.FormatConditions.Delete

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:=MinimoE
If MinimoE <> 0 Then
Selection.FormatConditions(1).Interior.ColorIndex = 36
Else
Selection.FormatConditions.Delete
End If
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:=massimoE
If massimoE <> 0 Then
Selection.FormatConditions(2).Interior.ColorIndex = 3
Selection.FormatConditions(2).Font.ColorIndex = 2
Else
Selection.FormatConditions.Delete
End If

' Trova il valore minimo e massimo colonna F
Set MinimoF = Range("F:F")
Set massimoF = Range("F:F")
MinimoF = WorksheetFunction.Min(MinimoF)
massimoF = WorksheetFunction.Max(massimoF)

Columns("F:F").Select
Selection.FormatConditions.Delete

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:=MinimoF
If MinimoF <> 0 Then
Selection.FormatConditions(1).Interior.ColorIndex = 36
Else
Selection.FormatConditions.Delete
End If
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:=massimoF
If massimoF <> 0 Then
Selection.FormatConditions(2).Interior.ColorIndex = 3
Selection.FormatConditions(2).Font.ColorIndex = 2
Else
Selection.FormatConditions.Delete
End If
Range("J2").Select
End Sub


...non credevo date le mie scarse conoscenze di poter essere utile a qualcuno...eheheh!...e soprattutto avevo sottovalutato l'importanza del generatore di macro che con qualche piccola modifica di codice qua e la permette di ottenere grandi risultati ..

di Barbara
..Grazie Ricky!!!! era proprio quello che mi serviva, spero di poter ricambiare la cortesia

Cognolato Studio © 2005