Formattazione condizionale

  • 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 ..