Option base colpisce ancora...
aggiungo che è meglio anteporre al codice la dichiarazione
option base 1
altrimenti si possono avere sorprese con l'istruzione
Range("K1:K50") = MiaVAr
Mi permetto di dire che l' uso di Option Base 1 e' piu' che altro legato al proprio stile di programmazione; in ogni caso non ha impatto in istruzioni quali
Range("K1:K50") = MiaVAr che popola K1:K50 attingendo dalla prima colonna di MiaVAr; ne' ha impatto sull' istruzione opposta, es
MiaVAr=Range("A1:C100") che mette nella variant MiaVArr (che deve essere stata dichiarata come variant) una tabella di 100 righe*3 colonne.
Inoltre in questi casi la matrice viene creata sempre con base=1, anche se tra le dichiarazioni ci fosse Option Base 0
In VB il primo indice di una matrice è 0 quindi se io dichiaro
US(50) il primo elemento della matrice sarà US(0) e l'ultimo US(49)
In realta' con US(50) si definisce una matrice con l' indice piu' alto pari a 50; quindi la matrice avra' 50 posizioni se Option Base 1, oppure 51 se Option Base 0 (valore di default)
Una ragione in piu' per usare "spesso" le funzioni UBound (indice superiore) e LBound (indice inferiore) per calcolare gli indici della matrice.
Andando alla richiesta di elencare solo i 10 numeri piu' presenti, prova qualcosa come:
- Codice: Seleziona tutto
Sub Top10()
'
Dim MiaVAr, mioCount(1 To 90), MiaTop(1 To 10, 1 To 2)
[P1] = Timer
MiaVAr = Range("A1:E50").Value
'scan matrice in memoria e calcolo presenze
For xI = 1 To 50
For yI = 1 To 5
If MiaVAr(xI, yI) <> "" Then mioCount(MiaVAr(xI, yI)) = mioCount(MiaVAr(xI, yI)) + 1
Next yI
Next xI
'Cerca i top 10
For I = 1 To 10
topC = Application.WorksheetFunction.Large(mioCount(), 1) 'top Counter
topN = Application.Match(topC, mioCount(), 0) 'top Number
MiaTop(I, 1) = topN '*1
MiaTop(I, 2) = topC '*1
'Cells(I, 9) = topN '*2
'Cells(I, 10) = topC '*2
mioCount(topN) = 0
Next I
'report in I1:J10
Range("I1:J10") = MiaTop '*1
[p2] = Timer
End Sub
Tuttavia in questo caso il vantaggio di portare in matrice la tabella iniziale (che ho immaginato essere in A1:E50) e' minimo, perche' usando la matrice siamo poi costretti a scansionare tutte le sue celle per contare le presenze, mentre lavorando con i dati del foglio e' possibile usare la WorksheetFunction.CountIf per calcolare direttamente lo stesso dato; diciamo che nel caso matrice i tempi sono 3-4 msec e nel caso dati su foglio sono 4-5 msec.
La macro descritta usa tre matrici:
- MiaVAr per copiarci i dati dal foglio
-mioCount(1 To 90), in cui calcolo il numero delle presenze per ogni numero (ho immaginato che i numeri siano 90)
-MiaTop(1 To 10, 1 To 2), in cui accumulo i top 10 che poi vengono scaricati nell' area I1:J10. Notate che avrei potuto scrivere i risultati direttamente nelle celle I1:J10, eliminando le tre istruzioni marcate *1 e abilitando le due marcate *2; in questo caso pero' i tempi di esecuzione cambiano da 3-4 msec a 15-20 msec: pochi millisecondi, che danno pero' l' idea di quanto sia oneroso scrivere nelle celle.
Ciao a tutti.