Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Dynamisches Array

Dynamisches Array
15.10.2018 23:18:44
Marc
Hallo Forumsgemeinde,
ich kämpfe seit Stunden damit ein Array mit mehreren Zeilen zu erzeugen um dieses Später in einer Listbox darzustellen.
Im lokalen Fenster kann ich verfolgen wie sich das Array zunächst beim ersten positiven Suchergebnis (aus einem anderen Sheet) mit den gewünschten Werten füllt.
Wenn die Schleife beim nächsten positiven Suchergebnis mit Hilfe von "ReDim Preserve" die Anzahl der Zeilen im Array erweitern soll dann bekomme ich die Fehlermeldung, der "Index sei außerhalb des gültigen Bereichs".
Das ist der betreffende Teil des Codes:

Dim CoName as String
CoName = Inputbox("Wert suchen:")
Dim TSheet As Object
Set TSheet = ActiveWorkbook.Worksheets("Yahoo Tickersymbole")
Dim Zeilenzahl as Long
Zeilenzahl = TSheet.UsedRange.Rows.Count '
Dim Zeile As Long
Dim xVar()
For Zeile = 5 To Zeilenzahl
If InStr(1, TSheet.Cells(Zeile, 2).Value, CoName) > 0 Then
xVar = xVar + 1
ReDim Preserve vArray(0 To xVar, 2)
vArray(xVar, 0) = TSheet.Cells(Zeile, 1).Value
vArray(xVar, 1) = TSheet.Cells(Zeile, 2).Value
vArray(xVar, 2) = TSheet.Cells(Zeile, 3).Value
Else
End If
Next Zeile

Ist es grundsätzlich möglich die Anzahl der Zeilen in einem Array dynamisch zu erweitern? Wenn ja, wie muss ich den Code anpassen um das zu erreichen?
Viele Grüße
Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dynamisches Array
15.10.2018 23:23:59
onur
Du kannst nur die LETZTE Dimension eines Arrays verändern.
AW: Dynamisches Array
15.10.2018 23:36:36
Marc
Es muss doch eine Möglichkeit geben ein zweidimensionales Array mit dynamischer Zeilenanzahl zu erzeugen.
Wenn nicht, welche Alternative gibt es?
AW: Dynamisches Array
15.10.2018 23:46:02
onur
Wo ist das Problem? Vertausche einfach die Dimensionen.
P.S. Statt
ReDim Preserve vArray(0 To xVar, 2)

reicht auch
ReDim Preserve vArray(xVar, 2)

denn, wenn du nix angibst, fängt es immer mit 0 an.
Anzeige
AW: Dynamisches Array
16.10.2018 23:02:30
Marc
Vielen Dank Onur, leider ist mir nicht bekannt wie man die Dimensionen vertauschen könnte. Ich gehe zunächst mal davon aus vorne stehen die Zelen und hinten die Spalten. Wie kann man das vertauschen?
Die Variante "ReDim Preserve vArray(xVar, 2)" funktioniert nicht. Das hatte ich bereits vor dem Thread getestet. Beim Zweiten positiven Suchergebnis bricht er dann ab sobald das Array erweitert werden soll.
Anzeige
AW: Dynamisches Array
16.10.2018 08:18:38
Luschi
Hallo Marc,
lösche doch das Array und re-dimensioniere es neu, hier ein Schleifen-Beispiel::

Sub test1()
Dim xVar As Integer
'Dim vArray()
For xVar = 3 To 7
ReDim vArray(0 To xVar, 2)
vArray = Range(Cells(1, 1), Cells(xVar, 2)).Value
'Array löschen
Erase vArray
Next xVar
End Sub
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Dynamisches Array
16.10.2018 23:14:45
Marc
Hallo Luschi,
Du bist tasächlich aus Klaa Paris? Dann sei gegrüßt Nachbar. ;)
Zu Deinem Vorschlag: Also wenn ich das Array jedes mal wieder lösche dann lösche ich doch auch mit jedem mal den bereits vorhandenen Inhalt. Ich will aber mit jedem positiven Suchergebnis den inhalt erweitern und die vorherigen positiven Suchergebnisse im Array behalten.
Anzeige
AW: Dynamisches Array
18.10.2018 18:47:54
Marc
Ich habe das Problem nun gelöst indem ich zunächst die Spalten erweitert habe und dann alles in ein zweites Array verschoben habe (transponiert bzw. gedreht sozusagen).
Mit Worksheet.Transpose(vArray) hat es leider nicht geklappt, weshalb weiß ich nicht aber mit der folgenden Schleife hat es dann geklappt:
Dim tArray()
ReDim tArray(xVar, 2)
Dim colCount As Integer
For colCount = 0 To xVar
tArray(colCount, 0) = vArray(0, colCount) ' Ticker
tArray(colCount, 1) = vArray(1, colCount) ' Name
tArray(colCount, 2) = vArray(2, colCount) ' Börse
Next colCount

Anzeige
AW: Dynamisches Array
19.10.2018 18:24:20
onur
Und warum ist der Thread noch offen?
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Dynamisches Array in VBA erstellen und verwalten


Schritt-für-Schritt-Anleitung

  1. Array-Deklaration: Zuerst deklarierst du das Array, das du verwenden möchtest. Zum Beispiel:

    Dim vArray() As Variant
  2. Erster Durchlauf: Beginne mit einer Schleife, um dein Array mit Werten zu füllen. Achte darauf, dass du ReDim Preserve nur für die letzte Dimension verwendest:

    Dim xVar As Long
    xVar = 0
    For Zeile = 5 To Zeilenzahl
       If InStr(1, TSheet.Cells(Zeile, 2).Value, CoName) > 0 Then
           xVar = xVar + 1
           ReDim Preserve vArray(0 To xVar, 2)
           vArray(xVar, 0) = TSheet.Cells(Zeile, 1).Value
           vArray(xVar, 1) = TSheet.Cells(Zeile, 2).Value
           vArray(xVar, 2) = TSheet.Cells(Zeile, 3).Value
       End If
    Next Zeile
  3. Dynamische Erweiterung: Wenn du das Array bei jedem positiven Suchergebnis erweitern möchtest, stelle sicher, dass du nur die letzte Dimension erweiterst und nicht die erste.

  4. Transponieren: Falls du die Dimensionen ändern möchtest, kannst du ein neues Array erstellen und die Werte transponieren:

    Dim tArray() As Variant
    ReDim tArray(0 To xVar, 2)
    Dim colCount As Integer
    For colCount = 0 To xVar
       tArray(colCount, 0) = vArray(xVar, colCount) ' Beispiel für Ticker
    Next colCount

Häufige Fehler und Lösungen

  • Fehlermeldung "Index außerhalb des gültigen Bereichs": Dieser Fehler tritt häufig auf, wenn du versuchst, ein Array über seine Dimensionen hinaus zu erweitern. Stelle sicher, dass du nur die letzte Dimension mit ReDim Preserve anpasst.

  • Array nicht korrekt befüllt: Wenn das Array nicht die erwarteten Werte enthält, überprüfe die Logik der Schleife und die Bedingungen für das Hinzufügen von Werten.


Alternative Methoden

  • Neues Array erstellen: Statt ReDim Preserve zu verwenden, kannst du das Array löschen und neu dimensionieren, allerdings verlierst du dabei den vorherigen Inhalt:

    Erase vArray
    ReDim vArray(0 To neueDimension, 2)
  • Verwendung von Collections: Eine weitere Möglichkeit ist die Nutzung von Collection, um dynamische Arrays zu ersetzen. Collections können flexibler mit der Anzahl der Elemente umgehen.


Praktische Beispiele

  • Beispiel für dynamisches Array: Hier ein einfaches Beispiel, wie du ein dynamisches Array mit Werten füllen kannst:

    Dim vArray() As Variant
    Dim i As Long
    For i = 1 To 10
       ReDim Preserve vArray(0 To i)
       vArray(i) = "Wert " & i
    Next i
  • Daten aus einem Excel-Sheet in ein Array übertragen: Hier wird gezeigt, wie du Daten aus einem Excel-Sheet in ein dynamisches Array einlesen kannst.


Tipps für Profis

  • Nutze die Resize-Methode von VBA, um die Größe eines Arrays zu ändern. Dies ist besonders nützlich, wenn du mit großen Datenmengen arbeitest.
  • Überlege, ob es sinnvoll ist, ein Dictionary anstelle eines Arrays zu verwenden, um den Zugriff auf Daten zu verbessern.
  • Denke daran, dass bei der Verwendung von ReDim Preserve die Leistung beeinträchtigt werden kann, wenn das Array sehr groß ist. Versuche, die Größe des Arrays vor der Verwendung zu planen.

FAQ: Häufige Fragen

1. Kann ich die Größe eines mehrdimensionalen Arrays in VBA dynamisch ändern?
Ja, du kannst nur die letzte Dimension eines mehrdimensionalen Arrays dynamisch ändern. Alle anderen Dimensionen bleiben konstant.

2. Was ist der Unterschied zwischen einem statischen und einem dynamischen Array?
Ein statisches Array hat eine feste Größe, die bei der Deklaration festgelegt wird, während ein dynamisches Array mit ReDim eine flexible Größe hat, die zur Laufzeit angepasst werden kann.

3. Wie kann ich ein Array in VBA initialisieren?
Du kannst ein Array mit Dim und ReDim initialisieren. Beispiel:

   Dim vArray() As Variant
   ReDim vArray(0 To 10)

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige