formattazione condizionale excel 2003



  • 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? :)