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

Forumthread: Array dynamisch anpassen

Array dynamisch anpassen
KLE
Hallo,
ich habe mal wieder eine Frage zu Arrays und suche nun schon seit Samstag erfolglos eine Lösung für folgendes Problem:
Ich habe ein Array mit: Dim arrAL() in Option Explicit deklariert und im Code verwende ich:
...
ReDim Preserve arrDL(AnzSpalten, 0 To LZeile - 1)
...
Habe auch schon erfolglos folgendes versucht:
...
ReDim Preserve arrDL(0 to AnzSpalten, 0 To LZeile - 1)
...
Wobei die AnzSpalten (von Warengruppen) zuvor ausgelesen und übergeben wird. Und LZeile = die Anzahl der Datensätze der Artikel.
Ändere ich nun die Warengruppen (füge ein hinzu), erhalte ich hier die Fehlermeldung: Außerhalb des Bereichs! - wenn ich die Anzahl ändere, während ich im Tool aktiv bin. (Eine Funktion im Tool, die Warengruppen anzupassen).
Jetzt habe ich gelesen, man kann nur den Hinteren Bereich mit "Preserve" neu zuweisen.
WAS kann ich WIE tun, wenn sich aber während einer aktiven Eingabephase - BEIDE Werte ändern. Sprich neue Artikel hinzukommen und auch die Anzahl der Warengruppen sich ändern?
Gibt es eine Art "Resst" für Array's ? Nur Redim arrAL() funktioniert nicht... will mehr haben...
Gruß und Danke für Eure Hilfe!!!
Kay
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Array dynamisch anpassen
29.11.2011 13:57:03
Rudi
Hallo,
Nur Redim arrAL() funktioniert nicht
Sollte schon funktionieren. Nur verlierst du dann alle Werte.
Ergo:
Erst in ein anderes Array packen, neu dimensionieren, aus anderem Array wieder füllen.
Gruß
Rudi
AW: Array dynamisch anpassen
29.11.2011 13:58:58
Timo
Hallo Rudi,
wäre in solch einem Fall eine Collection eine Möglichkeit?
Gruß
Timo
Anzeige
AW: Array dynamisch anpassen
29.11.2011 14:18:04
Harald
Hallo Kay,
das geht ein wenig von hinten durch die kalte Küche. Erst mal ein Beispielcode:

Option Explicit
Option Base 0
Type Zeilenarray
arr_Spalten() As Long
End Type
Sub test()
Dim arr_Zeilen() As Zeilenarray
Dim Anz_Zeilen As Long
Dim Anz_Spalten As Long
Dim i As Long, k As Long
Anz_Zeilen = 10
Anz_Spalten = 5
ReDim Preserve arr_Zeilen(Anz_Zeilen)
For i = 0 To Anz_Zeilen - 1
ReDim Preserve arr_Zeilen(i).arr_Spalten(Anz_Spalten)
For k = 0 To Anz_Spalten - 1
arr_Zeilen(i).arr_Spalten(k) = i * k
Debug.Print arr_Zeilen(i).arr_Spalten(k)
Next
Next
End Sub
So geht's: Die Matrix wird nicht als solche direkt definiert, sondern als ein Array (Vektor), wobei jedes Element des Arrays wiederum ein Array ist. Dafür sorgte die TYPE Anweisung. Sie definiert einen neuen Datentyp namens Zeilenarray, der jeweils eine Spalte beinhaltet (über die Namensgebung könnte man diskutieren, will ich aber jetzt nicht).
Von diesem Typ wird mit DIM arr_zeilen() ein weiteres Array angelegt. Dieses Array kann man mit
ReDim Preserve arr_Zeilen(Anz_Zeilen)
zunächst wie gewohnt neu dimensionieren. Die Umdimensionierung der Spalten erfolgt dann innerhalb einer Schleife mittels
ReDim Preserve arr_Zeilen(i).arr_Spalten(Anz_Spalten)
In dem Beispiel schreibe ich in die Zellen erst mal Murcks (i*k). Du musst das natürlich an Deine weiteren Belange anpassen.
Ach ja, auf die einzelnen Elemente der so gebildeten Matrix greifst Du über die "Punkt-Notation" zu:
arr_Zeilen(i).arr_Spalten(k) = i * k
Gruß
Harald
Anzeige
Vielen Dank für Eure Hilfe...
29.11.2011 14:38:58
KLE
...vor allem auch für die ausführlichen Erläuterungen. So macht es Spass, was zu lernen ;o)
Werde mich nun dran machen und den Code entsprechend Euerer Anregungen anpassen.
Vielen herzlichen Dank!
Gruß
Kay
;

Forumthreads zu verwandten Themen

Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Dynamisches Anpassen von Arrays in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Array deklariert: Beginne mit der Deklaration deines dynamischen Arrays. Verwende Dim arrAL() in der Option Explicit-Deklaration.

    Dim arrAL() As Long
  2. ReDim Preserve: Um die Größe des Arrays dynamisch anzupassen, nutze ReDim Preserve. Beachte, dass nur die hinteren Dimensionen des Arrays beibehalten werden.

    ReDim Preserve arrAL(0 To AnzSpalten - 1)
  3. Neues Array füllen: Falls du die gesamte Struktur anpassen musst und nicht nur die hinteren Dimensionen, erstelle ein neues Array und kopiere die Werte.

    Dim newArray() As Long
    ReDim newArray(0 To AnzSpalten - 1)
    For i = LBound(arrAL) To UBound(arrAL)
       newArray(i) = arrAL(i)
    Next i
    arrAL = newArray
  4. Anpassung während der Eingabe: Wenn sich sowohl die Anzahl der Artikel als auch die Warengruppen ändern, kannst du in einer Schleife die ReDim Preserve-Anweisung verwenden, um das Array schrittweise anzupassen.


Häufige Fehler und Lösungen

  • Fehler: "Außerhalb des Bereichs!": Dieser Fehler tritt auf, wenn du versuchst, ein Array außerhalb seiner definierten Grenzen anzupassen. Achte darauf, dass du die Limits korrekt setzt.

  • Lösung: Stelle sicher, dass du die neue Größe des Arrays vor der Verwendung von ReDim Preserve korrekt berechnest.


Alternative Methoden

  • Verwendung von Collections: Eine Collection kann eine flexiblere Alternative zu Arrays sein, insbesondere wenn du nicht sicher bist, wie viele Elemente du später benötigst. Sie ermöglicht das Hinzufügen und Entfernen von Elementen ohne das Risiko, Elemente zu verlieren.

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

Praktische Beispiele

Hier ist ein Beispiel, wie du ein vba dynamisches Array füllen kannst. Dieses Beispiel zeigt den Umgang mit einer Matrix, die aus einem Array von Arrays besteht.

Option Explicit
Option Base 0

Type Zeilenarray
    arr_Spalten() As Long
End Type

Sub test()
    Dim arr_Zeilen() As Zeilenarray
    Dim Anz_Zeilen As Long
    Dim Anz_Spalten As Long
    Dim i As Long, k As Long
    Anz_Zeilen = 10
    Anz_Spalten = 5
    ReDim Preserve arr_Zeilen(Anz_Zeilen)

    For i = 0 To Anz_Zeilen - 1
        ReDim Preserve arr_Zeilen(i).arr_Spalten(Anz_Spalten)
        For k = 0 To Anz_Spalten - 1
            arr_Zeilen(i).arr_Spalten(k) = i * k
            Debug.Print arr_Zeilen(i).arr_Spalten(k)
        Next
    Next
End Sub

Tipps für Profis

  • Verwende Option Base 1: Wenn du mit dynamischen Arrays arbeitest, kann es hilfreich sein, die Basis auf 1 zu setzen, um die Lesbarkeit zu erhöhen.

  • Lege eine Maximalgröße fest: Wenn deine Anwendung es zulässt, definiere eine Maximalgröße für dein dynamisches Array, um die Performance zu verbessern.


FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen einem statischen und einem dynamischen Array?
Ein statisches Array hat eine feste Größe, während ein dynamisches Array zur Laufzeit angepasst werden kann.

2. Wie kann ich ein dynamisches Array in Excel VBA füllen?
Du kannst ein dynamisches Array in VBA füllen, indem du ReDim Preserve verwendest und die Werte in einer Schleife zuweist.

3. Gibt es eine Möglichkeit, ein Array zurückzusetzen?
Ja, indem du einfach ReDim arrAL() ohne Preserve verwendest, wird das Array zurückgesetzt, aber alle Werte gehen verloren.

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