2016-06-07 50 views
12

Sto avendo un problema apparentemente di base ma non riesco a trovare alcuna risorsa che lo indirizzi.Creazione di una matrice da un intervallo in VBA

In poche parole, voglio solo caricare il contenuto di un intervallo di celle (tutte una colonna) in una matrice.

Sono in grado di raggiungere questo obiettivo mediante

DirArray = Array(Range("A1"), Range("A2")) 

Ma per qualche ragione, non riesco a creare l'array quando espresso in questo modo:

DirArray = Array(Range("A1:A2")) 

Il mio vero gamma è molto più lungo (e può variare in lunghezza), quindi non voglio dover enumerare individualmente le cellule in questo modo. Qualcuno può dirmi come caricare correttamente un'intera gamma in una matrice?

Con quest'ultimo codice:

MsgBox UBound(DirArray, 1) 

E

MsgBox UBound(DirArray) 

ritorno 0, mentre con l'ex tornano 1.

+0

Loop attraverso la vostra gamma. – findwindow

+0

Non è meno efficiente? Pensavo che esistesse un metodo o una proprietà che permettesse di caricare l'intera gamma nell'array in una sola volta. O qualcosa con un effetto simile, se c'è un tipo di oggetto non-array che dovrei usare invece ... – basaltanglia

+1

dovresti riuscire a farlo. - DirArray = Range ("A1: A2") – chungtinhlakho

risposta

13

basta definire la variabile come una variante, e li rendono uguale:

Dim DirArray As Variant 
DirArray = Range("a1:a5").Value 

Non è necessario il comando Array.

+0

Wow, questo è chiaramente ovvio. L'avevo provato ma non, penso, in congiunzione con DirArray (1, 1), che era necessario invece di DirArray (1). Grazie mille! – basaltanglia

+1

Ma allora non è un Variant e non un array? C'è una differenza nell'uso della memoria in questo caso? –

+0

Ora mi rendo conto che usare gli array Variant è uno dei pochi modi per fare qualcosa in Excel. –

15

L'utilizzo di Value2 offre un vantaggio in termini di prestazioni. Come per Charles Williams blog

Range.Value2 funziona allo stesso modo come Range.Value, salvo che non controlla il formato della cella e convertire alla data o valuta. E questo è probabilmente il motivo per cui è più veloce di .Valore quando si recuperano i numeri.

Così

DirArray = [a1:a5].Value2 
Problemi correlati