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

Worksheetfunction.TRANSPOSE

Forumthread: AW: Worksheetfunction.TRANSPOSE

AW: Worksheetfunction.TRANSPOSE
03.09.2005 23:34:13
Nepumuk
Hallo Rolf,
5.461 Elemente sind maximal drin.
Gru?
Nepumuk
Excel & VBA ? Beispiele
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Worksheetfunction.TRANSPOSE
03.09.2005 23:43:05
Rolf
Hallo Nepumuk,
so weit, so schlecht -
aber jetzt weiss ich's wenigstens.
Danke f?r deine Antwort,
auf die ich jetzt 'ne Friedenspfeife rauche.
LG
Rolf
AW: Worksheetfunction.TRANSPOSE
03.09.2005 23:41:42
IngGi
Hallo Rolf,
ein Datenfeld l??t sich auch so transponieren:

ReDim AUSG(UBound(EING, 2), UBound(EING, 1))
For ze = 1 To UBound(AUSG, 1)
For sp = 1 To UBound(AUSG, 2)
AUSG(ze, sp) = EING(sp, ze)
Next 'sp
Next 'ze
Gru? Ingolf
Anzeige
AW: Worksheetfunction.TRANSPOSE
03.09.2005 23:51:50
Rolf
Hallo Ingolf,
ist ja keine 1:1 Umsetzung,
sondern das Eingangsarray wird modifiziert
und die Ausdehnung erst im Rahmen der Modifikation,
deshalb Redim Preserve, erkannt.
Dank dir trotzdem zu n?chtlicher Stunde
Rolf
AW: Worksheetfunction.TRANSPOSE
04.09.2005 00:20:33
IngGi
Hallo Rolf,
die Modifikation findet doch aber schon vorher, beim Auslesen von arr() nach B() statt. Und am Schluss wird B() dann nach ShortArray() ?berschrieben und dabei transponiert. Dieser letzte Schritt, der in deinem Code per Worksheet-Function passiert, ist dann ja schon eine 1:1-Umsetzung. Mein Code war nat?rlich nur als Ersatz f?r diese letzte Programmzeile, und auch nur als noch anzupassendes Beispiel, gedacht.
K?nnte folgendes nicht funktionieren? Habe ich vielleicht etwas falsch verstanden?

Function ShortArray(ByVal arr As Variant) As Variant
Dim B()
Dim AUSG()
Dim ze As Long, sp As Long
Dim i As Long, k As Long
For i = 1 To UBound(arr)
If arr(i, 3) = "x" Then
k = k + 1
ReDim Preserve B(3, k)
B(1, k) = arr(i, 1)
B(2, k) = arr(i, 2)
B(3, k) = ""
End If
Next
ReDim AUSG(UBound(B, 2), UBound(B, 1))
For ze = 1 To UBound(AUSG, 1)
For sp = 1 To UBound(AUSG, 2)
AUSG(ze, sp) = B(sp, ze)
Next 'sp
Next 'ze
ShortArray = AUSG()
End Function
Noch eine Anmerkung, die ich bei meiner vorigen Antwort ?bersehen habe: Die Dimensionierung von AUSG() mit UBound() setzt voraus, dass Option Base 1 gesetzt, bzw. LBound immer =1 ist. Sonst musst du das eventuell noch anpassen.
Gru? Ingolf
Anzeige
AW: Worksheetfunction.TRANSPOSE
04.09.2005 08:37:45
Rolf
Guten Morgen Ingolf,
vielen Dank, klappt, wie's soll -
das Unverst?ndnis lag ganz bei mir.
F?r ca. 20.000 S?tze braucht's bei mir 30 Sec.
Herzliche Gr??e
Rolf (jetzt f?r 1 Woche weg)
Nachtrag zum Thema LIKE/INSTR/Regular Expressions:
den besten Durchsatz habe ich mit letzteren erzielt
Anzeige
AW: Worksheetfunction.TRANSPOSE
03.09.2005 23:34:13
Nepumuk
Hallo Rolf,
5.461 Elemente sind maximal drin.
Gru?
Nepumuk
Excel & VBA ? Beispiele
AW: Worksheetfunction.TRANSPOSE
03.09.2005 23:43:05
Rolf
Hallo Nepumuk,
so weit, so schlecht -
aber jetzt weiss ich's wenigstens.
Danke f?r deine Antwort,
auf die ich jetzt 'ne Friedenspfeife rauche.
LG
Rolf
Anzeige
AW: Worksheetfunction.TRANSPOSE
03.09.2005 23:41:42
IngGi
Hallo Rolf,
ein Datenfeld l??t sich auch so transponieren:

ReDim AUSG(UBound(EING, 2), UBound(EING, 1))
For ze = 1 To UBound(AUSG, 1)
For sp = 1 To UBound(AUSG, 2)
AUSG(ze, sp) = EING(sp, ze)
Next 'sp
Next 'ze
Gru? Ingolf
AW: Worksheetfunction.TRANSPOSE
03.09.2005 23:51:50
Rolf
Hallo Ingolf,
ist ja keine 1:1 Umsetzung,
sondern das Eingangsarray wird modifiziert
und die Ausdehnung erst im Rahmen der Modifikation,
deshalb Redim Preserve, erkannt.
Dank dir trotzdem zu n?chtlicher Stunde
Rolf
Anzeige
AW: Worksheetfunction.TRANSPOSE
04.09.2005 00:20:33
IngGi
Hallo Rolf,
die Modifikation findet doch aber schon vorher, beim Auslesen von arr() nach B() statt. Und am Schluss wird B() dann nach ShortArray() ?berschrieben und dabei transponiert. Dieser letzte Schritt, der in deinem Code per Worksheet-Function passiert, ist dann ja schon eine 1:1-Umsetzung. Mein Code war nat?rlich nur als Ersatz f?r diese letzte Programmzeile, und auch nur als noch anzupassendes Beispiel, gedacht.
K?nnte folgendes nicht funktionieren? Habe ich vielleicht etwas falsch verstanden?

Function ShortArray(ByVal arr As Variant) As Variant
Dim B()
Dim AUSG()
Dim ze As Long, sp As Long
Dim i As Long, k As Long
For i = 1 To UBound(arr)
If arr(i, 3) = "x" Then
k = k + 1
ReDim Preserve B(3, k)
B(1, k) = arr(i, 1)
B(2, k) = arr(i, 2)
B(3, k) = ""
End If
Next
ReDim AUSG(UBound(B, 2), UBound(B, 1))
For ze = 1 To UBound(AUSG, 1)
For sp = 1 To UBound(AUSG, 2)
AUSG(ze, sp) = B(sp, ze)
Next 'sp
Next 'ze
ShortArray = AUSG()
End Function
Noch eine Anmerkung, die ich bei meiner vorigen Antwort ?bersehen habe: Die Dimensionierung von AUSG() mit UBound() setzt voraus, dass Option Base 1 gesetzt, bzw. LBound immer =1 ist. Sonst musst du das eventuell noch anpassen.
Gru? Ingolf
Anzeige
AW: Worksheetfunction.TRANSPOSE
04.09.2005 08:37:45
Rolf
Guten Morgen Ingolf,
vielen Dank, klappt, wie's soll -
das Unverst?ndnis lag ganz bei mir.
F?r ca. 20.000 S?tze braucht's bei mir 30 Sec.
Herzliche Gr??e
Rolf (jetzt f?r 1 Woche weg)
Nachtrag zum Thema LIKE/INSTR/Regular Expressions:
den besten Durchsatz habe ich mit letzteren erzielt
Anzeige
;
Anzeige

Infobox / Tutorial

Worksheetfunction.TRANSPOSE in Excel VBA nutzen


Schritt-für-Schritt-Anleitung

Um die worksheetfunction.transpose in Excel VBA zu verwenden, folge diesen Schritten:

  1. Öffne Excel und gehe auf die Registerkarte „Entwicklertools“.

  2. Klicke auf „Visual Basic“, um den VBA-Editor zu öffnen.

  3. Füge ein neues Modul hinzu, indem Du im Menü „Einfügen“ auf „Modul“ klickst.

  4. Schreibe den folgenden Code, um ein Array zu transponieren:

    Sub TransposeExample()
        Dim originalArray As Variant
        Dim transposedArray As Variant
    
        ' Beispielarray
        originalArray = Range("A1:C3").Value
    
        ' Transponiere das Array
        transposedArray = Application.WorksheetFunction.Transpose(originalArray)
    
        ' Gebe das transponierte Array in einen anderen Bereich aus
        Range("E1").Resize(UBound(transposedArray, 1), UBound(transposedArray, 2)).Value = transposedArray
    End Sub
  5. Führe das Makro aus, um das Original-Array zu transponieren und das Ergebnis in einen neuen Bereich zu schreiben.


Häufige Fehler und Lösungen

  • Fehler: „Laufzeitfehler 1004: Methode 'Transpose' des Objekts 'WorksheetFunction' ist fehlgeschlagen“
    Lösung: Dieser Fehler tritt auf, wenn die Anzahl der Elemente im Array die maximale Größe von 65.536 Zeilen oder 256 Spalten überschreitet. Stelle sicher, dass dein Array diese Grenzen nicht überschreitet.

  • Fehler: „Typen unverträglich“
    Lösung: Achte darauf, dass das Array, das Du transponierst, korrekt dimensioniert ist. Verwende Dim und ReDim entsprechend, um sicherzustellen, dass die Dimensionen stimmen.


Alternative Methoden

Es gibt auch andere Möglichkeiten, Daten in VBA zu transponieren:

  1. Manuelle Transposition mit Schleifen:

    Function ManualTranspose(ByVal arr As Variant) As Variant
        Dim transposedArray() As Variant
        Dim i As Long, j As Long
    
        ReDim transposedArray(1 To UBound(arr, 2), 1 To UBound(arr, 1))
    
        For i = LBound(arr, 1) To UBound(arr, 1)
            For j = LBound(arr, 2) To UBound(arr, 2)
                transposedArray(j, i) = arr(i, j)
            Next j
        Next i
    
        ManualTranspose = transposedArray
    End Function
  2. Verwendung von vba.application.transpose:
    Du kannst auch Application.Transpose verwenden, um ein Array ohne die WorksheetFunction-Klasse zu transponieren.


Praktische Beispiele

Hier sind einige praktische Beispiele zur Verwendung von worksheetfunction.transpose:

  1. Transponieren eines Bereichs: Wenn Du einen Bereich von Zellen in Excel hast, z.B. A1:C3, kannst Du diesen wie folgt transponieren:

    Sub TransposeRange()
        Dim rng As Range
        Set rng = Range("A1:C3")
        Range("E1").Resize(rng.Columns.Count, rng.Rows.Count).Value = Application.WorksheetFunction.Transpose(rng.Value)
    End Sub
  2. Transponieren eines Arrays in VBA: Du kannst ein Array definieren und es transponieren, wie oben beschrieben. Hier ein Beispiel:

    Sub ArrayTranspose()
        Dim myArray As Variant
        Dim transposed As Variant
    
        myArray = Array(Array(1, 2, 3), Array(4, 5, 6))
        transposed = Application.WorksheetFunction.Transpose(myArray)
    
        ' Ausgabe in die Konsole
        Debug.Print transposed(1, 1) ' Gibt 1 aus
        Debug.Print transposed(2, 1) ' Gibt 4 aus
    End Sub

Tipps für Profis

  • Performance-Optimierung: Wenn Du mit großen Datenmengen arbeitest, solltest Du die Verwendung von Application.ScreenUpdating und Application.Calculation optimieren, um die Ausführung zu beschleunigen.

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    ' Dein Code hier
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
  • Verwendung von Redim Preserve: Achte darauf, dass Du beim Anpassen der Größe von Arrays in VBA ReDim Preserve verwendest, um die bestehenden Daten zu erhalten.


FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen Application.Transpose und WorksheetFunction.Transpose?
Application.Transpose ist eine alternative Methode, die in vielen Fällen schneller sein kann und keine Fehler bei großen Datenmengen auslöst.

2. Wie viele Elemente kann ich mit worksheetfunction.transpose transponieren?
Die maximale Anzahl der Elemente liegt bei 65.536 Zeilen oder 256 Spalten. Achte darauf, diese Grenzen nicht zu überschreiten, um Fehler zu vermeiden.

3. Kann ich Transpose auch in einer Formel in Excel verwenden?
Ja, Du kannst =TRANSPOSE(A1:C3) direkt in einer Excel-Zelle verwenden, um einen Bereich zu transponieren.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige