Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Array transponieren
#1
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.

.xlsm   Beispiel Arrray.xlsm (Größe: 14,48 KB / Downloads: 5)
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
Antworten Top
#2
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.
Antworten Top
#3
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
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#4
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
Antworten Top
#5
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
Hat Dir mein Beitrag geholfen? Dann hilf auch Du - mit einer Spende an Wikipediadie Tafeln oder aktion-deutschland-hilft.de
[-] Folgende(r) 1 Nutzer sagt Danke an EarlFred für diesen Beitrag:
  • Lutz Fricke
Antworten Top
#6
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
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#7
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
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste