Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Array-Größe während der Laufzeit ändern

Array-Größe während der Laufzeit ändern
07.05.2015 21:57:50
SteffenS
Hallo Zusammen,
ich definiere in einem Makro ein Array. Da ich nicht weiß wie groß das Array werden kann, möchte ich dieses während der Laufzeit gern anpassen:
Sub test()
ReDim aMaps(1, 1) As Variant
last_cell = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To last_cell
ReDim Preserve aMaps(i - 2, 1)
aMaps(i - 2, 1) = Cells(i, 1).Value
aMaps(i - 2, 2) = Cells(i, 2).Value
Next i
End Sub
Leider funktioniert dies nicht. Es erscheint der Fehler: Index außerhalb des gültigen Bereichs.
Da ich mit Arrays bisher nicht gearbeitet habe bräuchte ich hier mal Eure Hilfe.
Danke Euch schon mal.
VG Steffen Schmerler

Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array-Größe während der Laufzeit ändern
07.05.2015 22:18:29
Nepumuk
Hallo,
mit Preserve kannst du nur die letzte Dimension eines Arrays ändern. Also kippe das Array.
Gruß
Nepumuk

Man kann das aber auch wie folgt machen, ...
08.05.2015 00:36:56
Luc:-?
…Steffen,
da sich die Array-Größe hptsächlich an der ZeilenAnzahl bei ganzen 2 Spalten orientiert:
Rem Anlegen eines VertikalVektors mit Elementen aus HorizontalVektoren
'   (Variant m.Arrays -> Arrays in Array) m.3 ErgebnisAusgabeVarianten
Sub test()
Const allErgBer$ = "I2:J4 K2:L4 M2:N4"  'nur f.Test; ggf anpassen!
Dim i As Long, last_cell As Long, adErgBer$(), aMaps As Variant
last_cell = Cells(Rows.Count, 1).End(xlUp).Row
ReDim aMaps(1 To last_cell - 1): adErgBer = Split(allErgBer)
For i = 2 To last_cell
aMaps(i - 1) = Array(Cells(i, 1), Cells(i, 2))
Next i
Rem Ausgabe Var1
Range(adErgBer(0)) = WorksheetFunction.Index(aMaps, 0, 0)
Rem Ausgabe Var2
With WorksheetFunction
Range(adErgBer(1)) = .Transpose(.Transpose(aMaps))
End With
Rem Ausgabe Var3
For i = 1 To UBound(aMaps)
Range(adErgBer(2)).Rows(i) = aMaps(i)
Next i
End Sub
Gruß, Luc :-?
Besser informiert mit …

Anzeige
AW: Man kann das aber auch wie folgt machen, ...
08.05.2015 07:58:32
SteffenS
Hallo,
danke für die Antworten. Ich habe es jetzt so gelöst:
ReDim aMaps(2 To last_cell, 2) As Variant
aMaps(i, 1) = Cells(i, 1).Value
aMaps(i, 2) = Cells(i, 2).Value
Damit klappt es.
@Nepumuk
Deine Antwort habe ich leider nicht ganz verstanden.
Was meinst Du damit, dass es mit 'ReDim Preserve aMaps(i, 1) As Variant nicht funktioniert?
Da ich mich mit Arrays noch nicht weiter beschäftigt habe, muss ich nochmal nachfragen.
VG Steffen

Anzeige
AW: Array-Größe während der Laufzeit ändern
08.05.2015 08:31:25
Beverly
Hi Steffen,
Sub test()
ReDim aMaps(1, 1) As Variant
last_cell = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To last_cell
ReDim Preserve aMaps(1, i - 2)
aMaps(0, i - 2) = Cells(i, 1).Value
aMaps(1, i - 2) = Cells(i, 2).Value
Next i
End Sub
Nur das letzte Feld lässt sich dynamisch erweitern.


Anzeige
in dem Fall kannst du einfach ....
08.05.2015 09:11:14
Rudi
Hallo,
so verfahren:
Sub test()
Dim aMaps As Variant, LastCell As Long
LastCell = Cells(Rows.Count, 1).End(xlUp).Row
aMaps = Range(Cells(2, 1), Cells(LastCell, 2))
End Sub
Gruß
Rudi

AW: in dem Fall kannst du einfach ....
08.05.2015 12:31:40
SteffenS
Danke Euch nochmal.
VG Steffen
;
Anzeige
Anzeige

Infobox / Tutorial

Array-Größe während der Laufzeit anpassen in Excel VBA


Schritt-für-Schritt-Anleitung

Um die Größe eines Arrays während der Laufzeit in Excel VBA anzupassen, kannst Du folgende Schritte befolgen:

  1. Array deklarieren: Starte mit der Deklaration des Arrays. In diesem Beispiel verwenden wir ein Variant-Array, das verschiedene Datentypen aufnehmen kann.

    Dim aMaps() As Variant
  2. Letzte Zeile ermitteln: Bestimme die letzte Zeile in Deiner Datenquelle, um die Größe des Arrays dynamisch anzupassen.

    last_cell = Cells(Rows.Count, 1).End(xlUp).Row
  3. Array anpassen: Nutze ReDim und ReDim Preserve, um die Array-Größe anzupassen. Beachte, dass mit Preserve nur die letzte Dimension eines Arrays geändert werden kann.

    ReDim Preserve aMaps(1, last_cell - 2)
  4. Daten einfügen: Fülle das Array mit Werten aus den Zellen.

    For i = 2 To last_cell
       aMaps(i - 2, 0) = Cells(i, 1).Value
       aMaps(i - 2, 1) = Cells(i, 2).Value
    Next i

Häufige Fehler und Lösungen

  • Fehler: "Index außerhalb des gültigen Bereichs": Dieser Fehler tritt auf, wenn Du versuchst, auf ein nicht existierendes Element im Array zuzugreifen. Überprüfe die Indizes und stelle sicher, dass Du die Größe des Arrays korrekt anpasst.

  • Lösung: Nutze ReDim Preserve korrekt, um sicherzustellen, dass Du beim Ändern der Array-Größe die bestehende Datenstruktur beibehältst.


Alternative Methoden

Wenn Du nicht mit ReDim Preserve arbeiten möchtest, kannst Du auch die gesamte Datenreihe in einem Schritt in ein Array laden:

Sub test()
   Dim aMaps As Variant
   Dim LastCell As Long
   LastCell = Cells(Rows.Count, 1).End(xlUp).Row
   aMaps = Range(Cells(2, 1), Cells(LastCell, 2)).Value
End Sub

Diese Methode ist effizient, da sie die gesamte Datenreihe auf einmal in das Array lädt.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie Du die Array-Größe während der Laufzeit ändern kannst:

Sub test()
    Dim aMaps() As Variant
    Dim last_cell As Long
    last_cell = Cells(Rows.Count, 1).End(xlUp).Row
    ReDim aMaps(1 To last_cell - 1, 1 To 2)

    For i = 2 To last_cell
        aMaps(i - 2, 1) = Cells(i, 1).Value
        aMaps(i - 2, 2) = Cells(i, 2).Value
    Next i
End Sub

In diesem Beispiel kannst Du die Array-Größe an die Anzahl der Zeilen in Deiner Excel-Tabelle anpassen.


Tipps für Profis

  • Verwende UBound und LBound: Diese Funktionen helfen Dir, die obere und untere Grenze eines Arrays zu ermitteln, was nützlich ist, wenn Du mit dynamischen Arrays arbeitest.

  • Leistungsoptimierung: Wenn Du große Datenmengen verarbeiten musst, ziehe in Betracht, die Daten zuerst in ein Array zu laden, bevor Du sie bearbeitest. Dies kann die Leistung erheblich steigern.


FAQ: Häufige Fragen

1. Wie kann ich die Größe eines Arrays in VBA ermitteln?
Du kannst die Größe eines Arrays mit UBound(aMaps) für die obere Grenze und LBound(aMaps) für die untere Grenze ermitteln.

2. Was ist der Unterschied zwischen ReDim und ReDim Preserve?
ReDim initialisiert ein neues Array und entfernt alle vorhandenen Daten, während ReDim Preserve die vorhandenen Daten im Array beibehält, jedoch nur für die letzte Dimension.

3. Kann ich die Größe eines Arrays in einer Schleife ändern?
Ja, Du kannst die Größe eines Arrays in einer Schleife ändern, aber sei vorsichtig, dass Du ReDim Preserve nur für die letzte Dimension verwendest, um Datenverlust zu vermeiden.

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