2015-06-12 17 views
8

Ho dichiarato un array come tale Dim rArray() As Variant ma quando provo e utilizzo i valori che sono memorizzati in esso (come mostrato di seguito) ottengo un errore di indice fuori intervallo. I valori UBound(rArray) e LBound(rArray) restituiscono entrambi i valori 14 e 1, ma l'errore si verifica sulla riga Debug.Print.Errore di indice fuori intervallo con un array - nessuna idea del perché?

Se io uso l'istruzione for, come di seguito

For Each rArr in rArray 

allora funziona senza problemi, ma per gli scopi sto creando questo array ho bisogno della flessibilità di selezionare ogni elemento memorizzato in che ordine-senso ho bisogno per riferirsi a loro usando i pedici.

Ho provato diversi modi per tentare di risolverlo senza fortuna e passare quasi la metà della giornata a questo problema. Qualcuno potrebbe indicare cosa ho bisogno di cambiare per farlo funzionare.

Set rng = Range("D4", Range("D4").End(xlDown)) 
rng.NumberFormat = "0" 
rArray = rng.Value 

For x = UBound(rArray) To LBound(rArray) Step -1 
    Debug.Print rArray(x) 
Next x 

Edit: un altro fatto degno di nota è che lui array viene dichiarato e utilizzato all'interno di una funzione, ma non è passato dalla o alla funzione. Non è possibile dichiarare e utilizzare le matrici nelle funzioni?

+0

non sono esperto, ma cosa succede se si stampa x e vedere quale valore di x il problema si verifica a – barlop

+0

Grazie. Non devo stampare x, mentre eseguo il debug posso vedere il valore di x è 14, da cui inizia il ciclo: ci sono 14 elementi memorizzati nell'array. –

+0

come procedura per la risoluzione dei problemi, cosa succede se si rimuove il loop e si prova x = 13? e prova per x = 1 – barlop

risposta

7

Quando si assegnano i valori di prospetto di una matrice variante, si sempre estremità con una matrice 2-D che è base (ad esempio da 1 a qualcosa, 1 a qualcosa; non 0 a qualcosa, 0 a qualcosa). Se si ottengono valori da una singola colonna, la seconda posizione è semplicemente 1: 1.

Ciò può essere dimostrato con quanto segue.

Dim x As Long, rArray As Variant, rng As Range 

Set rng = Range("D4", Range("D4").End(xlDown)) 
rng.NumberFormat = "0" 'don't really understand why this is here 
rArray = rng.Value 

Debug.Print LBound(rArray, 1) & ":" & UBound(rArray, 1) 
Debug.Print LBound(rArray, 2) & ":" & UBound(rArray, 2) 

For x = UBound(rArray, 1) To LBound(rArray, 1) Step -1 
    Debug.Print rArray(x, 1) 
Next x 

Quindi è necessario chiedere l'elemento nella prima riga dell'array; non è sufficiente chiedere l'elemento.

+0

Grazie ancora Jeeped. Quindi se cambio la matrice in Integer 'Dim rArray() As Integer' allora dovrebbe funzionare bene - ma non lo è? –

+0

Sinceramente non credo che si possano riempire i valori del foglio di lavoro in qualcosa di diverso da un array variante, a meno che non si effettui un ciclo attraverso le celle e si compili l'array singolarmente. A volte il semplice pensiero immediato non funziona. Attacca con array diversi. – Jeeped

+0

Grazie! Apprezzo il tempo e lo sforzo. Stavo chiedendo perché non ho mai lavorato con gli array 2-D prima, quindi potrebbe essere un po 'più di tempo per me. Ma sono felice di imparare - solo con un vincolo di tempo limitato. –

Problemi correlati