2016-06-09 4 views
0

Ich versuche ein dynamisches Array zu erstellen, das Einheiten in einer Schleife hinzufügt. jedes Mal, wenn ich versuche, eine Einheit REDIM und fügen Sie, bekomme ich folgende Fehlermeldung:Warum bekomme ich beim Versuch, Redim zu setzen, einen Index außerhalb des Bereichsfehlers?

Index außerhalb des zulässigen Bereichs

Mein Code:

dim arr() 
strSql = "SELECT item from dupEmail" 
    Set rs = CurrentDb.OpenRecordset(strSql) 
    rs.MoveFirst 
    ReDim arr(0) 
    Do While Not rs.EOF 
     arr(UBound(arr, 1)) = rs.Fields(0) 
     ReDim Preserve arr(1, UBound(arr, 1) + 1) 
     rs.MoveNext 
    Loop 

ich ReDim Preserve arr(0, UBound(arr, 0) + 1) versucht, aber das hat nicht arbeite entweder.

+0

In welcher Zeile tritt der Fehler auf? Und warum willst du es sowieso wieder? Suchen Sie vor dem Durchschleifen die Anzahl der Einträge in Ihrem Recordset und legen Sie die Länge Ihres Arrays vorher fest. –

+0

Warum nicht einfach das Recordset verwenden? Haben Sie Redim versucht arr (ubound (arr) +1) –

+0

Der Fehler tritt auf der Redim-Linie. Danke für den Tipp, aber ich muss es so machen. Beachten Sie, dass dies eine Vereinfachung meines Codes ist. – MJH

Antwort

1
ReDim arr(a, b) 

ist die gleiche wie

ReDim arr(0 To a, 0 To b) 

Was Sie wollen,

ReDim arr(a To b) 

In Ihrem Fall Sie Dim arr als eindimensionales Array der Länge 1 mit ReDim arr(0). Dann versuchen Sie, es als ein zweidimensionales Array zu ReDim. Wenn Sie nicht Preserve verwenden, das funktioniert gut, aber mit Preserve weiß es nicht, wo der alte Wert (ich denke) und wirft einen Fehler.

Also, um Ihr Problem zu beheben, ersetzen ReDim Preserve arr(1, UBound(arr, 1) + 1) durch ReDim Preserve arr(1 To UBound(arr, 1) + 1), aber es gibt andere bevorzugte Ideen in den Kommentaren erwähnt. Denken Sie daran, dass das "Redimentieren" zeitaufwendig sein kann. Im schlimmsten Fall muss das Programm neuen (größeren) Speicher zuweisen und in jeder Iteration alles von der alten Position kopieren. Es wird wahrscheinlich sowieso nicht auffallen, aber es ist immer noch besser, das gesamte Array vor der Schleife zuzuweisen.

edit: Oh hat nicht bemerkt, dass es bereits in den Kommentaren erwähnt wurde.

edit2: In einem nicht repräsentativen Test dauerte das Redimmen innerhalb der Schleife etwa 6 mal so lange wie vorher.

2

Ich denke, einfacher zu vorgeschlagen Code vorgeschlagen: Kommentar zeigt nicht alle: Sie bereits Redim bei 0 Index, so was Sie brauchen, ist für jeden Datensatz zu erhöhen. Es wird am Ende ein unnötiges erstellt, entfernen Sie es.

dim arr() 
strSql = "SELECT item from dupEmail" 

Set rs = CurrentDb.OpenRecordset(strSql) 
rs.MoveFirst 
ReDim arr(0) 
Do While Not rs.EOF 
    arr(UBound(arr)) = rs.Fields(0) 
    ReDim Preserve arr(UBound(arr) + 1) 
    rs.MoveNext 
Loop 
ReDim Preserve arr(UBound(arr) - 1) 

Oder einfach für alle Datensätze REDIM unter Verwendung rs.RecordCount statt Redim (0) und Redim in der Schleife zu vermeiden. Du brauchst natürlich einen Zähler.

Verwandte Themen