Se nel codice dell’attuale PyramidB metti Dbg=False allora la Function sara’ nolto piu’ veloce
L’alternativa e’ una unica PyramidArr che processa l’intero blocco di righe. Corrisponde al seguente codice:
- Codice: Seleziona tutto
Function PyramidArr(ByRef myRan As Range) As Variant
Dim oArr(), wArr(), j As Long, Dbg As Boolean
Dim I As Long, ooArr(), iArr, Trans As Long
'
Dbg = False
iArr = myRan.Value
ReDim ooArr(1 To Parent.Caller.Rows.Count, 1 To 1)
'
For JJ = 1 To UBound(iArr)
Trans = 0
ReDim wArr(1 To UBound(iArr, 2))
For j = 1 To UBound(iArr, 2)
If iArr(JJ, j) <> "" Then
Trans = Trans + 1
wArr(Trans) = iArr(JJ, j)
End If
Next j
If Trans > 1 Then
ReDim Preserve wArr(1 To Trans)
'If Dbg Then Call DbgPrint(j, wArr)
j = 0
Do
j = j + 1
If j > 100 Then PyramidArr = 666: Exit Function
If UBound(wArr) > 2 Then
ReDim oArr(1 To UBound(wArr) - 1)
For I = 1 To UBound(oArr)
oArr(I) = (wArr(I) + wArr(I + 1)) Mod 9
If oArr(I) = 0 Then oArr(I) = 9
Next I
wArr = oArr
If Dbg Then Call DbgPrint(j, wArr)
Else
Trans = (wArr(1) * 10 + wArr(2)) Mod 90
If Trans = 0 Then Trans = 90
ooArr(JJ, 1) = Trans
Exit Do
End If
DoEvents
Loop
If JJ >= UBound(ooArr) Then
ooArr(1, 1) = "ESPANDERE"
PyramidArr = ooArr
Exit For
End If
End If
Next JJ
PyramidArr = ooArr
End Function
Poi vai accanto alla tabella con i numerellida “piramidare” e scrivi la formula
- Codice: Seleziona tutto
=PyramidArr(A1:J2000)
L’intervallo e’ da adattare al tuo caso.
I tempi di esecuzione dovrebbero essere visibilmente ridotti rispetto alla PyramidB ripetuta per n-mila volte
La formula va introdotta in forma di matrice, su un numero di celle sufficienti a contenere il risultato; cioe’ (ragionevolmente) su tante righe quante righe di dati sorgenti hai.
Se il numero di righe non e’ sufficiente a contenere tutte le righe di risultato allora in cella 1 (del risultato) troverai la scritta “ESPANDERE”
Per inserire la formula in forma di matrice:
a) selezionare l’area, es M1:M10
b) inserire nella barra della formula la formula desiderata, es =PyramidArr(A1:J2000) (volutamente ho messo la formula in 10 righe ma ne serviranno molte di piu’)
c) confermare la formula con Contr-Maiusc-Enter
In M1 dovrebbe comparire la scritta ESPANDERE e nelle celle sottostanti i primi 9 risultati
d) avendo capito che devi “espandere” l’area del risultato, seleziona da M1 fino a M2010; premere F2 (edit formula), premere Contr-Maiusc-Enter. Questa procedura inserira’ la formula in M1:M2010, quindi potrai vedere tutti i risultati e in piu' le ultime 10 righe conterranno 0
Lo step d) spiega come “allungare” l’area della formula; accorciarla purtroppo e’ meno semplice:
-bisogna cancellare la formula in tutto l’intervallo e poi riscriverla solo nell’intervallo piu' corto voluto
Prova e fai sapere...
D:\Dropbox\SHAREDz\[MULTI_C30521.xlsm]Foglio3 (2)