Si , in effetti la tua ultima soluzione accorcia di molto i tempi. Ma ne ho adottata una che adopera il VBA, e che riduce ancora i tempi (è quasi istantanea). Consiste nel concatenare in una prima colonna d’appoggio (T) il nome e il prodotto; poi ordino tutto l’elenco in base a questa colonna. A questo punto uso un’altra colonna d’appoggio (U), dove metto un’altra semplice formula: se il valore della riga superiore è uguale a quello della riga in questione, metto 0 ( perché trattasi di un doppione e quindi non va contato) altrimenti metto 1. Mi sembra che funzioni e sia velocissima
Sub conta ()
Dim riga as integer
Dim zonaformula as range
With Worksheets("statis")
riga = .Range("A" & Rows.count).End(xlUp).Row
.Range("T1") = "Concatena"
Set zonaformula = .Range("T2:T" & riga)
zonaformula.FormulaR1C1 = "=CONCATENATE(RC[-19],RC[-2])"
zonaformula.Value = zonaformula.Value
'ordina il tutto in base alla colonna di concatenazione
.Range("A1").CurrentRegion.Sort Key1:=.Range("T1"), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
.Range("U1") = "Num paz"
.Range("U2") = 1
Set zonaformula = .Range("U3:U" & riga)
zonaformula.FormulaR1C1 = "=IF(RC[-1]<>R[-1]C[-1],1,0)"
zonaformula.Value = zonaformula.Value
End With
End Sub
> > La terza formula
>
> > =1/
CONTA.SE($D$2:$D$20001;A2&B2)
>
> > basata su una ulteriore colonna di appoggio, registra invece un tempo di
>
> > circa 18 secondi (un decimo rispetto alle altre 2).
>
> >
>
> > La differenza mi pare abissale!
>
> >
>
> > Questo è il file: