Dim, ReDim und noch mal ReDim..? (XL 2000)

cumulonimbus8

Fleet Admiral
Registriert
Apr. 2012
Beiträge
19.371
Hallo!

Mein Plan sieht so aus: DIMe ein (String) Array auf Vorrat auf 10. Lese eine Datei (und zwar in dieses Array!) ein und ermittele nebenbei deren Zeilenanzahl. Dann REDIME (samt PRESERVE) es auf diese Zeilenzahl.
Gut, das ist heutzutage eigentlich übertreiben, aber mir gings hier mal um einen dummen Versuch. Wie man unten sieht ging das schief. Also…

Also beginne ich stattdessen mal mit
DIM Feld() As String
lege gleich ein
REDIM Feld(5)
nach, starte das Dateieinlesen, mein Zähler I läuft mit (und kommt bei 3 an).
REDIM PRESERVE Feld(I)
liefert dann einen «Index außerhalb des gültigen Bereichs». Putzig genug, da 3 meistens kleiner als 5 ist und das Einlesen ja offensichtlich klappte. I wird korrekt gezählt, 3 Zeilen und I ist auch 3.

Darf man was geREDIMTes nicht nochmals REDIMEn?
Ich habe (aus Prinzip) mal keine Lust die Datei zu öffnen, zu zählen, zu REDIMEn um dann noch mal die Datei einzulesen.

Auch die anfängliche einfachere Idee gleich auf 5 zu DIMen klappt nicht - in der REDIM-Zeile begrüßt mich dann ein «Datenfeld bereits dimensioniert».

Irgendwie döf das. Wo ist der Fehler?

CN8
 
Hi,

also ich habe mit Excel 2010 gerade folgendes probiert:

Code:
Private Sub CommandButton1_Click()
Dim feld() As String
Dim lngI As Long
ReDim feld(5)
For lngI = 1 To 20
  ReDim Preserve feld(lngI)
  feld(lngI) = "Test"
Next
For lngI = 1 To 20
  Debug.Print feld(lngI)
Next
End Sub

Es läuft hier alles wie erwartet durch, kein Fehler.

Hab ich deinen Code Ablauf ungefähr richtig nachgebildet?
 
Code:
Sub Dummy()
Dim i As Long
Dim Feld() As String
ReDim Feld(5)
i = 20
ReDim Preserve Feld(i)
End Sub
Läuft sauber durch, was man auch schön im Debugger sehen kann.
 
Nicht anders habe ich im Kern programmiert - und doch von VBA den Tritt vors Schienbein bekommen.
Eure Codes laufen einwandfrei. Zafix!

Den streikenden Code habe ich vernichtet - DIM ohne Index (aber mit Typ), einfaches REDIM mit 2 Dimensionen - war das schon der Bockschuss? - um Platz vorzugeben, Datei einlesen und dann REDIM PRESERVE um den überschüssigen Platz wieder abzubauen.

REDIM PRESERVE innerhalb der Schleife (While Not EOF(1) … Wend) wäre noch ein Versuch gewesen das Array stückweise zu vergrößern. War damit der Bockschuss der ein zu großes Array verkleinern zu wollen? Mir schwant da was…

CN8
 
Zurück
Oben