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

Forumthread: Range(Spalte) -> mehrdimensionales Array

Range(Spalte) -> mehrdimensionales Array
21.04.2021 13:12:42
Rudi
Hallo,
ich habe hier eine Frage, mit der ich nicht weiterkomme:
Ich möchte in einem zweidimensionalen Array Daten sammeln. Stellt man es sich als Tabelle vor so möchte ich dann aus einer Tabelle in Excel einen zusammenhängenden Bereich aus einer Tabellenspalte in die erste Spalte des Arrays einfügen (hier geht es um Namen). Anschließend erfolgt eine Auswertung, die in meinem Fall zähl, wie viele Dokumente einem Namen zugeordnet sind. Diese Zahl soll in die zweite "Spalte" des Arrays (quasi hinter den Namen) geschrieben werden.
Sobald das Array mit allen Zahlen befüllt ist, soll die Spalte mit den Zahlen in die Exceltabelle übertragen werden.
Ich habe herumexperimentiert mit einem Aufruf dieser Art (etwas vereinfacht, da die Zeilenanzahl beliiebig groß sein kann):
arr = Range(Worksheets("tabelle").Cells(2,1), Worksheets("tabelle".Cells(2000,1)
Das Problem besteht dann erstmal darin, dass ich nur eine Dimension habe.
Gibt es eine elegante Methode, ein mehrdimensionales Array mit nur einer Spalte zu befüllen, ohne alle Einträge einzeln durchzugehen?
Nochmal lapidar zusammengefasst: Ich möchte die erste "Spalte" des Arrays in einem Rutsch mit einer einspaltigen Range aus Excel füllen, dann die zweite Spalte des Arrays irgendwie bearbeiten (kein Problem) und die zweite Spalte des Arrays dann in die Ursprungstabelle schreiben in eine andere Spalte der Tabelle.
Lieben Dank vorab.
Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: Range(Spalte) -> mehrdimensionales Array
21.04.2021 13:37:48
Rudi
Hallo,
dein Array ist schon 2-dimensional. arr(1 to 1999, 1 to 1) Allerdings hat die 2te Dimension die Größe 1. Das muss du erweitern.

arr = Range(Worksheets("tabelle").Cells(2,1), Worksheets("tabelle").Cells(2000,1))
Redim Preserve arr( 1 to ubound(arr), 1 to 2)
Gruß
Rudi
Anzeige
AW: Range(Spalte) -> mehrdimensionales Array
21.04.2021 14:07:13
Rudi
Danke, das war für mich jetzt nicht so offensichtlich :-)
Wie würde es aussehen, die zweite Spalte dann in die Tabelle zu schreiben, möglichst ohne Schleifenkonstrukt?
Andernfalls wären zwei Arrays ggf. doch die bessere Wahl.
AW: Range(Spalte) -> mehrdimensionales Array
21.04.2021 14:45:58
Daniel
Hi
wenn du eine bestimmte Spalte eines Arrays in das Tabellenblatt zurück schreiben willst, dann geht das so (hier für die 2. Spalte)

cells(x, y).Resize(Ubound(arr, 1), 1).Value = Worksheetfunction.Index(arr, 0, 2)
allerdings würde ich hier fast zwei Arrays bevorzugen.
die kann man dann mit sprechenden Namen versehen, was den Code besser lesbar macht.
"arr(x, 1)" bzw "arr(x, 2)" ist halt nicht so sprechend wie "arrNamen(x, 1)" und "arrErgebnis(x, 1)"
Gruß Daniel
Anzeige
AW: Range(Spalte) -> mehrdimensionales Array
21.04.2021 16:23:24
Rudi
Danke. Das hilft mir bestimmt in der Zukunft noch weiter.
Auf die Variante mit 2 Arrays hatte ich mich jetzt auch schon irgendwie eingeschossen.
Derzeit versuche ich es so, indem ich ein zweites Array in der Größe des obigen Arrays zu erstellen (aber mit nur einer Dimension, Namen geändert):
ReDim arrErgebnis(1 To UBound(arrNamen, 1))
Wir würde dann das effiziente Zurückschreiben in die Zellen der Tabelle aussehen?
Anzeige
AW: Range(Spalte) -> mehrdimensionales Array
21.04.2021 16:36:42
Daniel
Hi
eindimensionale Arrays kann man direkt in die Tabelle zurückschreiben, wenn die Werte in eine Zeile sollen:

Cells(1, 1).resize(1, Ubound(arrErgebnis)).Value = arrErgebnis
sollen die Werte in eine Spalte, müsste man Transponieren:

Cells(1, 1).Resize(Ubound(arrErgebnis), 1).value = Worksheetfunction.Transpose(arrErgebnis)
Transpose hat so seine Eigenheiten, je nach Excelversion wenn es um größere Arrays geht (ab c.a. 65.000 Einträgen, muss man aber testen)
im WorstCase funktionert es nicht mehr, oder es kann sein dass es deutlich langsamer ist, als die Werte per Schleife in ein echtes 2-D-Array umzuschaufeln.
aber wie gesagt, erst bei großen Arrays und dann müsste man abhängig von der tatsächlichen Größe und der Excelversion testen, was langsamer ist, wenn das makro auf Geschwindigkeit optimiert werden soll.
Gruß Daniel
Anzeige
AW: Range(Spalte) -> mehrdimensionales Array
21.04.2021 16:44:16
Rudi
Super! Danke Euch für die Hilfe. Ich werde daran morgen weiterarbeiten. Sieht mir aber vielversprechend aus :-)
AW: Range(Spalte) -> mehrdimensionales Array
21.04.2021 13:39:05
Daniel
HI
ich würde hier mit 2 Arrays arbeiten, das macht das Einlesen und Rückschreiben einfacher.
ein echtes Mehrdimensionales Array wäre nur dann eine Verbesserung, wenn du viele Spalten hast und auch Schleifen über die Spalten laufen lassen willst.
wenn man das nicht vor hat, kann man für jede Spalte ein eigenes Array erstellen.
Gruß Daniel
Anzeige
AW: Range(Spalte) -> mehrdimensionales Array
21.04.2021 14:20:23
GraFri
Hallo
Eine Möglichkeit, Spalte A und B in einem Rutsch einlesen, die Namen aus Spalte 1. Spalte bearbeiten, das Ergebnis in die dazugehörige 2. Spalte schreiben und alles wieder in das Blatt retour schreiben.
Option Explicit

Sub SpezialBerechnung()
Dim arrDaten As Variant
Dim n As Long
' Liest Spalte A und Spalte B in ein 2-dimensionales Array ab Zeile 2 eingelesen
' Daten in das Array 'arrDaten' Beginn: arrDaten(1 to count(arrDaten), 1 to 2)
With Worksheets("Tabelle1")
arrDaten = .Range("A2:B" & .Cells(.Rows.Count, 1).End(xlUp).Row)
' jetzt jedes Eintrag der Spalte 1 (A - Namen) bearbeiten und das Ergebnis aus
' deiner Berechnung der Spalte 2 zuweisen (B)
For n = 1 To UBound(arrDaten, 1)
' Deine Bearbeitung z.B.:
Select Case arrDaten(n, 1)
Case "Mayer": arrDaten(n, 2) = 1
Case "Maier": arrDaten(n, 2) = 2
Case "Meyer": arrDaten(n, 2) = 3
Case Else: arrDaten(n, 2) = vbNullString
End Select
Next n
' alles wieder zurück, wobei die Spalten überschrieben werden
.Range("A2").Resize(UBound(Daten, 1) - LBound(Daten, 1) + 1, UBound(Daten, 2) - LBound(Daten, 2) + 1) = Daten
End With
End Sub

mfg GraFri
Anzeige
Korrektur -> mehrdimensionales Array
21.04.2021 14:28:54
GraFri
Upps, beim kopieren was übersehen
Richtig:
Option Explicit

Sub SpezialBerechnung()
Dim arrDaten As Variant
Dim n As Long
' Liest Spalte A und Spalte B in ein 2-dimensionales Array ab Zeile 2 eingelesen
' Daten in das Array 'arrDaten' Beginn: arrDaten(1 to count(arrDaten), 1 to 2)
With Worksheets("Tabelle1")
arrDaten = .Range("A2:B" & .Cells(.Rows.Count, 1).End(xlUp).Row)
' jetzt jedes Eintrag der Spalte 1 (A - Namen) bearbeiten und das Ergebnis aus
' deiner Berechnung der Spalte 2 zuweisen (B)
For n = 1 To UBound(arrDaten, 1)
' Deine Bearbeitung z.B.:
Select Case arrDaten(n, 1)
Case "Mayer": arrDaten(n, 2) = 1
Case "Maier": arrDaten(n, 2) = 2
Case "Meyer": arrDaten(n, 2) = 3
Case Else: arrDaten(n, 2) = vbNullString
End Select
Next n
' alles wieder zurück, wobei die Spalten überschrieben werden
.Range("A2").Resize(UBound(arrDaten, 1) - LBound(arrDaten, 1) + 1, _
UBound(arrDaten, 2) - LBound(arrDaten, 2) + 1) = arrDaten
End With
End Sub

mfg GraFri
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Daten in ein mehrdimensionales Array in Excel übertragen


Schritt-für-Schritt-Anleitung

  1. Erstelle ein neues Modul in deinem Excel VBA-Editor.
  2. Definiere ein mehrdimensionales Array. Das Array kann so aussehen:
    Dim arrDaten As Variant
  3. Lese die Daten aus einer Excel-Tabelle in das Array ein. Du kannst den Bereich anpassen, je nachdem, wo sich deine Daten befinden:
    arrDaten = Worksheets("Tabelle1").Range("A2:B" & Worksheets("Tabelle1").Cells(Rows.Count, 1).End(xlUp).Row)
  4. Bearbeite die Daten im Array, zum Beispiel durch eine Schleife, um Werte zu ändern:
    Dim n As Long
    For n = 1 To UBound(arrDaten, 1)
       Select Case arrDaten(n, 1)
           Case "Mayer": arrDaten(n, 2) = 1
           Case "Maier": arrDaten(n, 2) = 2
           Case "Meyer": arrDaten(n, 2) = 3
           Case Else: arrDaten(n, 2) = vbNullString
       End Select
    Next n
  5. Schreibe die bearbeiteten Daten zurück in die Excel-Tabelle:
    Worksheets("Tabelle1").Range("A2").Resize(UBound(arrDaten, 1), UBound(arrDaten, 2)).Value = arrDaten

Häufige Fehler und Lösungen

  • Fehler: „Typen unverträglich“
    Lösung: Stelle sicher, dass der Datentyp des Arrays korrekt definiert ist. Verwende Variant, um verschiedene Datentypen zu erlauben.

  • Fehler: „Index außerhalb des zulässigen Bereichs“
    Lösung: Überprüfe, ob die Indizes des Arrays korrekt sind und dass du die Grenzen des Arrays nicht überschreitest.

  • Fehler: „Methoden oder Datenmitglieder nicht gefunden“
    Lösung: Vergewissere dich, dass die Arbeitsblattnamen und Zellreferenzen korrekt sind.


Alternative Methoden

  • Verwendung von zwei eindimensionalen Arrays: Anstatt ein mehrdimensionales Array zu verwenden, kannst du für jede Spalte ein separates eindimensionales Array definieren. Dies kann die Lesbarkeit des Codes erhöhen:

    Dim arrNamen() As String
    Dim arrErgebnis() As Long
  • Excel VBA Array to Range: Du kannst auch die Methode Value nutzen, um ein eindimensionales Array direkt in eine Excel-Tabelle zu schreiben.


Praktische Beispiele

Hier ist ein einfaches Beispiel, das die Verwendung eines mehrdimensionalen Arrays in Excel VBA zeigt:

Sub Beispiel()
    Dim arrDaten As Variant
    Dim n As Long

    ' Daten einlesen
    arrDaten = Worksheets("Tabelle1").Range("A2:B10")

    ' Daten bearbeiten
    For n = 1 To UBound(arrDaten, 1)
        arrDaten(n, 2) = arrDaten(n, 1) & " bearbeitet"
    Next n

    ' Daten zurückschreiben
    Worksheets("Tabelle1").Range("A2").Resize(UBound(arrDaten, 1), UBound(arrDaten, 2)).Value = arrDaten
End Sub

Tipps für Profis

  • Verwende Redim Preserve: Wenn du die Größe deines mehrdimensionalen Arrays ändern musst, benutze Redim Preserve, um die bereits gespeicherten Daten beizubehalten.

  • Optimierung der Geschwindigkeit: Bei großen Datenmengen kann es effizienter sein, die Daten in einem eindimensionalen Array zu verarbeiten und anschließend zurückzuschreiben.

  • Vermeide Schleifen, wenn möglich: Nutze die Worksheetfunction.Index-Methode, um Daten aus einem Array zurückzuschreiben, ohne Schleifen zu verwenden.


FAQ: Häufige Fragen

1. Wie erstelle ich ein mehrdimensionales Array in Excel VBA?
Du kannst ein mehrdimensionales Array einfach mit Dim arr() As Variant deklarieren und dann mit Werten befüllen.

2. Kann ich Daten ohne Schleifen in eine Excel-Tabelle schreiben?
Ja, du kannst die Value-Eigenschaft und die Resize-Methode verwenden, um Daten in einem Rutsch zu übertragen.

3. Was sind die Vorteile eines mehrdimensionalen Arrays?
Mehrdimensionale Arrays erlauben es dir, Daten in einer strukturierten Form zu speichern, was besonders nützlich ist, wenn du mit Tabellen oder komplexen Datenstrukturen arbeitest.

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