Contare celle con formattazione condizionale



  • Contare celle con formattazione condizionale
    di saras (utente non iscritto) data: 23/08/2015 17:26:58

    Buongiorno,
    ho un problema di questo tipo.
    Ho delle colonne contenenti innumerevoli numeri.
    Ho utilizzato varie volte la formattazione condizionale per evidenziarne alcuni in base alle mie necessità.
    I numeri sono evidenziati da un colore di riempimento della cella.
    Io vorrei contare le celle colorate (a prescindere dal colore e dalla formula della formattazione condizionale).
    La ritenete una cosa possibile?
    Ringrazio fin d'ora.



  • di alfrimpa data: 23/08/2015 17:39:42

    Ciao Saras.

    È possibile ma scrivendo una funzione in VBA.

    Ne ho scritta una al volo qui sotto; sai inserirla in una cartella di lavoro?

    Alfredo
     
    Function ContaColorate(a as Range)
    Dim cel as Range
    For Each cel in a
        If cel.Interior.ColorIndex <> xlNone Then
             ContaColorate = ContaColorate + 1
        End If
    Next cel
    End Function






  • di saras (utente non iscritto) data: 23/08/2015 19:18:54

    Ciao Alfredo,
    grazie mille per la tua gentilezza.
    Ho provato ad inserire il tuo "programma" nei moduli (in questi giorni ho imparato a farlo!!!).
    Ho provato a colorare io delle celle e funziona benissimo.
    Ma purtroppo le celle del mio foglio di lavoro si colorano in seguito a formattazione condizionale e applicando la tua funzione il risultato è sempre 0.

    Saras




  • di alfrimpa data: 23/08/2015 19:37:05

    Infatti avevo questo dubbio che non funzionasse con la f.c.

    Occorrerebbe trovare un'istruzione vba che "dica" se una determinata cella è sottoposta a f.c.

    Provo a cercare un po' e se trovo qualcosa ti riferisco.

    Alfredo





  • di alfrimpa data: 23/08/2015 19:58:05

    Forse un escamotage per aggirare il problema potrebbe essere quello che, conoscendo i criteri che scatenano la f.c.,si possono utilizzare questi per contare le celle colorate.

    Non so se mi sono spiegato.

    Alfredo





  • di Vecchio Frac data: 23/08/2015 20:50:23

    Questo argomento è già stato affrontato in passato su questo Forum.
    C'è una vecchia discussione con risposta a firma di isy: cercate nello storico.
    Comunque no, il conteggio sullo sfondo della cella non funziona con la formattazione condizionale: la procedura è un po' complessa ma si riesce a implementare.





  • di Saras (utente non iscritto) data: 23/08/2015 21:23:59

    Ciao Alfredo,
    purtroppo non mi intendo di VBA e non capisco io cosa intendi.

    Grazie per l'indicazione Vecchio Frac,
    ho provato a dare un occhio a quella risposta ma non riesco a capire cosa fare...
    ho copiato la formula come modulo ma non ho ottenuto risultati.



  • di alfrimpa data: 23/08/2015 23:04:17

    Scusa VF riesci a mettere il link alla discussione che hai citato?

    Ho provato con un paio di chiavi di ricerca ma non sono riuscito.

    Alfredo





  • di Saras (utente non iscritto) data: 23/08/2015 23:59:23

    Cerca "Conta celle sfondo rosso".
    Perlomeno io ho trovato questa...




  • di Marius44 data: 24/08/2015 00:25:03

    Salve a tutti.
    Fra i miei appunti ho trovato la sotto riportata sub (che deve essere adattata alle tue esigenze) che conta le celle formattate (nel mio caso si trovano in B2:B22), qualunque sia il tipo di formattazione, e scrive il risultato nella cella A1.

    Provalo e dimmi se va bene. Se è Risolto non dimenticare di spuntare la casella.
    Ciao,
    Mario 
     
    Sub ContaFormattate()
    Dim FC As FormatCondition, F1, F2
    Dim cel As Range
    For i = 2 To 22
        Cells(i, 2).Select
        For Each FC In ActiveCell.FormatConditions
            If FC.Type = xlCellValue Then
                F1 = Evaluate(FC.Formula1)
                Select Case FC.Operator
                    Case xlBetween: If ActiveCell >= F1 And ActiveCell <= Evaluate(FC.Formula2) Then v = 1: Exit For
                    Case xlEqual: If ActiveCell = F1 Then v = 1: Exit For
                    Case xlGreater: If ActiveCell > F1 Then v = 1: Exit For
                    Case xlGreaterEqual: If ActiveCell >= F1 Then v = 1: Exit For
                    Case xlLess: If ActiveCell < F1 Then v = 1: Exit For
                    Case xlLessEqual: If ActiveCell <= F1 Then v = 1: Exit For
                    Case xlNotBetween: If ActiveCell < F1 Or ActiveCell > Evaluate(FC.Formula2) Then v = 1: Exit For
                    Case xlNotEqual: If ActiveCell <> F1 Then v = 1: Exit For
                End Select
            Else
                If Evaluate(FC.Formula1) Then Exit For
            End If
        Next FC
        tot = tot + v: Cells(1, 1) = tot: v = 0
    Next i
    End Sub
    



  • di cromagno data: 24/08/2015 01:42:00

    Devo ancora cercare nello storico, ma questa di (Super)Marius mi sembra un'ottima soluzione, solo che non saprei a che evento collegarla per rendere il tutto automatico (anche con Worksheet_Calculate non ho avuto buoni risultati)...
    Io avrei utilizzato l'escamotage proposto da Alfredo
    Comunque, se Isy ha già trovato la soluzione, vado subito a cercarmela



  • di Marius44 data: 24/08/2015 06:44:09

    cercate questo nello storico:

    "formattazione condizionale da VBA di Piero (utente non iscritto) data: 22/08/2014 17:01:00"

    Vi è la risposta di Isy (che saluto cordialmente e a cui dò, giustamente, la paternità - @cromagno quindi niente "Super") che è quella che ho ritrovato fra le mie scartoffie (ma, purtroppo, non avevo salvato anche la fonte) è che io ho solo "aggiustato" per far fare un loop.

    Ciao a tutti,
    Mario



  • di Luca73 data: 24/08/2015 08:29:39

    Ciao a tutti
    lo avevo già postato in una discussione precedente.
    VBA riconosce come è formattato realmente (visivamente) una cella con la proprietà DisplayFormat di range.
    l'help dà questa nota relativa:"Azioni quali la modifica della formattazione condizionale o dello stile tabella di un intervallo possono causare l'incoerenza degli elementi visualizzati nell'interfaccia utente corrente rispetto ai valori nelle proprietà corrispondenti dell'oggetto Range. Utilizzare le proprietà dell'oggetto DisplayFormat in modo che i valori vengano restituiti così come sono visualizzati nell'interfaccia utente corrente"
    Pertanto se l formattazione usata con formattazione condizionale è univoca allora si può scrivere:

    ATTENZIONE + DOMANDA: non funziona nelle functio ma solo nelle sub PERCHE?

    Ciao
    Luca
     
    Sub mia()
    Dim aaa
    Dim bbb
    Dim cel As Range
    Set aaa = Range("A1:A10")
    For Each cel In aaa
        'pippo = cel.
        If cel.DisplayFormat.Interior.ColorIndex <> xlNone Then
             bbb = bbb + 1
        End If
    Next cel
    End Sub






  • di Marius44 data: 24/08/2015 09:02:08

    @Luca73
    Esattamente un anno fa all'indirizzo dello "storico" che ho dato in precedenza c'è un tuo intervento.
    La tua sub a me non funzione (Excel2007); al rigo: If cel.DisplayFormat.Interior.ColorIndex <> xlNone Then
    mi dice:
    "Errore di run-time 438: Proprietà o metodo non supportati dall'oggetto."

    La sub indicata da Isy l'ho trovata anche a quest'indirizzo:
    h t t p://remigueudelot.free.fr/PHP/VBAit.pl




  • di scossa data: 24/08/2015 09:13:55

    cit. Marius44: "Fra i miei appunti ho trovato la sotto riportata sub (che deve essere adattata alle tue esigenze) che conta le celle formattate (nel mio caso si trovano in B2:B22), qualunque sia il tipo di formattazione, e scrive il risultato nella cella A1."

    Purtroppo le cose sono ben più complicate.
    La sub che riporti è valida solo per formattazioni condizionali che non facciano uso di funzioni, infatti quei .... (un aggettivo dispregiativo a piacere) di MS hanno pensato bene di valorizzare la proprietà range.FormatConditions(item).Formula1 (e l'eventuale Formula2) con la formula localizzata (praticamente FormulaLocal), quindi il metodo Evaluate()
    F1 = Evaluate(FC.Formula1)
    restituirebbe un errore.

    Provate ad impostare la formattazione condizionale di A1 con =VAL.PARI(A1) e riempimento verde.
    F1 = Evaluate(FC.Formula1) diventa F1 = Evaluate("=VAL.PARI(A1)") stringa incomprensibile ad Evaluate().


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.(George Bernard Shaw)



  • di Luca73 data: 24/08/2015 09:32:56

    @ Marius44
    postilla della funzione
    Informazioni sulla versione: Versione aggiunta: Excel 2010
    Non c'è nella 2007.....





  • di scossa data: 24/08/2015 09:37:12

    @Marius44: la proprietà .DisplayFormat è presente solo dalla versione 2010.

    cit. Luca73: "ATTENZIONE + DOMANDA: non funziona nelle function ma solo nelle sub ..."

    Non è proprio così.
    Non funziona nelle function "pensate" come UDF cioè se usate in una cella.

    Provate il codice riportato sotto eseguendo la sub prova() che richiama la function ContaColorFC().
    Come vedrete funziona correttamente

    Ma se in una cella provate a scrivere =ContaColorFC(A1:A6) otterrete l'errore #VALORE!

    cit. Luca73: "PERCHE?"

    Purtroppo non conosco il codice sorgente di Excel, ma un'idea me la sono fatta. E' solo una "deduzione" ricavata quando avevo affrontato il problema di formattazioni condizionali che utilizzano funzioni anziché semplici operatori (vedi mio post precedente).
    Riassumo in breve e molto terra-terra.
    All'epoca avevo dedotto che l'unico modo per metter una toppa al problema era di scrivere il valore della proprietà .Formula1 nella proprietà .FormulaLocal di una cella, quindi memorizzare in una variabile FC = cella.Formula e sottoporre a Evaluate quest'ultima.
    Il fatto di dover scrivere in una cella di fatto impedisce che tale codice possa essere utilizzato in una UDF (una UDF può solo restituire un valore, e non può interagire con gli oggetti del foglio, quindi non può modificare le proprietà di una cella).
    Ecco, mi sembra che il comportamento evidenziato da Luca sia proprio dovuto al fatto che, per restituire il valore della proprietà .DisplayFormat, il codice sottostante cerchi in qualche modo di interagire "illegalmente" con una cella. Ribadisco che è solo una "spiegazione" che mi sono dato io e sicuramente non sarà quella reale, a cui solo MS potrebbe rispondere.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.(George Bernard Shaw)

     
    Sub prova()
      MsgBox "colorate: " & ContaColorFC(Range("A1:A6"))
    End Sub
    
    
    Function ContaColorFC(ByRef rng As Range)
      Dim cella As Range
      Dim sFC As String
      
      For Each cella In rng
          If cella.DisplayFormat.Interior.ColorIndex <> xlColorIndexNone Then
            ContaColorFC = ContaColorFC + 1
          End If
      Next cella
    End Function
    
    



  • di Vecchio Frac data: 24/08/2015 13:40:09

    cit. scossa: "quei .... (un aggettivo dispregiativo a piacere) di MS "
    ---> LOL, non ce ne sono abbastanza. Come anche il fatto di aver cambiato, tra una versione e l'altra di Excel, e fra versioni localizzate, i caratteri separatori di righe e colonne nelle formule che riguardano matrici.





  • di Vecchio Frac data: 24/08/2015 13:44:01

    cit scossa: "una UDF può solo restituire un valore, e non può interagire con gli oggetti del foglio, quindi non può modificare le proprietà di una cella)."
    ---> Magari non nell'uso classico. Ma ci sono dei workarounds per superare questa limitazione (che è by design di Microsoft e quindi si tratta di forzare un po' la mano).





  • di scossa data: 24/08/2015 14:00:40

    cit.: "Magari non nell'uso classico. Ma ci sono dei workarounds per superare questa limitazione ....."

    Sì, ma ho volutamente evitato di tirare in ballo lo sfruttamento di un bug (peché di questo si tratta).


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)



  • di Luca73 data: 24/08/2015 14:19:38

    Scusate ma una cosa mi sfugge:
    DisplayFormat è di sola lettura pertanto UDF, functio o sub non posso modificarla....E poi cerco solo di leggerla non di modificarla.
    Ciao
    Luca






  • di scossa data: 24/08/2015 14:24:22

    cit.: "DisplayFormat è di sola lettura pertanto UDF, functio o sub non posso modificarla....E poi cerco solo di leggerla non di modificarla"

    Infatti, non è comprensbile, né giustificalbile!
    Anche perché è una proprietà, potrei capire si trattasse di un metodo .... mah! La mia era solo una "spiegazione" che mi sono dato per "mettermi l'anima in pace"


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)



  • di Luca73 data: 24/08/2015 14:29:07

    @ scossa
    grazie 1000
    Ciao
    Luca





  • di Saras (utente non iscritto) data: 24/08/2015 14:53:04

    Grazie a tutti ragazzi,
    ma non ho capito una cosa...
    alla fine, secondo voi, è fattibile contare le mie celle?




  • di Vecchio Frac data: 24/08/2015 14:55:55

    BTW, la proprietà DisplayFormat è disponibile solo da Excel 2010, quindi con questo Excel 2007 il codice di scossa non posso provarlo ^_^





  • di alfrimpa data: 24/08/2015 14:59:17

    Ciao Saras

    Immaginavo che avresti fatto una domanda del genere dopo aver visto crescere la tua discussione a dismisura (neanch'io immaginavo che la cosa fosse così complessa)

    Forse come dicevo in un mio post precedente si potrebbe effettuare il conteggio non in base alla colorazione data dalla f.c. ma sui criteri che la fanno scatenare.

    Prova ad allegare un file di esempio e vediamo cosa si può fare.

    Alfredo





  • di Saras (utente non iscritto) data: 24/08/2015 17:40:19

    Ciao Alfredo,
    oggi non riesco ad allegarti file perché sono fuori casa ma ho riflettuto su quello che mi proponi.
    Forse è possibile risolvere con una tra le funzioni CONTA.SE o CONTA.PIU'.SE.
    Faccio un esempio:
    dato un intervallo di celle piene di numeri (ipotizziamo A1:F30) voglio contare quelle che hanno i numeri identici a quelli inseriti in altre 5 celle (ipotizziamo H1, H2, H3, H4 e H5) che io cambio continuamente.
    La funzione dovrebbe rispondermi con il numero totale di celle contenenti i 5 numeri (non mi interessa discriminare numero per numero).
    Nel mio file, in seguito alla formattazione condizionale, le celle si colorano, ma non volevo perdere tempo a contarle tutte.
    Credi sia possibile? Sono sulla strada giusta?
    Grazie ancora per la tua disponibilità.
    Saras



  • di alfrimpa data: 24/08/2015 18:03:12

    Ciao Saras

    Senza complicarci la vita io, molto banalmente, farei così:

    Non so se per te va bene.

    Alfredo  
     
    =CONTA.SE(A1:F30;H1)+CONTA.SE(A1:F30;H2)+CONTA.SE(A1:F30;H3)+CONTA.SE(A1:F30;H4)+CONTA.SE(A1:F30;H5)






  • di Vecchio Frac data: 24/08/2015 18:48:18

    In pratica, ricrei la regola della formattazione condizionale, trasformandola in una formula che conta semplicemente i risultati. E' così? ^_^





  • di Marius44 data: 24/08/2015 19:06:32

    Grande Alfredo!!
    Se c'è un ostacolo "grosso" basta aggirarlo, non è necessario sormontarlo.

    Un appunto a Saras, però, voglio farlo. Nel tuo post iniziale parvali di "contare le celle colorate" e non parlavi di celle d'appoggio o altro. Se avessi detto subito cosa avevi bisogno il Grande Alfredo t'avrebbe data la risposta in quatroequattrotto.

    Ciao a tutti,
    Mario



  • di alfrimpa data: 24/08/2015 19:12:27

    Mario non mi fare arrossire.

    Alfredo

    P.S. Prima o poi ci dobbiamo sentire direttamente così potrò ringraziarti a voce






  • di Saras (utente non iscritto) data: 24/08/2015 21:13:04

    Grazie Alfredo!
    Volevo così tanto contare le mie celle colorate che non ho riflettuto sull'alternativa...

    Hai ragione Mario, ma credevo davvero fosse possibile contare le celle formattate che non ho pensato di descrivere meglio il tutto.

    Vorrei approfittare per porre un quesito nuovo... ma lo farò in una nuova discussione cercando di descrivere meglio il mio obbiettivo e allegando un file.

    Ciao!

    Saras




  • di alfrimpa data: 24/08/2015 21:16:52

    Restiamo in attesa......

    Alfredo





  • di Raffaele_53 data: 24/08/2015 22:43:39

    A me 2007, non funziona
    >>>DisplayFormat e mi piacerebbe anche una soluzione per inferiore a 2010

    Ho provato con il post di "ISY", non c'è nulla da fare (Per me), dopo quanto detto da scossa.

    Si tratta solo che se c'è una formula nella cella (NON UN NUMERO CALCOLATO)... Evalutate và in errore.