Autor: Max Kaffl (Nepumuk) --- Aus Excel VBA - Gruppe:
VerschiedenesMtrans /Transponieren - Spezial
Autor: Max Kaffl (Nepumuk) - Erstellt: -- - Letzte Revision: --
Transponieren spezial
Mit folgender kleinen Routine lässt sich nicht nur die Tabellenfunktion MTRANS ausführen sondern auch spiegeln sowie spiegeln und transponieren. Es funktioniert nicht nur in einen anderen Bereich, sondern auch in den Ursprungsbereich. Formate gehen dabei aber verloren. Der Versuch, dass ganze in einer geschützten Tabelle auszuführen, erzeugt eine Fehlermeldung.
Beispiel:
|
ursprüngliche Ansicht |
| A | B | C | D | E | F | G | H | I | J | 1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 2 | a | b | c | d | e | f | g | h | i | j | 3 | eins | zwei | drei | vier | fünf | sechs | sieben | acht | neun | zehn | |
|
|
einfaches transponieren |
| A | B | C | 1 | 1 | a | eins | 2 | 2 | b | zwei | 3 | 3 | c | drei | 4 | 4 | d | vier | 5 | 5 | e | fünf | 6 | 6 | f | sechs | 7 | 7 | g | sieben | 8 | 8 | h | acht | 9 | 9 | i | neun | 10 | 10 | j | zehn | |
|
|
spiegeln |
| A | B | C | D | E | F | G | H | I | J | 1 | zehn | neun | acht | sieben | sechs | fünf | vier | drei | zwei | eins | 2 | j | i | h | g | f | e | d | c | b | a | 3 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | |
|
|
spiegeln und transponieren |
| A | B | C | 1 | zehn | j | 10 | 2 | neun | i | 9 | 3 | acht | h | 8 | 4 | sieben | g | 7 | 5 | sechs | f | 6 | 6 | fünf | e | 5 | 7 | vier | d | 4 | 8 | drei | c | 3 | 9 | zwei | b | 2 | 10 | eins | a | 1 | |
|
Option Explicit
Public Sub Transpose_Test()
Dim varArt As Variant
Dim rngInputrange As Range, rngOutputrange As Range
On Error Resume Next
Set rngInputrange = Application.InputBox( _
Prompt:="Eingabebereich mit der Maus markieren.", _
Title:="Auswahl", Type:=8)
If Err.Number <> 0 Then Exit Sub
Set rngOutputrange = Application.InputBox( _
Prompt:="Oberste linke Zelle des Ausgabebereiches mit der Maus markieren.", _
Title:="Auswahl", Type:=8)
If Err.Number <> 0 Then Exit Sub
On Error GoTo Err_Exit
Do
varArt = Application.InputBox(Prompt:="Art auswählen" & vbLf & vbLf & _
"0 = Normales transponieren" & vbLf & _
"1 = Zeilen und Spalten spiegeln" & vbLf & _
"2 = Zeilen und Spalten spiegeln und transponieren", _
Title:="Auswahl", Default:=0, Type:=1)
If VarType(varArt) = vbBoolean And varArt = False Then Exit Sub
If Fix(varArt) = varArt Then If varArt >= 0 And varArt <= 3 Then Exit Do
MsgBox Prompt:="Nur die Zahlen 0 / 1 / 2 zulässig.", _
Buttons:=vbExclamation, Title:="Hinweis"
Loop
Call Transpose_special(rngInputrange, rngOutputrange, CByte(varArt))
Err_Exit:
End Sub
Private Sub Transpose_special(ByVal rngInputrange As Range, _
ByVal rngOutputrange As Range, _
ByVal bytArt As Byte)
Dim varArray() As Variant, lngRow As Long, intColumn As Integer
On Error GoTo Err_Exit
Select Case bytArt
Case 0
If rngOutputrange.Column + rngInputrange.Rows.Count - 1 <= 256 Then
varArray = Application.WorksheetFunction.Transpose(rngInputrange)
rngInputrange.Clear
Range(rngOutputrange.Cells(1, 1), Cells(rngOutputrange.Row + _
rngInputrange.Columns.Count - 1, rngOutputrange.Column + _
rngInputrange.Rows.Count - 1)) = varArray
Else
Err.Raise Number:=vbObjectError + 1, Description:="Das passt nicht rein."
End If
Case 1
If rngOutputrange.Row + rngInputrange.Rows.Count - 1 <= 256 Then
ReDim varArray(1 To rngInputrange.Rows.Count, _
1 To rngInputrange.Columns.Count)
For intColumn = 1 To rngInputrange.Columns.Count
For lngRow = 1 To rngInputrange.Rows.Count
varArray(lngRow, intColumn) = rngInputrange.Cells( _
rngInputrange.Rows.Count - lngRow + 1, _
rngInputrange.Columns.Count - intColumn + 1)
Next
Next
rngInputrange.Clear
Range(rngOutputrange.Cells(1, 1), Cells(rngOutputrange.Row + _
rngInputrange.Rows.Count - 1, rngOutputrange.Column + _
rngInputrange.Columns.Count - 1)) = varArray
Else
Err.Raise Number:=vbObjectError + 2, Description:="Das passt nicht rein."
End If
Case 2
If rngOutputrange.Column + rngInputrange.Rows.Count - 1 <= 256 Then
ReDim varArray(1 To rngInputrange.Columns.Count, _
1 To rngInputrange.Rows.Count)
For intColumn = 1 To rngInputrange.Columns.Count
For lngRow = 1 To rngInputrange.Rows.Count
varArray(intColumn, lngRow) = _
rngInputrange.Cells(rngInputrange.Rows.Count - _
lngRow + 1, rngInputrange.Columns.Count - intColumn + 1)
Next
Next
rngInputrange.Clear
Range(rngOutputrange.Cells(1, 1), Cells(rngOutputrange.Row + _
rngInputrange.Columns.Count - 1, rngOutputrange.Column + _
rngInputrange.Rows.Count - 1)) = varArray
Else
Err.Raise Number:=vbObjectError + 3, Description:="Das passt nicht rein."
End If
End Select
Exit Sub
Err_Exit:
MsgBox "Fehler " & CStr(Err.Number) & vbLf & vbLf & _
Err.Description, 16, "Fehler"
End Sub
Weitere Artikel der Gruppe: Verschiedenes Aus Excel VBA
Nach oben