2015-06-12 11 views
8

Ich habe ein Array als solches Dim rArray() As Variant deklariert, aber wenn ich versuche, die Werte zu verwenden, die darin gespeichert ist (wie unten gezeigt) bekomme ich einen Index außerhalb des Bereichs Fehler. Die Werte UBound(rArray) und LBound(rArray) liefern beide die Werte 14 und 1, der Fehler tritt jedoch in der Zeile Debug.Print auf.Index außerhalb des Bereichs Fehler mit einem Array - keine Ahnung warum?

Wenn ich die for-Anweisung verwenden, wie unten

For Each rArr in rArray 

dann funktioniert es ohne Probleme, aber für die Zwecke Ich schaffe dieses Array muss ich die Flexibilität jedes Element in das gespeichert auszuwählen auftrags- Sinn ich brauche um sich auf sie mit Hilfe von Indices zu beziehen.

Ich habe mehrere Möglichkeiten versucht zu versuchen und zu lösen, ohne Glück und verbringen fast einen halben Tag in diesem einen Problem. Könnte irgendjemand darauf hinweisen, was ich ändern muss, damit das funktioniert?

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: eine andere Tatsache erwähnenswert ist, dass er Array deklariert ist und innerhalb einer Funktion verwendet, aber es wird nicht von oder in die Funktion übergeben. Können Arrays nicht in Funktionen deklariert und verwendet werden?

+0

ich bin kein Experte, aber was ist, wenn Sie x drucken, und sehen, welcher Wert von x das Problem auftritt bei – barlop

+0

Danke. Ich muss nicht x drucken, während Debugging kann ich sehen, dass der Wert von x 14 ist, wo die Schleife beginnt - es sind 14 Elemente im Array gespeichert. –

+0

als Fehlerbehebungsschritt, was passiert, wenn Sie die Schleife entfernen und versuchen für x = 13? und versuche für x = 1 – barlop

Antwort

7

Wenn Sie Arbeitsblatt Werte eine Variante Array zuweisen, Sie immer am Ende mit einem 2-D-Array, das basierte (zB 1 bis etwas ist, 1 zu etwas, nie 0 bis etwas, 0 zu etwas). Wenn Sie Werte von einer einzelnen Spalte erhalten, ist der zweite Rang nur 1 zu 1.

Dies kann mit dem folgenden bewiesen werden.

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 

Sie müssen also nach dem Element in der ersten Reihe des Arrays fragen; es reicht nicht aus, nur nach dem Element zu fragen.

+0

Danke nochmal Jeeped. Wenn ich also das Array auf Integer 'Dim rArray() As Integer 'ändere, sollte es richtig funktionieren - aber nicht? –

+0

Ich glaube wirklich nicht, dass Sie Arbeitsblattwerte in etwas anderes als ein variantes Array stopfen können, es sei denn, Sie durchlaufen die Zellen und füllen das Array einzeln auf. Manchmal funktioniert Out-of-the-Box-Denken einfach nicht. Bleiben Sie bei Varianten-Arrays. – Jeeped

+0

Danke! Schätzen Sie die Zeit und den Aufwand. Ich habe gefragt, weil ich noch nie mit 2-D-Arrays gearbeitet habe, was für mich etwas zeitaufwendiger sein könnte. Aber ich bin glücklich zu lernen - nur unter einem engen Zeitdruck. –

Verwandte Themen