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

Forumthread: Ganze zeile im zweidimensionalen array auslesen,

Ganze zeile im zweidimensionalen array auslesen,
28.10.2007 22:22:32
Boris
Guten Abend Excel-Freunde!
Hab' folgende Frage. Wie lese ich aus einem zweidimensionalen Array nur eine Zeile aus, ohne for...next-Schleife zu benutzen?
Beispiel: Ein ganzes zweidimensionales Array YXZ() lese ich in die Tabelle mit folgendem Code aus:
Range(Cells(1, 1), Cells(UBound(XYZ(), 1), UBound(XYZ(), 2)))=XYZ.
Das funktioniert soweit prima. Nun würde ich gern in ein Zellenbereich eine x-beliebige Zeile (z.B. Zeile Nr. 2: Die Werte XYZ(2, 1), XYZ (2, 2) ... XYZ(2, UBound(XYZ, 2)) ) aus XYZ auslesen. Ich bräuchte ein Code, das mir etwas in der Art ermöglicht:
Range(Cells(1, 1), Cells(UBound(XYZ(), 1), UBound(XYZ(), 2)))= XYZ(2) (oder XYZ.Item(2))?
Für einen Lösungsvorschlag wäre ich Euch sehr dankbar!
Gruss Boris L.

Anzeige

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

Betreff
Datum
Anwender
Anzeige
Korrektur...
28.10.2007 22:25:00
Boris
Verzeihung, ich meinte folgendes:
Range(Cells(1, 1), Cells(1, UBound(XYZ(), 2)))= XYZ(2) (oder XYZ.Item(2))?
Gruss Boris L.

AW: Korrektur...
28.10.2007 23:43:52
Original
Hi,
Bahnhof, Tipp, beschreib das Ziel, nicht den Weg.
mfg Kurt

AW: Korrektur...
29.10.2007 00:10:00
Boris
Hi,
danke für den Tip! Das Ziel ist, die Werte einer Zeile aus dem zweidimensionalen Array in ein Zellenbereich innerhalb einer Tabellenzeile ohne for...next-Schleife zu übertragen.
Ich kann den ganzen zweidimensionalen Array in eine Tabelle ohne for..next übertragen. Mich interessiert, ob dies auch nur mit einer Zeile aus diesem Array machbar ist.
Gruss Boris L.

Anzeige
AW: Korrektur...
29.10.2007 00:40:00
Original
Hi,
das geht schon, aber nur mit der Array-Funktion, die den Datentyp Variant voraussetzt.
Welchen Gewinn erhoffst du?
mfg Kurt

AW: Korrektur...
29.10.2007 11:10:57
Boris
Hallo Kurt,
vielen Dank für Deine Zeit und Deine Aufmerksamkeit!
Mir geht es um die Schnelligkeit der Macroausführung. Ich möchte 1 Array mit ca 3.000 datensätzen mit weiteren 4 Arrays vergleichen. Jedes der weiteren 4 Arrays enthält 30.000 Datensätze. Wenn die Übereinstimmung gefunden ist, möchte ich, dass die zutreffende Zeile aus dem jeweiligen „großen“ Array in die Tabelle im Excel-Sheet übernommen wird. Das Macro habe ich soweit erstellt, und es funktioniert. Ich möchte nur die for..next-Schleife umgehen: Die Datensätze aus dem Array sollen so wie sie sind, z.B. Zeile Nr. 2:
arr(2, 1), arr(2, 2) ... arr(2, Ubound(arr(), 2))
in den Zellenbereich der Excel-Tabelle
Cells(1, 1), Cells(1, 2) … Cells(1, Ubound(arr(), 2))
übernommen werden.
Den kompletten Array kann ich wunderbar übernehmen. Das mache ich in diesem Fall so:
Range(„A1:A“& Ubound(arr(), 2)) = arr
Wie kann ich auf ähnliche Weise nur eine Zeile aus dem Array arr() in die Tabelle übernehmen?
Gruss
Boris L.

Anzeige
AW: Korrektur...
29.10.2007 00:51:00
Gerd
Hallo Boris,
es kommt darauf an, ob dein Array einen Range als Quelle hat.

Sub test()
Dim vnt1, vnt2, i
vnt1 = Range("A1:C4").Value
ReDim vnt2(1 To UBound(vnt1, 2))
For i = 1 To UBound(vnt1, 2)
vnt2(i) = vnt1(2, i)
Next
Range(Cells(8, 1), Cells(8, UBound(vnt2))) = vnt2
Dim arr As Variant
arr = Array(vnt1(2, 1), vnt1(2, 2), vnt1(2, 3))
Range(Cells(10, 1), Cells(10, UBound(arr) + 1)).Value = arr
Dim Bereich As Range
Set Bereich = Range("A1:C4")
Range(Cells(12, 1), Cells(12, Bereich.Columns.Count)).Value = _
Range(Bereich(2, 1), Bereich(2, Bereich.Columns.Count)).Value
Range(Cells(14, 1), Cells(14, Bereich.Columns.Count)).Value = Bereich.Rows(2).Value
End Sub


Gruß Gerd

Anzeige
AW: Korrektur...
29.10.2007 11:12:13
Boris
Hallo Gerd,
ersmal vielen Dank für Deine Mühe und Deine Beispiele!
Genau das ist der Punkt, daß mein Array nicht direkt dem Range sondern einer Collection entstammt. Die zutreffenden Items dieser Collection habe ich mit der Split-Methode geteilt und mit for..next in die jeweiligen Zeilen meines Arrays übernommen. Das Array ist so aufgebaut:
Redim Preserve arr(1 to 2000, 1 to 15)
Zu Deinen Beispielen.
Beispiel 1.
Du bildest aus der Zeile 2 des Arrays vnt1 einen neuen Array vnt2 anhand einer for...next-Schleife. Dann fügst Du vnt2 in ein Range komplett ein. Das ist eine gute Idee und die funzt schnell. Jedoch die for...next-Schleife, um den „Zeilen-Array“ vnt2 aufzubauen, ist immer noch im Spiel. Ist es denn nicht möglich, die Zeile 2 im Array vnt1 komplett anzusprechen, ohne dafür das Array vnt2 zu bilden?
Beispiel 2.
Um zum Array „arr“ zu kommen, der so aufgebaut ist, wie in Deinem Beispiel, nähmlich:
arr = Array(vnt1(2, 1), vnt1(2, 2), vnt1(2, 3))
muss ich wieder auf die for…next zurückgreifen:
For i = 1 to Ubound(vnt, 2)
arr = Array(arr & “,” & vnt(2, i))
Next i
oder so ähnlich. Also for...next ist wieder im Spiel.
Bitte versteh mich nicht falsch. Ich bin Dir sehr dankbar für die Beispiele und Deine Mühe! Wenn Ihr sagt, es ist sonst nicht möglich, eine Zeile aus dem zweidimensionalen Array zu nehmen, ohne dafür vorher einen Zwischen-Array bilden, und ihre Datensätze den Datensätzen im Tabellen-Range einer Zeile ohne for...next-Schleife zuzuordnen, dann betrachtet diesen Thread als abgeschlossen, und Deine beiden obigen Beispiele als die bestmögliche Lösung.
Gruss
Boris L.

Anzeige
AW: Korrektur...
29.10.2007 20:53:00
Gerd
Hallo Boris,
da dies hier für mich "just for fun" ist, sollst Du nicht ohne Antwort bleiben.
Ich kenne keine Rows-Eigenschaft echter Datenfelder.
Du könntest eine Beispiel-Collection mit ein paar representativen Items u. Keys zeigen u. den
Weg wie diese bisher in ein Array übergeben werden.
Ggf. sind auch die Möglichkeiten der Split-Funktion noch nicht voll ausgeschöpft.
Gruß Gerd

Anzeige
AW: Korrektur...
30.10.2007 11:13:00
Boris
Hallo Gerd,
Danke für das Info! Ich habe wieder was dazu gelernt, und weiss jetzt, das es mit den einzelnen Zeilen so nicht geht, wie ich es mir vorgestellt habe. Ich habe dein Beispiel Nr. 1 in mein Macro eingebaut, und es funzt einwandfrei. Nochmal herzlichen Dank dafür!
Meine Collection und die ganzen Arrays hier nochmal zu posten ist nicht mehr notwendig. Du hast alle meine Fragen ausfürlich beantwortet und sogar 4 Lösungsvorshläge gemacht. Die Problemstellung dieses Threads ist erfolgreich gelöst. Ich lerne sehr viel durch die Recherchen in diesem Forum und finde es ganz toll, dass die Wissensträger wie Du Euch die Zeit nimmt, und die Fragen beantwortet! Weiter so, und viel Erfolg!
Gruss
Boris L.
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

Ganze Zeile aus einem zweidimensionalen Array in Excel auslesen


Schritt-für-Schritt-Anleitung

Um eine ganze Zeile aus einem zweidimensionalen Array in Excel auszulesen, ohne eine For...Next-Schleife zu verwenden, kannst du die folgenden Schritte befolgen:

  1. Definiere dein Array: Stelle sicher, dass dein Array korrekt definiert ist. Zum Beispiel:

    Dim arr(1 To 2000, 1 To 15) As Variant
  2. Wähle die Zeile aus: Um eine bestimmte Zeile (z.B. Zeile 2) aus deinem Array auszulesen, kannst du den Bereich direkt ansprechen:

    Range(Cells(1, 1), Cells(1, UBound(arr, 2))) = Application.Index(arr, 2, 0)
  3. Übertrage die Werte in das Excel-Sheet: Mit dem obigen Code werden die Werte der zweiten Zeile des Arrays in die erste Zeile des Excel-Arbeitsblatts übertragen.


Häufige Fehler und Lösungen

  • Fehler: "Typen unverträglich"

    • Lösung: Stelle sicher, dass du den richtigen Datentyp für dein Array verwendest. Bei mehrdimensionalen Arrays sollte der Datentyp Variant gewählt werden.
  • Fehler: "Index außerhalb des zulässigen Bereichs"

    • Lösung: Überprüfe, ob der Index, den du verwendest, innerhalb der Grenzen des Arrays liegt.

Alternative Methoden

Falls du eine andere Methode bevorzugst, kannst du die Range-Eigenschaft verwenden, um direkt auf die Zeile zuzugreifen:

Dim Bereich As Range
Set Bereich = Range("A1:C4")
Range(Cells(8, 1), Cells(8, Bereich.Columns.Count)).Value = Bereich.Rows(2).Value

Diese Methode ist besonders nützlich, wenn du mit einem Range arbeitest, der bereits in deinem Arbeitsblatt vorhanden ist.


Praktische Beispiele

Hier sind einige Beispiele, wie du eine Zeile aus einem zweidimensionalen Array in Excel handhaben kannst:

  1. Beispiel mit Index:

    Dim arr As Variant
    arr = Range("A1:C4").Value
    Range(Cells(10, 1), Cells(10, UBound(arr, 2))).Value = Application.Index(arr, 2, 0)
  2. Beispiel mit Split und Application.Transpose: Wenn deine Daten in einer Collection sind, kannst du die Split-Methode verwenden und die Werte transponieren:

    Dim myArray As Variant
    myArray = Split("Wert1,Wert2,Wert3", ",")
    Range(Cells(12, 1), Cells(12, UBound(myArray) + 1)).Value = Application.Transpose(myArray)

Tipps für Profis

  • Nutze die Application.Index-Funktion, um direkt auf die Zeilen eines Arrays zuzugreifen, ohne zusätzliche Arrays zu erstellen.
  • Experimentiere mit der Application.Transpose-Funktion, um Zeilen und Spalten einfach zu vertauschen.
  • Achte darauf, dass große Datenmengen die Performance beeinflussen können. Überlege, ob ein effizienterer Ansatz sinnvoll ist.

FAQ: Häufige Fragen

1. Kann ich nur eine Zeile aus einem Array in Excel übertragen?
Ja, du kannst eine Zeile aus einem zweidimensionalen Array direkt mit der Application.Index-Funktion auslesen und in einen Zellbereich übertragen.

2. Was ist der Vorteil von Arrays in VBA?
Arrays ermöglichen eine schnelle Verarbeitung und Speicherung von Daten, was besonders bei großen Datenmengen die Performance deiner Makros verbessert.

3. Wie gehe ich mit Fehlern um, wenn ich mit Arrays arbeite?
Überprüfe stets die Dimensionen deines Arrays und stelle sicher, dass du innerhalb der zulässigen Indizes arbeitest, um Fehler wie "Index außerhalb des zulässigen Bereichs" zu vermeiden.

4. Gibt es eine Möglichkeit, die For...Next-Schleife zu umgehen?
Ja, durch die Verwendung von Funktionen wie Application.Index und Application.Transpose kannst du die Notwendigkeit für Schleifen in vielen Fällen vermeiden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige