Il problema e' che hai esordito dicendo che usi la formattazione Condizionale per colorare le celle, ma non e' vero: usi una formattazione standard, quella che imposta un Interior.ColorIndex.
Probabilmente l' hai chiamata "Condizionale" perche' la relativa istruzione e' sotto If (es If Application.CountIf(Range("F3:H3"), B) >= 1 Then B.Interior.ColorIndex = 1).
In realta' in Excel esiste una prestazione che Microsoft chiama (e noi con lei) "formattazione condizionale", in grado di applicare dei colori alle celle in funzione di condizioni programmabili (vedi l' help on line di Excel alla voce "formattazione condizionale") ma non lavora sull' Interior.ColorIndex della cella, per cui puo' accadere che magari Interior.ColorIndex dice "rosso" ma la celle appare "verde".
E' questa seconda formattazione che la funzione CountCcolor non puo' "leggere".
Poiche' pero' tu usi la prima formattazione (quella standard) puoi continuare a usare le formule del tipo
=CountCcolor(B3:D3,F3) senza problemi
Se la tua preoccupazione e' che ci sono troppe righe in cui mettere la formula, potresti:
1) aggiungere l' istruzione
Application.Volatile subito dopo la riga "Function CountCColor(range_data As Range, criteria As Range) As Long"
2) modificare la macro del commandbutton in
- Codice: Seleziona tutto
Private Sub CommandButton1_Click()
Range(Range("D3"), Range("D3").End(xlDown)).Offset(0, 1).ClearContents
Range("E3").Formula = "=CountCcolor(B3:D3,F3)"
Range("E3").Copy Destination:=Range(Range("D3"), Range("D3").End(xlDown)).Offset(0, 1)
Range(Range("D3"), Range("D3").End(xlDown)).Offset(0, 1).Calculate
End Sub
Questa mettera' le formule su tutte le righe della tabella.
TUTTAVIA a me pare che l' architettura complessiva sia debole (macro per colorare le colonne a sinistra, macro per colorare a destra, funzione, formule e pulsante per calcolare le occorrenze...
Ad esempio questa macro:
- Codice: Seleziona tutto
Sub colNcount()
Dim myCell As Range, I As Long, LastB As Long, myTot As Long
'
LastB = Range(Range("B3"), Range("B3").End(xlDown)).Count + 2
Cells(3, "B").Resize(LastB - 2, 7).Interior.ColorIndex = xlNone
Cells(3, "B").Resize(LastB - 2, 7).Font.Color = RGB(0, 0, 0)
'
For I = 3 To LastB
myTot = 0
Cells(I, "f").Resize(1, 3).Interior.ColorIndex = 4 + (I Mod 2) * 2
For Each myCell In Cells(I, "B").Resize(1, 3)
If Application.CountIf(Cells(I, "F").Resize(1, 3), myCell.Value) > 0 Then
myCell.Interior.ColorIndex = 4 + (I Mod 2) * 2
myTot = myTot + 1
End If
Next myCell
Cells(I, "E").Value = myTot
Next I
End Sub
Questa macro:
-colora a righe alterne le celle di colonne F:H
-colora le celle di colonna B:D che rientrano nell' elenco di dx
-riporta in colonna E il numero di celle di sx che sono presenti nell' elenco di dx
Mettila in un Modulo standard del vba (es Modulo1) e poi eseguila. Volendo la richiami col Pulsante modificando la sua macro in
- Codice: Seleziona tutto
Private Sub CommandButton1_Click()
Call colNcount
End Sub
Dovrebbe sostituire le varie Sub e la Function che usi ora.
Ciao