Live-Forum - Die aktuellen Beiträge
Datum
Titel
16.10.2025 17:40:39
16.10.2025 17:25:38
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

ReDim Preserve - Laufzeitfehler 9

Forumthread: ReDim Preserve - Laufzeitfehler 9

ReDim Preserve - Laufzeitfehler 9
07.02.2004 15:57:20
Boris
Hi Leute,
bitte löst doch mal eben meinen Knoten im Hirn:
Warum gibt folgende Dummy-Prozedur beim zweiten Schleifendurchlauf nen Laufzeitfehler 9 - Index außerhalb des gültigen Bereiches? Bemeckert wird die ReDim-Zeile.
Es ist bewusst nur ein Dummycode - es geht mir also nur ums richtige Prinzip.

Sub test()
Dim myArray(), i As Integer
For i = 1 To 10
ReDim Preserve myArray(1 To i, 5)
myArray(i, 1) = i
myArray(i, 2) = i * 2
myArray(i, 3) = i * 3
myArray(i, 4) = i * 4
myArray(i, 5) = i * 5
Next i
End Sub

Danke vorab und
Boris
Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ReDim Preserve - Laufzeitfehler 9
07.02.2004 16:02:30
K.Rola
Hallo Boris(der{Boris}?),
bei ReDim Preserve kann nur die letzte Dimension geändert werden.
Gruß K.Rola
AW: ReDim Preserve - Laufzeitfehler 9
07.02.2004 16:21:01
Boris
Hi K.Rola,
...alles klar, wusst ich nicht. Merci!
{Boris}
Hast du nochmal auf den Algorithmus geschaut? Franz hat noch ne Lösung gepostet - hab sie aber (noch) nicht nachvollzogen. Ich selbst hab ihn nicht "geknackt".
Anzeige
AW: ReDim Preserve - Laufzeitfehler 9
07.02.2004 16:28:31
K.Rola
Hallo {Boris},
mit viel Aufwand kann man auch die andere(n) Dimensionen ändern, indem
man ein Array in ein anderes schaufelt, aber ich mach das nie, weil ich
dafür keine Notwendigkeit sehe und es immer Alternativen gibt.
Nö, hab ich nicht, werd gleich mal nachsehen.
Gruß K.Rola
Anzeige
ReDim - Problem - Nachfrage
07.02.2004 16:40:17
Boris
Hi K.Rola,
"...weil ich dafür keine Notwendigkeit sehe..."
Dann gib mir doch nochmal bitte einen Gedankenschubser:
Mit folgender Suchroutine lese ich die Treffer in die Array-Variable ein - danke deinem Hinweis hab ich jetzt auch die letzte Dimension variabel gehalten.
Nur:
Ich möchte am Ende die Variable an eine 5-spalteige Listbox übergeben - und durch das Umstellen der Variable sind jetzt Zeilen und Spalten vertauscht.
Was muss ich wie ändern? Gibt es so ne Art "Transpose-Funktion" für die Array-Variable?

Sub Suche(Suchbegriff As Variant, Suchspalte As Byte, Exakt As Boolean)
Dim C As Range, myArray() As Variant, i As Integer
i = 1
ReDim myArray(1 To 5, 1 To i)
For Each C In Worksheets(1).Range(Cells(1, Suchspalte), Cells(2000, Suchspalte))
If Exakt = False Then
If UCase(C) = Suchbegriff Then
ReDim Preserve myArray(1 To 5, 1 To i)
myArray(1, i) = Cells(C.Row, 1).Value
myArray(2, i) = Cells(C.Row, 2).Value
myArray(3, i) = Cells(C.Row, 3).Value
myArray(4, i) = Cells(C.Row, 4).Value
myArray(5, i) = Cells(C.Row, 5).Value
i = i + 1
End If
Else
If UCase(C) Like "*" & Suchbegriff & "*" Then
ReDim Preserve myArray(1 To 5, 1 To i)
myArray(1, i) = Cells(C.Row, 1).Value
myArray(2, i) = Cells(C.Row, 2).Value
myArray(3, i) = Cells(C.Row, 3).Value
myArray(4, i) = Cells(C.Row, 4).Value
myArray(5, i) = Cells(C.Row, 5).Value
i = i + 1
End If
End If
Next C
UserForm1.ListBox1.List() = myArray()
End Sub

Danke und Grüße
{Boris}
Anzeige
AW: ReDim - Problem - Nachfrage
07.02.2004 16:52:35
Nepumuk
Hallo Boris,
dazu gibt es die Column - Eigenschaft.
UserForm1.ListBox1.Column = myArray()
Gruß
Nepumuk
So einfach - wenn man weiss wie...
07.02.2004 16:54:57
Boris
Hi Nepumuk,
...das funktioniert einwandrei. Danke!
Muss mich doch nochmals etwas mehr mit den einzelnen Eigenschaften auseinandersetzen...
Grüße Boris
AW: So einfach - wenn man weiss wie...
07.02.2004 17:46:22
K.Rola
Hallo Boris,
wie ich sehe, hast du inzwischen Hilfe von Nepumuk bekommen. Hast du
jetzt eine fertige Lösung, würde mich mal interessieren.
Hab nur mal kurz deinen bisherigen Code angesehen, da gibts kleine
Ungereimtheiten, aber vielleicht hast du die ja jetzt schon bereinigt.
Von FPs Beitrag ist mir ganz schwindelig geworden, hab gar nicht erst
versucht das nachzuvollziehen, verstehst du das?
Gruß K.Rola
Anzeige
AW: So einfach - wenn man weiss wie...
07.02.2004 18:02:07
Boris
Hi K.Rola,
...du meinst sicher die Variable Exakt - die enthält nämlich genau das Gegenteil - hab sie deshalb im "neuen" Code auch umgetauft in "bolPart" und die If-Bedingungen umgedreht:
So geht´s - aber für fachfräuliche Verbesserungen Deinerseits bin ich natürlich gern und jederzeit zu haben:

Sub Suche(Suchbegriff As Variant, Suchspalte As Byte, bolPart As Boolean)
Dim C As Range, myArray() As Variant, i As Long, lRow As Long
i = 1
ReDim myArray(1 To 5, 1 To i)
lRow = Worksheets(1).Cells(Rows.Count, Suchspalte).End(xlUp).Row
For Each C In Worksheets(1).Range(Cells(1, Suchspalte), Cells(lRow, Suchspalte))
If bolPart Then
If UCase(C) Like "*" & Suchbegriff & "*" Then
ReDim Preserve myArray(1 To 5, 1 To i)
myArray(1, i) = Cells(C.Row, 1).Value
myArray(2, i) = Cells(C.Row, 2).Value
myArray(3, i) = Cells(C.Row, 3).Value
myArray(4, i) = Cells(C.Row, 4).Value
myArray(5, i) = Cells(C.Row, 5).Value
i = i + 1
End If
Else
If UCase(C) = Suchbegriff Then
ReDim Preserve myArray(1 To 5, 1 To i)
myArray(1, i) = Cells(C.Row, 1).Value
myArray(2, i) = Cells(C.Row, 2).Value
myArray(3, i) = Cells(C.Row, 3).Value
myArray(4, i) = Cells(C.Row, 4).Value
myArray(5, i) = Cells(C.Row, 5).Value
i = i + 1
End If
End If
Next C
If i = 1 Then
UserForm1.Label3 = "Kein Treffer"
Else
UserForm1.Label3.Caption = i - 1
End If
UserForm1.ListBox1.Column = myArray()
End Sub

Die Formeln von Franz hab ich im übrigen nocht nicht nachvollzogen - werde das noch nachholen. Aber wie es aussieht, hat der den Code gecheckt...?
Bin jetzt aber mal die nächste Std. weg.
Grüße Boris
Anzeige
AW: So einfach - wenn man weiss wie...
07.02.2004 19:49:12
K.Rola
Hallo Boris,
Ist es absolut sicher, dass Worksheet1 das aktive Blatt ist?
Sind die Suchbegriffe alle in Großschreibweise?
Wenn nicht, kann da eigentlich außer Zahlen nichts gefunden werden!
Gruß K.Rola
AW: So einfach - wenn man weiss wie...
07.02.2004 20:20:23
Boris
Hi K.Rola,
...du hast natürlich vollkommen Recht - aber das UF wird mittels Button aus Worksheet(1) aufgerufen - und dieser Button ist NUR dort vorhanden.
Zudem wurde die Variable "Suchbegriff" in der aufrufenden Prozedur bereits in Großbuchstaben umgewandelt:

Private Sub CommandButton3_Click()
If ComboBox1 = "" Then MsgBox "Fehlende Auswahl..": Exit Sub
ListBox1.Clear
Call Suche(UCase(TextBox1), ComboBox1.ListIndex + 1, CheckBox1.Value)
End Sub

Und empfangen werden die Werte ja mit
Sub Suche(Suchbegriff As Variant, Suchspalte As Byte, bolPart As Boolean)
Ich hoffe zumindest, dass es einigermaßen sicher ist. Ist in diesem Fall nur ein kleiner Gefallen für nen Kumpel - der hat sich ne recht große Datei (eher Datenbank) angelegt (alles zu Fuß...) - und ich bring ihm da nun ein paar Bequemlichkeiten rein.
Charme für mich: Ich kann am lebendigen Objekt VBA üben, ohne nachher im Zweifel gesteinigt zu werden.
Danke und Grüße
Boris
Anzeige
AW: So einfach - wenn man weiss wie...
07.02.2004 20:53:14
K.Rola
Hallo,
leicht überarbeitet:
Option Explicit

Sub Suche(Suchbegriff As Variant, Suchspalte As Integer, bolPart As Boolean)
Dim C As Range, myArray() As Variant, i As Long, x As Byte
Dim bytLookAt As Byte, strAddr As String
i = 1
If bolPart Then bytLookAt = 2 Else bytLookAt = 1
With Columns(Suchspalte)
Set C = .Find(Suchbegriff, LookIn:=xlValues, Lookat:=bytLookAt, _
SearchDirection:=1, after:=Cells(65536, Suchspalte))
If Not C Is Nothing Then
strAddr = C.Address
Do
ReDim Preserve myArray(1 To 5, 1 To i)
For x = 1 To 5
myArray(x, i) = Cells(C.Row, x)
Next
i = i + 1
Set C = .FindNext(C)
Loop While Not C Is Nothing And C.Address <> strAddr
End If
End With
If i = 1 Then
UserForm1.Label1 = "Kein Treffer"
Else
UserForm1.Label1.Caption = i - 1
End If
UserForm1.ListBox1.Column = myArray()
End Sub

Gruß K.Rola
Anzeige
Ich hätt ja nix anderes erwartet...
07.02.2004 21:10:51
Boris
Hi Meisterin der Codezeilen,
...läuft natürlich auf Anhieb einwandfrei. :-)
For x = 1 To 5
myArray(x, i) = Cells(C.Row, x)
Next
hatte ich zwischenzeitlich auch bereits geändert - die Idee mit Find ist aber wahrscheinlich die schnellere.
Jetzt verrate mir zum Abschluss nur noch eines:
So sieht mein Userform_Initialize aus (wichtig für die Frage ist nur die Listbox):

Private Sub UserForm_Initialize()
Dim C As Range
With ComboBox1
For Each C In [a1:e1]
.AddItem C
Next C
.ListIndex = 0
End With
With ListBox1
.ColumnCount = 5
.ColumnHeads = True
.ColumnWidths = "1cm;6cm;8cm;8cm;5cm"
.ListStyle = fmListStylePlain
End With
Label3.Caption = 0
End Sub

Wie bekomme ich die Spaltenbeschriftungen in der Listbox hin (stehen in A1:E1).
Mit "RowSource" ist es mir in sofern bekannt, als dass die Überschriften automatisch erkannt werden - aber hier hab ich kein RowSource. Wie geht´s?
Danke und Grüße
Boris
Anzeige
AW: Ich hätt ja nix anderes erwartet...
07.02.2004 22:09:45
K.Rola
Hallo Schmeichler,
ich hatte die Antwort gerade schonmal geschrieben aber die ist irgenwo
im Nirvana gelandet.
Die header gibts nur bei gebunder Box(RowSource), das ist auch nix zu
löten. Tricksen mit Label oder ListView aus den MSCOMCTL.OCX verwenden,
falls die zur Verfügung stehen(kennst du z.B. aus dem Explorer).
Gruß K.Rola
Anzeige
Shit - das wär´s nämlich gewesen...
07.02.2004 22:22:50
Boris
Hi K.Rola,
...dann wär die Suchroutine abgeschlossen.
Ich seh da nur die wenig schöne Möglichkeit, myArray transponiert in ein leeres Tabellenblatt zurückzuschreiben - Überschirften drüberzusetzen und dann mit RowSource arbeiten.
Das müsste doch eigentlich gehen?! Aber bevor ich da jetzt rumbastle...?
Grüße Boris
Anzeige
;
Anzeige

Infobox / Tutorial

ReDim Preserve in VBA: Laufzeitfehler 9 und Lösungen


Schritt-für-Schritt-Anleitung

Um den Laufzeitfehler 9 beim Einsatz von ReDim Preserve in VBA zu vermeiden, solltest du die Dimensionen deines Arrays korrekt handhaben. Hier ist eine Schritt-für-Schritt-Anleitung:

  1. Initialisiere das Array: Du kannst ein dynamisches Array mit Dim myArray() As Variant deklarieren.
  2. Verwende ReDim Preserve: Beachte, dass nur die letzte Dimension des Arrays mit ReDim Preserve geändert werden kann. Beispiel:
    ReDim Preserve myArray(1 To 5, 1 To i)
  3. Fülle das Array: In einer Schleife kannst du die Werte einfügen:
    myArray(1, i) = Wert1
    myArray(2, i) = Wert2
  4. Gib das Array aus: Am Ende kannst du das Array einer ListBox zuweisen, um die Daten anzuzeigen.

Häufige Fehler und Lösungen

Ein häufiger Fehler ist der Laufzeitfehler 9: "Index außerhalb des gültigen Bereichs". Hier sind einige Lösungen:

  • Dimensionen korrekt anpassen: Stelle sicher, dass du nur die letzte Dimension des Arrays mit ReDim Preserve änderst. Versuche, die Anzahl der Zeilen und Spalten vorab zu definieren.
  • Überprüfung der Indizes: Überprüfe, ob die Indizes, die du verwendest, innerhalb des gültigen Bereichs liegen.
  • Initialisierung: Achte darauf, dass das Array vor der Verwendung mit ReDim initialisiert wird.

Alternative Methoden

Wenn du mehr Flexibilität benötigst, gibt es alternative Methoden, um Arrays in VBA zu handhaben:

  • Verwende Collections: Statt Arrays kannst du auch Collections verwenden, die dynamisch wachsen können, ohne dass du ReDim Preserve benötigst.
  • Verwendung von Dictionaries: Diese bieten eine einfache Möglichkeit, Daten zu speichern und schnell darauf zuzugreifen.

Hier ein einfaches Beispiel für die Verwendung einer Collection:

Dim myCollection As Collection
Set myCollection = New Collection
myCollection.Add "Wert1"

Praktische Beispiele

Hier ist ein praktisches Beispiel, das zeigt, wie du ein Array mit ReDim Preserve füllst und es dann einer ListBox zuweist:

Sub Beispiel()
    Dim myArray() As Variant
    Dim i As Integer
    i = 0
    ReDim myArray(1 To 5, 1 To 1)  ' initialisiere das Array
    For j = 1 To 10
        i = i + 1
        ReDim Preserve myArray(1 To 5, 1 To i)
        myArray(1, i) = "Beispiel" & j
        myArray(2, i) = j
    Next j
    UserForm1.ListBox1.Column = myArray
End Sub

Tipps für Profis

  • Vermeide unnötige ReDim Preserve-Aufrufe: Jeder Aufruf kann die Performance beeinträchtigen. Versuche, die Größe des Arrays im Voraus so gut wie möglich abzuschätzen.
  • Nutze die Find-Methode: Anstatt Schleifen für das Durchsuchen von Zellen zu verwenden, kannst du die Find-Methode verwenden, um schneller zu Ergebnissen zu kommen.
  • Transpose-Funktion: Wenn du die Zeilen und Spalten vertauschen möchtest, kannst du das Array einfach transponieren, bevor du es in die ListBox einfügst:
    UserForm1.ListBox1.List = Application.Transpose(myArray)

FAQ: Häufige Fragen

1. Was ist der Hauptvorteil von ReDim Preserve?
ReDim Preserve ermöglicht es dir, die Größe eines Arrays zu ändern, während die vorhandenen Daten erhalten bleiben.

2. Warum erhalte ich immer wieder Laufzeitfehler 9?
Dieser Fehler tritt auf, wenn du versuchst, auf einen Index außerhalb des definierten Bereichs deines Arrays zuzugreifen. Überprüfe deine Indizes und stelle sicher, dass sie korrekt sind.

3. Gibt es eine Möglichkeit, die Spaltenüberschriften in einer ListBox anzuzeigen?
Ja, aber nur wenn du ein RowSource verwendest. Andernfalls könntest du manuell Labels verwenden oder die ListView-Steuerelemente nutzen, um Überschriften anzuzeigen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige