Hallo! Hatte da einige kleine Fehler noch drin. Hier mal die komprimierte Version, die auch richtig ist. Entweder mit einer festen Matrix nutzen (is tauskommentiert) oder mit der aktuellen Selection.
Sub spalten_unter_matrix()
With Selection 'ActiveSheet.Range("A1:C3")
For i = 1 To .Columns.Count
ActiveSheet.Range(Cells(.Row + i * (.Rows.Count), 1), Cells(.Row + (i + 1) * (.Rows.Count) - 1, 1)) = Application.WorksheetFunction.Index(.Value, 0, i)
Next i
End With
End Sub
Hier dann die Version mit etlichen Kommentaren. Bei einem andern Blatt einfach das ActiveSheet durch Workbooks(2) etc. ersetzen. Für Zelle B2 einfach den ersten Cells - Wert auf Cells(2,2) setzen und den zweiten dann auf Cells(2 + (i ) * (.Rows.Count) - 1, 2). Dabei ist die 2 am Ende die Spalte und die 2 am Anfag die Zeile.
Sub spalten_unter_matrix()
'hier die Variante mit flexibler Auswahl, des selektierte Berich wird ausgewertet, Falls es keine matrix ist
'wird nur der erste matrixbereich genommen, im worst Case 1 Zelle,
'bei A1:B2 alles, bei A1 und B2 - nicht als zusammenhängende Range - nur A1, wobei die sollte einen werte haben
'gibt sonst einen Fehler, den ich nicht abfange
' um die etlichen Range Eingaben zu sparen - fehleranfällig nutz ich einmal with und brauch das dann nur einmal ändern
With Selection 'ActiveSheet.Range("A1:C3")
'das wir es Sapltenweise haben wollen, gehen wir auch alle Spalten durch,
For i = 1 To .Columns.Count
'in der Funktion am Ende wird der Bereich als matrix interpretiert, mit dem 0 an zweiter Stelle gebe ich an, dass die Zeilen egal sind und mich
' nur Spalten interessieren. Und das i ist dann die jeweilige Spalte - siehe Anzahl der for Durchläufe
' die funktion gibt also nur eine Spalte der MAtric zurück. Diese wird an eine range der selben Größe übergeben - geht am schnellsten
' Du musst also eine Range haben, die genauso groß wie die Zeilenanzahl der matrix ist. Ist sie größer wird dort bei den Zellen zuviel ein NV eingefügt (Fehler in der Version davor)
' Ist sie kleiner kommt eine Fehlermeldung
' bei der folgenden Erklärung habe ich das selektion (alternativ auch eine feste range) wieder vor den Punkt gesetzt - wegen der with anweisung am Anfang entfällt das im Code
' Da ich die Werte in einer Spalte untereinander haben wollte, ist die Spaltenzahl immer gleich, hier 1 also Spalte A
' zum Ermitteln der Spalte gehen ich von der ersten Zelle der auswählten Matrix aus = selection.row und addiere die Anzahl der Zeilen der Matrix = selection.Rows.Count dazu
' da wir das ja bei jeder schleife brauchen, nehme ich die Zeilenanzahl mal i und habe immer den Anfangsbereich.
' das Ende lege ich dann genauso fest. hier muss ich aber die Zeilenanzahl der Matrix einmal mehr als am Anfang dazu addieren. deshalb das i +1 (bei i waren wir ja am anfang der Zeile und einaml mehr die Zeilenanzahl ist das Ende
' auf Grund der rechnung und da wir bei Excel ja nicht mit 0 sondern 1 starten, am Ende noch 1 abziehen und es passt. Ansonsten kommt am Ende ein NV wie gestern.
' Für das 1 abziehen als erklärung, bei einer 3x3 matrix. Der erste Wert steht in Zeile 1. Die Zeilenzahl von 3 dazu und unser Anfang zum Eintragen ist zeile 4, wenn jetzt nochmal 3 für den Inhalt (Zeilenanzahl) dazukommen sind wir bei 7 (der erste Wert steht ja schon in 4). Also noch eins weg.
ActiveSheet.Range(Cells(.Row + i * (.Rows.Count), 1), Cells(.Row + (i + 1) * (.Rows.Count) - 1, 1)) = Application.WorksheetFunction.Index(.Value, 0, i)
Next i
End With
End Sub
Hoffe das ist verständlich. Viele Grüße
|