2012-01-26 33 views
7

voglio avere una lista di array in VBA, quindi ho una variante dichiarata in VBA di Excel come:matrice in Excel VBA

Dim Students(10) as variant 

Ora voglio per memorizzare i numeri nella lista Studenti. i numeri non sono continui. A volte:

Students(2,7,14,54,33,45,55,59,62,66,69) 

Come posso fare questo in vba? anche come posso accedere agli articoli dell'elenco?

risposta

10

Gli studenti devono essere dichiarati come una matrice dinamica. Cioè, una matrice i cui limiti possono essere modificati. Dim Students(10) dà una matrice i cui limiti non può essere cambiato e non può essere caricato da una matrice.

Dim Students() As Variant 

Per caricare studenti:

Students = Array(2,7,14,54,33,45,55,59,62,66,69) 

accedere agli elementi:

Dim Inx As Long 

For Inx = LBound(Students) to UBound(Students) 
    Debug.Print Students(Inx) 
Next 

LBound (Limite inferiore) e UBound significare che il ciclo regola il numero effettivo di elementi in Studenti.

+0

+1 Bel lavoro! Si noti inoltre che gli array sono vincolati a zero per impostazione predefinita. – JimmyPena

+1

@ JP. Lo so ma in qualche modo, a meno che non abbia dichiarato esplicitamente il limite inferiore, non mi fido che sarà sempre zero. –

3

È possibile aggiungere valori a un array come questo ...

For i = 1 to 10 
    Students(i) = i 
Next i 

O come questa

Students = Array(2,7,14,54,33,45,55,59,62,66,69) 

Quindi è possibile accedere ai valori nello stesso maniero. Nota se usi la seconda opzione devi dichiararla come segue:

Dim Students() As Variant 
4

questo è troppo complessa per te in questo momento, e probabilmente mai eseguito in una situazione in cui avrete bisogno di questo, ma:

Io uso il seguente metodo per la formazione più array di memoria-efficiente (perché variante massimo utilizzo della memoria di qualsiasi tipo di variabile) pur avendo la convenienza di dichiarare il contenuto di matrice in una linea. Per seguire il vostro esempio:

Dim Students() As Long 
Dim Array2() As String 

Array2() = Split("2,7,14,54,33,45,55,59,62,66,69", ",") 

ReDim Array1(0) As Long 
For Loop1 = LBound(Array2()) To UBound(Array2()) 
    ReDim Preserve Array1(0 To (UBound(Array1) + 1)) As String 
    Array1(Loop1) = Array2(Loop1) 
Next Loop1 
ReDim Preserve Array1(0 To (UBound(Array1) - 1)) As Long 

Erase Array2 

un esempio di accesso sarebbe qualcosa di simile:

For Loop1 = LBound(Students) to UBound(Students) 
    Msgbox Students(Loop1) 
Next Loop1 

Ho imparato questo da qui: http://www.vbforums.com/showthread.php?669265-RESOLVED-VBA-Excel-Assigning-values-to-array-in-a-single-line&p=4116778&viewfull=1#post4116778

+0

Nota che devi fare solo questo per gli array non stringa, perché per la stringa puoi semplicemente fare 'arrStrings() = Split (" Item1, Item2, Item3 ",", ",, vbtextcompare)" o qualsiasi altra cosa. – puzzlepiece87

0

Beh, che dipende da come si potrebbe fornire i valori per l'array, si potrebbe ottenere i valori dal Worksheet.Range o da TextBox o ListB ox, Ma in fondo il codice sarebbe qualcosa di simile:

Dim students(10) as Integer 
Dim Carrier as Integer 
For i = LBound(students) To UBound(Students) 
    'some code to get the values you want to from whatever is your source 
    'then assign the value to Carrier 

    students(i)=Carrier 
Next i 

Non è buona pratica di oscurare un array come Variant quando si certamente sapere che hai intenzione di usare solo numeri interi, come si mangia un sacco di memoria che non è necessaria in primo luogo. È inoltre necessario essere consapevoli dei limiti dei numeri che stanno per essere assegnati, se supera il limite Integer quindi si dovrebbe utilizzare Double or Float. Questa è la mia prima partecipazione al sito, Cheers.