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

in Array schreiben ohne Schleife

Forumthread: in Array schreiben ohne Schleife

in Array schreiben ohne Schleife
26.04.2016 17:08:29
Frank
Hallo zusammen.
Ich habe in einem Excelsheet drei NICHT zusammenhängende, benannte Bereiche (RANGE1, RANGE2, RANGE3). Die drei Ranges haben jeweils vier Zeilen.
Ich habe in VBA ein Array deklariert: Dim test(1 To 3, 1 To 4).
Wie bekomme ich die Daten der einzelnen Ranges in das Array geschaufelt OHNE eine Schleife zu verwenden. Mir schwebt eine direkte Zuweisung vor wie
test(1, 1 to 4) = RANGE1
test(2, 1 to 4) = RANGE2
Hat jemand eine Idee?
Vielen Dank,
Frank

Anzeige

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

Betreff
Datum
Anwender
Anzeige
Nachtrag: die drei Ranges haben je eine Spalte
26.04.2016 17:09:55
Frank
.

AW: in Array schreiben ohne Schleife
26.04.2016 17:14:23
Rudi
Hallo,
Sub aaa()
Dim test(1 To 3)
test(1) = [Range1]
test(2) = [Range2]
test(3) = [Range3]
End Sub
Allerdings enthalten die 3 Elemente dann wiederum Arrays (Test(1)(1 to 4, 1 to 1))
Gruß
Rudi

AW: in Array schreiben ohne Schleife
26.04.2016 17:57:12
Frank
Schonmal danke, Rudi.
Vom "Aufbau" her sollte das Array am End so sein, als würde ich einen zusammenhängenden Bereich mit drei Spalten und vier Zeilen direkt zuweisen:
test = Range("A1:C4")

Anzeige
AW: in Array schreiben ohne Schleife
26.04.2016 17:30:26
Daniel
Hi
es kommt darauf an, wie du mit dem Array Test weiter arbeiten willst.
die einfachste Möglichkeit Schleifen zu vermeiden wäre, dass du das Array Test als eindimensionales Array auslegst und dann jedem Index statt eines einfachen Wertes ein weiteres Array (mit den Werten aus den Ranges zuweist:
dim Test(1 to 3)
Test(1) = Range1.Value
Test(2) = Range2.Value
Test(3) = Range3.Value
wenn du dann einen Wert abfragen willst, dann so:
Debug.Print Test(1)(3, 1)

sieht etwas komisch aus, liegt aber daran, dass jeder wert des Arrays Test wiederum ein zweidimensionales Array mit einer Spalte und 4 Zeilen ist.
wenn du Test als echtes 2-D-Array haben willst, dann so:
Dim test
Redim test(1 to 3)
test(1) = Worksheetfunction.Transpose(Range1.value)
test(2) = Worksheetfunction.Transpose(Range2.value)
test(3) = Worksheetfunction.Transpose(Range3.value)
test = Worksheetfunction.Transpose(test)
debug.print test(1, 3)
beim Transponieren der Ranges entsteht ein eindimensionales Array, da die Range aus einer Spalte besteht)
dann hängst du diese eindimenionalesn Arrays wiederum als Werte in das eindimensionale Array test ein.
beim Transponieren des Gesamtarrays macht VBA dann aus diesem 1+1-Dimensionalen Array ein echtes zweidimensionales Array, das funktioniert aber nur, wenn die Ranges alle gleich gross sind.
Gruß Daniel

Anzeige
AW: in Array schreiben ohne Schleife
26.04.2016 18:00:10
Frank
Hallo Daniel, das klingt vielversprechend. Werde es morgen gleich austesten. Hab leider kein Excel daheim, nur auf Arbeit.
Vom Aufbau her sollte das am Ende ein Array sein wie, wenn ich einen zusammenhängenden Bereich direkt einer Variablen zuordne:
test = Range("A1:C4")....
Klingt so, als würde die Variante mit Transpose exakt das liefern...
Danke,
Frank

Anzeige
AW: in Array schreiben ohne Schleife
27.04.2016 07:27:26
Frank
Hi Daniel,
es funktioniert! Bin begesitert!
Vielen Dank,
Frank

Eine Frage noch...
27.04.2016 07:35:48
Frank
Warum mußt Du bei der 2-D-Variante Redim statt Dim benutzen?

AW: Eine Frage noch...
27.04.2016 08:58:40
Daniel
wenn ich bei einem Array die Anzahl der Dimensionen und deren Größe schon bei DIM festlege, sind diese dauerhaft so festgeschrieben und können im Makro dann nicht mehr verändert werden.
diese Veränderung ist hier aber notwendig, da das Array Test zu beginn ein eindimensionales Array mit 3 Elementen ist, welches dann zu einem zweidimensionalen Array mit 12 Elementen in 4 Zeilen und 3 Spalten gewandelt wird.
also legt man das Array bei Dim zunächst mal als Variant an und redimt dann auf die benötigte Grösse.
Gruß Daniel

Anzeige
AW: Eine Frage noch...
27.04.2016 11:38:45
Frank
alles klar. nochmals herzlichen dank für die hilfe.
;
Anzeige

Infobox / Tutorial

Daten in ein Array ohne Schleife übertragen


Schritt-für-Schritt-Anleitung

Um Daten aus nicht zusammenhängenden Bereichen in ein Array zu übertragen, ohne eine Schleife zu verwenden, kannst du die folgenden Schritte befolgen:

  1. Öffne den VBA-Editor: Drücke Alt + F11 in Excel, um den VBA-Editor zu öffnen.

  2. Erstelle ein neues Modul: Klicke mit der rechten Maustaste auf "VBAProject" und wähle "Einfügen" > "Modul".

  3. Deklariere das Array: Schreibe den folgenden Code, um das Array zu deklarieren:

    Dim test() As Variant
    ReDim test(1 To 3, 1 To 4)
  4. Übertrage die Daten mit der Transpose-Funktion: Verwende die Transpose-Funktion, um die Daten ohne Schleifen zu übertragen:

    test(1, 1) = Application.WorksheetFunction.Transpose(Range("RANGE1"))
    test(2, 1) = Application.WorksheetFunction.Transpose(Range("RANGE2"))
    test(3, 1) = Application.WorksheetFunction.Transpose(Range("RANGE3"))
  5. Schließe den VBA-Code: Füge alle benötigten End-Anweisungen hinzu und teste das Skript.


Häufige Fehler und Lösungen

  • Fehler beim Übertragen: Wenn du eine Fehlermeldung erhältst, stelle sicher, dass alle benannten Bereiche existieren und die gleichen Dimensionen haben.

  • Array-Dimensionen: Wenn du das Array zu Beginn mit Dim deklariert hast, kannst du die Dimensionen später nicht mehr ändern. Verwende stattdessen ReDim, um die Größe dynamisch anzupassen.


Alternative Methoden

Falls du eine andere Methode bevorzugst, kannst du auch ein eindimensionales Array verwenden und die Werte der Ranges direkt zuweisen:

Dim Test(1 To 3) As Variant
Test(1) = Range("RANGE1").Value
Test(2) = Range("RANGE2").Value
Test(3) = Range("RANGE3").Value

Hierbei erhältst du ein Array, das in jedem Element ein weiteres eindimensionales Array speichert.


Praktische Beispiele

Hier ist ein Beispiel für die Verwendung von Transpose, um die Werte in ein 2D-Array zu übertragen:

Dim test As Variant
ReDim test(1 To 3, 1 To 4)
test(1, 1) = Application.WorksheetFunction.Transpose(Range("A1:A4"))
test(2, 1) = Application.WorksheetFunction.Transpose(Range("B1:B4"))
test(3, 1) = Application.WorksheetFunction.Transpose(Range("C1:C4"))

Dieses Beispiel zeigt, wie du die Werte aus den Zellen A1 bis A4, B1 bis B4 und C1 bis C4 in ein Array überträgst.


Tipps für Profis

  • Verwende Option Explicit: Es ist eine gute Praxis, Option Explicit am Anfang jedes Moduls zu verwenden, um sicherzustellen, dass alle Variablen deklariert sind.

  • Debuggen: Nutze Debug.Print, um den Inhalt des Arrays während der Ausführung zu überprüfen und sicherzustellen, dass die Daten korrekt übertragen wurden.

  • Datenvalidierung: Stelle sicher, dass die Dimensionen der Ranges identisch sind, um Laufzeitfehler zu vermeiden.


FAQ: Häufige Fragen

1. Warum muss ich ReDim verwenden?
Wenn du die Größe eines Arrays im Code ändern möchtest, musst du ReDim verwenden, da die Größe von Arrays, die mit Dim deklariert wurden, festgelegt ist.

2. Wie kann ich sicherstellen, dass die Ranges die gleiche Größe haben?
Überprüfe die Dimensionen der Ranges vor der Zuweisung, indem du die Rows.Count und Columns.Count Eigenschaften verwendest. Dies hilft dir, Fehler 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