HOWTO · VBA

Erstellen Sie ein Array aus einem bestimmten Bereich in Excel mit VBA

In diesem Artikel wird veranschaulicht, wie Sie mithilfe von VBA ein Array mit einem bestimmten Bereich in Microsoft Excel erstellen.

Auf dieser Seite

Weisen Sie die Value-Eigenschaft eines Bereichs einer VBA-Variant-Variablen zu, um einen Zellbereich zu laden. Ein Bereich mit mehreren Zeilen und Spalten gibt ein zweidimensionales Array zurück. Verwenden Sie daher Zeilen- und Spaltenindizes, um auf die Elemente zuzugreifen. Bei einer einzelnen Spalte oder Zeile lässt sich dieses Ergebnis mit Application.Transpose in ein eindimensionales Array umwandeln.

Arrays in VBA

Ein VBA-Array speichert eine geordnete Menge von Werten, auf die über Indizes zugegriffen wird. Bei einem Array fester Größe werden die Grenzen bei der Deklaration festgelegt; ein dynamisches Array lässt sich später mit ReDim dimensionieren. Eine Variant ist davon zu unterscheiden: Dieser flexible Variablentyp kann Werte verschiedener Art aufnehmen, darunter auch ein von Excel zurückgegebenes Array. Die Deklaration Dim values As Variant deklariert für sich genommen kein dynamisches Array.

Die Zuweisung eines mehrzelligen Bereichs ist nützlich, wenn Sie die Werte in VBA verarbeiten möchten, statt sie einzeln aus den Zellen auszulesen. Speichern Sie das Ergebnis in einer Variant, denn Range.Value gibt bei einem mehrzelligen Bereich ein Array zurück.

Einen bestimmten Zellbereich in ein Array laden

Weisen Sie die Value-Eigenschaft des gewünschten Bereichs zu. Die VBA-Anweisung Dim values As Variant: values = Range("A1:B3").Value lädt beispielsweise die Zellen A1 bis B3. Das Ergebnis hat zwei Dimensionen: Der erste Index wählt eine Tabellenzeile aus, der zweite eine Spalte. In diesem Beispiel reichen die Array-Grenzen üblicherweise von Zeile 1 bis 3 und von Spalte 1 bis 2. Verwenden Sie LBound und UBound, wenn der Code die Grenzen ermitteln soll, statt sie vorauszusetzen.

Lesen Sie ein Element mit beiden Indizes aus, zum Beispiel mit values(2, 1). Damit greifen Sie auf den Wert aus der zweiten Zeile des ausgewählten Bereichs und seiner ersten Spalte zu. Diese Indizes bezeichnen Positionen im zurückgegebenen Array und nicht allgemein Zeilen- und Spaltennummern des Arbeitsblatts: Beginnt der Bereich an einer anderen Zelle, entspricht das erste Array-Element weiterhin der Zelle oben links im Bereich.

Einen Spaltenbereich in ein eindimensionales Array umwandeln

Wenden Sie bei einem einspaltigen Bereich Application.Transpose auf den Bereichswert an, um die Werte in einem eindimensionalen Ergebnis anzuordnen. Zum Beispiel: Dim values As Variant: values = Application.Transpose(Range("A1:A3").Value). Anschließend können Sie die Werte mit einem einzelnen Index auslesen, etwa mit values(1) für das erste Element. Schreiben Sie Application.Transpose genau wie gezeigt; es ist das Excel-Anwendungselement für diese Umwandlung.

Eine vereinfachte Darstellung derselben Spaltenreihenfolge sehen Sie hier:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

cells = [["Ava"], ["Bo"], ["Cy"]]
values = [row[0] for row in cells]
print(values)
['Ava', 'Bo', 'Cy']

Diese Python-Darstellung zeigt nur die Änderung der Array-Form; sie führt weder Excel noch VBA aus. Verwenden Sie die obige VBA-Anweisung in einem Excel-Makro.

Einen Zeilenbereich in ein eindimensionales Array umwandeln

Auch ein Bereich mit einer Zeile ergibt zunächst ein zweidimensionales Ergebnis. Für ein eindimensionales Array wenden Sie Application.Transpose zweimal auf den Bereichswert an: Dim values As Variant: values = Application.Transpose(Application.Transpose(Range("A1:C1").Value)). Anschließend lassen sich die Elemente mit einem einzelnen Index auslesen, zum Beispiel mit values(1) für den Wert aus A1.

Die Muster für Spalten und Zeilen unterscheiden sich, weil die Ausrichtung des ausgewählten Bereichs das Zwischenergebnis beeinflusst. Verwenden Sie für eine Spalte die einfache Transponierung und für eine Zeile die verschachtelte Form. Wenn Ihr Verfahren Bereiche unterschiedlicher Größe unterstützen muss, ermitteln Sie vor dem Durchlaufen die resultierenden Grenzen mit LBound und UBound. Diese Funktionen geben den unteren und oberen Index an. Die Anzahl der Array-Elemente berechnet sich mit UBound(array) - LBound(array) + 1; die obere Grenze allein ist nicht die Elementanzahl, auch dann nicht, wenn die untere Grenze null ist.