Sospendi tutto per qualche minuto e prova questa macro, da inserire in un "modulo" del vba nuovo:
- Codice: Seleziona tutto
Dim WArr, myR As Long, myC As Long, cSum As Double, wInd() As Long
Sub goodl2()
Dim myCnt As Long, myRes As Range, myData As String
'
Set myRes = Sheets("Foglio1").Range("L1") '<<< Foglio/Cella da cui si creera' l' elenco risultati
myData = "A1" '<<< La cella dove comincia la tabella dati
'
myC = Range(Range(myData), Range(myData).End(xlToRight)).Count
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
mytim = Timer
ReDim wInd(1 To 10)
WArr = Range(myData).Resize(20, 12).Value
myRes.Resize(Rows.Count - 10, 1).ClearContents
'
Do
cSum = RecurSum2(1)
DoEvents
If Application.WorksheetFunction.CountIf(myRes.Resize(myCnt + 1, 1), cSum) = 0 Then
myRes.Offset(myCnt + 1, 0) = cSum
myCnt = myCnt + 1
End If
If wInd(myC + 1) > 0 Then Exit Do 'FlExit Then Exit Do
Loop
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
MsgBox ("Completato in (sec): " & Format(Timer - mytim, "0.00"))
End Sub
Function RecurSum2(ByVal Dummy As Long) As Double
Dim locSum As Double, I As Long
'
For I = 1 To myC
If WArr(wInd(I) + 1, I) = 0 Then
wInd(I + 1) = wInd(I + 1) + 1
wInd(I) = 0
End If
locSum = locSum + WArr(wInd(I) + 1, I)
If I = 1 Then wInd(I) = wInd(I) + 1
Next I
RecurSum2 = locSum
End Function
Da excel: Alt-F11 per aprire l' editor delle macro; Menu /Inserisci /Modulo; copia il codice e incollalo nel frame di dx
Le righe marcate <<< sono da personalizzare con le tue informazioni.
Poi torni in Excel ed esegui la macro goodl2: alt-F8, scegli goodl2 dall' elenco di macro che ti propone, premi Esegui.
Ogni colonna di dati termina nella prima cella vuota, mentre sul lato destro la tabella deve avere una colonna vuota, che sara' usata per indicare la fine della tabella.
Prova con un set di dati minimi, e poi aumenta righe e colonne per vedere il tempo che viene richiesto.
Ulteriori velocizzazioni potrebbero essere possibili se si conoscesse meglio la il tipo di dati (interi, decimali, positivi, negativi) e i limiti dei loro possibili valori.
Ciao