Clever-Excel-Forum

Normale Version: Array transponieren
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo wertes Forum,

ich habe gerade ein Problem mit einem Array, das unter bestimmten Umständen einen Fehler verursacht.

Die Ausgangslage ist, dass ich aus einer mehrspaltigen MultiSelect-Listbox die Ergebnisse in ein Array einlese. Dazu dimensioniere ich das Array mit der Anzahl an Zeilen in der Listbox, anschließend lese ich jede Zeile spaltenweise ins Array. Abschließend redimensioniere ich das Array auf die wirklich benötigte Menge an Daten und transponiere das Array, damit ich damit besser arbeiten kann.

Das funktioniert bestens, außer es wurde nur ein Eintrag in der Listbox ausgewählt, dann erhalte ich folgende Fehlermeldung in der folgenden Zeile:
Laufzeitfehler 9: Index außerhalb des gültigen Bereichs
Code:
'**** Jetzt folgt der Fehler ****
Debug.Print UBound(arrTest1, 1), UBound(arrTest1, 2)
Range(Cells(20, 1), Cells(20 + UBound(arrTest1, 1) - 1, UBound(arrTest1, 2))) = arrTest1
Aus mir unbekannten Gründen geht beim Transponieren die zweite Dimension verloren.
UBound(arrTest1, 1) ist wie erwartet 8, UBound(arrTest1, 2) erzeugt den Fehler.

Wie löse ich das Problem? Das Makro soll ja für unterschiedliche Anzahl an Einträgen funktionieren.
[attachment=47493]
Ich habe eine Beipieldatei angefügt, die das Problem darstellt. Setzt man zu Beginn der Schleife den To-Wert auf 3, funktioniert's perfekt und das Array wird zweimal in verschiedenen Ausrichtungen ausgegeben. Setzt man den To-Wert auf 1 (From und To auf 2 etc.), läuft es in den Fehler.
Es handelt sich um eine Beispieldatei, daher keine Listbox etc.

Vielen Dank für Eure Hilfe,
Lutz
Hi

arrTest1 = WorksheetFunction.Transpose(arrTest1)
Macht Dir bei 1 aus deinem arrTest1(8, 3) ja arrTest1(8)
Somit gibt es keine zweite Dimension und die Abfrage danach bringt halt einen Fehler.
Was ist das Problem ???

1. verzichte auf Option Base 1
2. Verwende Excel und VBA

Code:
Sub M_snb()
  sn = Cells(1).CurrentRegion
  sp = Application.Transpose(sn)
  Cells(8, 1).Resize(UBound(sp), UBound(sp, 2)) = sp
End Sub

schau mal

https://www.snb-vba.eu/VBA_Arrays_en.html
Hallo,

vielen Dank für Eure Antworten.

@Elex, ok, aber wie arbeite ich damit weiter? Ich greife im weiteren Verlauf mehrfach auf das Array zu. Muss ich dann jedesmal unterscheiden, ob ich in meiner Listbox ein oder zwei Einträge selektiert habe?

@snb
Was bringt mir der Verzicht auf Option Base 1? Habe mein Makro entsprechend umgestrickt, aber keine Verbesserung. Der Fehler kommt immer noch.
Was meinst Du mit "Verwende Excel und VBA"?
Dein Code funktioniert, aber wie bekomme ich die Daten aus meiner erwähnten Listbox in das Array sn? Wie beschrieben ist meine Datei ein Beispiel um den auftretenden Fehler darzustellen.
Deine Homepage ist beeindruckend und hat mir schon oft weitergeholfen, aber wo im ausführlichen Thema Arrays finde ich den Punkt, der mir weiterhilft?

Gruß,
Lutz
Einfach selbst transponieren! Damit rennst du vor allem nicht in die Limitationsprobleme der eingebauten Transpose-Methode bei großen Arrays. 
Code:
Sub Test_Array2()
Dim fVar As Variant

fVar = Range("A1").CurrentRegion.Value
Range("A7").Resize(UBound(fVar, 1) - LBound(fVar, 1) + 1, UBound(fVar, 2) - LBound(fVar, 2) + 1).Value = fVar

fVar = funcTranspose(fVar)
Range("A15").Resize(UBound(fVar, 1) - LBound(fVar, 1) + 1, UBound(fVar, 2) - LBound(fVar, 2) + 1).Value = fVar

End Sub

Function funcTranspose(fVar As Variant) As Variant
'Transponiert ZWEIdimensionale Arrays ohne Verlust an Detailinformationen
Dim fTemp As Variant
Dim i As Long, j As Long
ReDim fTemp(LBound(fVar, 2) To UBound(fVar, 2), LBound(fVar, 1) To UBound(fVar, 1))
For i = LBound(fVar, 2) To UBound(fVar, 2)
   For j = LBound(fVar, 1) To UBound(fVar, 1)
      fTemp(i, j) = IIf(IsNull(fVar(j, i)), Empty, fVar(j, i))
   Next j
Next i
funcTranspose = fTemp
End Function
Code:
Dein Code funktioniert, aber wie bekomme ich die Daten aus meiner erwähnten Listbox in das Array sn? Wie beschrieben ist meine Datei ein Beispiel um den auftretenden Fehler darzustellen.

Deine Datei enthält kein Listbox.
Warum ein falsches Beispiel ?

Ein Listbox transponieren macht man so:

Code:
Sub M_snb()
   With Listbox1
      .column=.list
   end with
End Sub
Hallo EarlFred,

super, ist genau das, was ich brauche. Funktioniert einwandfrei.
Die Arrays sind zwar nicht riesig, aber bei dem kleinen 1-zeiligen funktioniert's auch perfekt.

Vielen Dank,
Lutz