Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1824to1828
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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.

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
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?
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
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

170 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige