VBA Excel: Aus einer Spalte Zeilenblöcke kopieren

Liebe Experten,
ich habe hier eine Anwendung, bei der ich nicht so recht weiterkomme und Google und Foren haben mir nicht so gut geholfen. Ich bin Anfänger und hoffe so auf eure Hilfe.

Was will ich machen? Also: Ich habe eine Spalte C beginnend ab C2. Dort stehen die Zahlenwerte „blockweise“ immer in 118er Schritten bis zur Zeile 29275.
Ich möchte immer 118 Zeilen, die einen Block bilden in die nächste freie Spalte kopieren. Der Block nach den 118 Zeilen, der wieder aus 118Zeilen besteht dann in die nächste Spalte usw.

Anschaulich: also aus der Spalte C Block 1 von Zeile 2-120 in Spalte E, Block 2 von Zeile 121-239 in Spalte F usw.

Das aufgezeichnete Makro sieht so aus:

Range(„C2:C120“).Select
Selection.Copy
Range(„F2:F120“).Select
ActiveSheet.Paste

Range(„C121:C239“).Select
Selection.Copy
Range(„G2:G120“).Select
ActiveSheet.Paste

Range(„C240:C358“).Select
Selection.Copy
Range(„H2:H120“).Select
ActiveSheet.Paste

Wie kann ich das in einer Schleife realisieren?
Da ich ja 29275 Zeilen in 118er Intervallschritten habe, komme ich am Ende auf 29275:118 = 248 Spalten in denen die Werte stehen.

Ich hoffe meine Frage ist klar und bin schon gespannt auf Lösungshinweise, worüber ich mich sehr freuen würde!

Beste Grüße!

Hallo Niol,

Ich möchte immer 118 Zeilen, die einen Block bilden in die
nächste freie Spalte kopieren. Der Block nach den 118 Zeilen,
der wieder aus 118Zeilen besteht dann in die nächste Spalte
usw.

Anschaulich: also aus der Spalte C Block 1 von Zeile 2-120 in
Spalte E, Block 2 von Zeile 121-239 in Spalte F usw.

Bei 118 komme ich auf
C2:C119
C120:C237
C238:C355
usw.

probiere mal dieses:

Sub nn()
Dim Spa As Long, A As Long, Anz As Long
Application.ScreenUpdating = False
A = Int(29275 / 118)
If 29275 Mod 118 0 Then A = A + 1
Spa = 5
For Anz = 2 To A \* 118 Step 118
 Range("C" & Anz).Resize(118, 1).Copy Destination:=Cells(2, Spa)
 Spa = Spa + 1
Next Anz
Application.ScreenUpdating = True
End Sub

Gruß
Reinhard

Hallo Reinhard,

es funktioniert einwandfrei! Ich musste nur den Step auf 119 erhöhen, da die Liste bei 0 beginnt.
Vielen Dank für die rasche tolle Antwort!

Mich interessiert noch was diese Zeile macht:
If 29275 Mod 119 0 Then A = A + 1

Also wenn der Rest 0 ist, wieso wird dann A um 1 erhöht? von 246 auf 247?

Und könnte man in der Zeile:
Range(„C“ & Anz).Resize(119, 1).Copy Destination:=Cells(2, Spa)
auch nur Range(„C2“)… schreiben?

Liebe Grüße,
Niol

Hallo Niol,

Mich interessiert noch was diese Zeile macht:
If 29275 Mod 119 0 Then A = A + 1
Also wenn der Rest 0 ist, wieso wird dann A um 1 erhöht? von
246 auf 247?

angenommen du hast 10 Zellen in einer Spalte und wilst diese in 3er Blöcken auf andere Spalten aufteilen.
Int(10/3) ergibt dann eine 3, nur du brauchst ja 4 Spalten.

Und könnte man in der Zeile:
Range(„C“ & Anz).Resize(119, 1).Copy Destination:=Cells(2,
Spa)
auch nur Range(„C2“)… schreiben?

Nein, du willst ja 118 fortlaufende Zellen, also einen Zellenbereich kopieren.
Bau mal in die Schleife vor die Codezeile ein:
Msgbox Range(„C“ & Anz).Resize(119, 1).Address

Gruß
Reinhard

Hallo Niol,

Mich interessiert noch was diese Zeile macht:
If 29275 Mod 119 0 Then A = A + 1
Also wenn der Rest 0 ist, wieso wird dann A um 1 erhöht? von
246 auf 247?

angenommen du hast 10 Zellen in einer Spalte und wilst diese
in 3er Blöcken auf andere Spalten aufteilen.
Int(10/3) ergibt dann eine 3, nur du brauchst ja 4 Spalten.

ja jetzt ists klar, bedeutet ja ungleich… :wink:

Und könnte man in der Zeile:
Range(„C“ & Anz).Resize(119, 1).Copy Destination:=Cells(2,
Spa)
auch nur Range(„C2“)… schreiben?

Nein, du willst ja 118 fortlaufende Zellen, also einen
Zellenbereich kopieren.
Bau mal in die Schleife vor die Codezeile ein:
Msgbox Range(„C“ & Anz).Resize(119, 1).Address

Hab ich gemacht, Resize definiert also wie der Name schon sagt einen neuen Bereich, dessen Anfang ich mit Range(„Spalte“ & „Zeile“(hier Anz)) angebe? Da Anz mit Next Anz erhöht wird, kann ich natürlich nicht immer C2 nehmen… - glaub, ich habs jetzt :wink:

Liebe Grüße und Danke nochmal!
Niol

Gruß
Reinhard