Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1844to1848
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA: Zellen verschieben nach neuer KW

VBA: Zellen verschieben nach neuer KW
16.09.2021 18:57:08
Stephan
Hallo zusammen,
ich bräuchte bitte eine Ergänzung in meinem VBA Code. Ich habe ein Makro aufgezeichnet, in dem ich 2 Bereiche von einem Tabellenblatt in ein anderes kopiere.
Ursprünglich stehen alle Einträge jeweils in einer Zeile unter der anderen ohne Leer-Zeilen.
Im Ziel-Tabellenbaltt hätte ich gerne, dass jeweils nach einer Kalenderwoche die folgenden Einträge um eine Zeile nach unten verschoben werden.
Es soll keine neue Zeile eingefügt werden. Bzw. wenn doch, müsste sie am Ende der Tabelle wieder gelöscht werden, da weiter unten schon Werte vorhanden sind, die sonst verschoben würden.
Also Tabellenblatt 1:
02.10.21 Eintrag...
07.10.21 Eintrag...
09.10.21 Eintrag...
12.10.21 Eintrag...
Tabellenblatt 2 soll sein:
02.10.21 Eintrag...
07.10.21 Eintrag...
09.10.21 Eintrag...
12.10.21 Eintrag...
Mein bisheriger Code lautet:

Sub Makro1()
' Makro1 Makro
' Planung nach Druck kopieren
Range("B5:C25").Select
Selection.Copy
Sheets("Druck").Select
ActiveWindow.SmallScroll Down:=-25
Range("A7:B27").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Planung").Select
Range("D5:E25").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Druck").Select
Range("C7:D27").Select
ActiveSheet.Paste
End Sub
Wie muss ich den ergänzen?
Vielen Dank vorab, Gruß Stephan

21
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: Zellen verschieben nach neuer KW
16.09.2021 19:39:34
ralf_b
fürs Erste mal so wie es ohne den Makrorekorder gehen würde.

Sub Makro1()
' Makro1 Makro
' Planung nach Druck kopieren
Range("B5:E25").Copy
Sheets("Druck").Range("A7:D27").PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=False
Application.CutCopyMode = False
End Sub

AW: VBA: Zellen verschieben nach neuer KW
16.09.2021 20:59:22
ralf_b
ich hab auch noch ne Idee für die Leerzeilensache.

Sub Makro2()
' Makro2
' Planung nach Druck kopieren
Dim i As Long
Dim iOffset As Integer
Dim kw1 As Integer, kw2 As Integer
For i = 1 To Range("B5:E25").Rows.Count
iOffset = iOffset + 1
If i > 1 Then
kw1 = Application.WeekNum(Range("B" & (i + 4)).Value,21)
kw2 = Application.WeekNum(Range("B" & (i + 4)).offset(-1).Value,21)
If kw1 > kw2 Then iOffset = iOffset + IIf(kw1 > kw2, 1, 0)
End If
Worksheets("Druck").Range("A" & (6 + iOffset)).Resize(, 4).Value = Range("B" & (4 + i)).Resize(, 4).Value
Next
End Sub

Anzeige
AW: VBA: Zellen verschieben nach neuer KW
16.09.2021 21:13:43
Stephan
Da kommt bei mir:
Laufzeitfehler 13 Typen unverträglich
AW: VBA: Zellen verschieben nach neuer KW
17.09.2021 06:33:42
ralf_b
Moin,
versuch mal mit dieser Änderung. Das du Text statt Datum in der Zelle hast, fehlte in deiner Beschreibung.

kw1 = Application.WeekNum(CDate(Range("B" & (i + 4)).Value), 21)
kw2 = Application.WeekNum(CDate(Range("B" & (i + 4)).offset(-1).Value), 21)

AW: VBA: Zellen verschieben nach neuer KW
17.09.2021 13:58:54
Stephan
leider immer noch Laufzeitfehler 13
ich habe das Datum in B aus mehreren Zellen zusammengebaut (Tag in A, Monat in B3 und Jahr in C3):
B enthält die Formel
AW: VBA: Zellen verschieben nach neuer KW
18.09.2021 10:20:11
ralf_b
Moin,
vielen dank für die Tabelle. Die bringt etwas Licht in die Sache.
Der Laufzeitfehler ist weg. Das letzte Datum im Bereich wird nicht übernommen, weil falscher Monat. Du hattest erklärt das die Datumswerte lückenlos in der Liste stehen.
Das erste Datum wird zweimal geschrieben. Das bleibt so.

Sub Makro2()
' Makro2
' Planung nach Druck kopieren
Dim i As Long
Dim iOffset As Integer
Dim kw1 As Integer, kw2 As Integer
For i = 1 To Range("B5:E25").Rows.Count
If Range("B" & (i + 4))  "" Then 'ist zelle nicht leer
If Month(Range("B" & (i + 4)).Value) = Range("B3").Value Then 'vergleich ob gleicher monat
iOffset = iOffset + 1
If i > 1 Then
kw1 = Application.WeekNum(CDate(Range("B" & (i + 4)).Value), 21)
kw2 = Application.WeekNum(CDate(Range("B" & (i + 4)).Offset(-1).Value), 21)
If kw1 > kw2 Then iOffset = iOffset + IIf(kw1 > kw2, 1, 0)
End If
Worksheets("Druck").Range("A" & (6 + iOffset)).Resize(, 4).Value = Range("B" & (4 + i)).Resize(, 4).Value
End If
End If
Next
End Sub

Anzeige
AW: VBA: Zellen verschieben nach neuer KW
18.09.2021 13:04:03
Stephan
Vielen Dank, Ralf, das passt perfekt.
2 maliger Samstag in diesem Fall Absicht, also ok
Anderer Monat nur als Notiz gedacht, hätte im Beispiel auch gelöscht werden können
Zuletzt noch: Wie muss ich den Code anpassen, wenn ich das analog für einen zweiten Bereich genauso machen möchte? ("Planung" B29:E49 soll nach "Druck" A33:D53 kopiert werden, selbes Procedere wie im ersten Bereich mit Zeilen zwischen den Wochen).
Ich hab versucht, den bereichs-angepassten Makrotext nochmal einzufügen, aber das klappt mangels VBA Kenntnissen nicht...
AW: VBA: Zellen verschieben nach neuer KW
18.09.2021 18:03:40
ralf_b

Sub Makro2()
' Makro2
' Planung nach Druck kopieren
Dim i      As Long
Dim iOffset As Integer
Dim kw1    As Integer, kw2 As Integer
Dim iZeilenbasis As Integer
Dim arrBereiche(1 To 2)                       'die Zahl nach "to" an die Anzahl der Bereiche anpassen
arrBereiche(1) = "B5:E25,6"                   'Bereiche entsprechend der Notation unten dran schreiben.
arrBereiche(2) = "B29:E49,32"                 ' 6 bzw 32 sind eine Zeilennr unter dem Einfügebereich
For cnt = 1 To UBound(arrBereiche)            'schleife über die Bereiche
iZeilenbasis = Range(Split(arrBereiche(cnt), ",")(0)).Row - 1
iOffset = 0
For i = 1 To Range(Split(arrBereiche(cnt), ",")(0)).Rows.Count 'schleife über jede Zeile des Quell-Bereiches
'Da die 4 + i in Summe die Zeilennummer ergeben, ist bei Startzelle B5 eine 4 zu setzen
If Range("B" & (i + iZeilenbasis))  "" Then 'ist Zelle (Schleifenzähler i + iZeilenbasis = 5 nicht leer
If Month(Range("B" & (i + iZeilenbasis)).Value) = Range("B" & (iZeilenbasis - 1)).Value Then 'vergleich ob gleicher monat
iOffset = iOffset + 1
If i > 1 Then
kw1 = Application.WeekNum(CDate(Range("B" & (i + iZeilenbasis)).Value), 21)
kw2 = Application.WeekNum(CDate(Range("B" & (i + iZeilenbasis)).Offset(-1).Value), 21)
If kw1 > kw2 Then iOffset = iOffset + IIf(kw1 > kw2, 1, 0)
End If
'arrBereiche(cnt)  ist z.b."B5:E25,6"
'Split(arrBereiche(cnt), ",")(1)
'durch split wird daruas Feld(0) = B5:E25  und Feld(1) = 6
'ergibt Range("A" & (Split(arrBereiche(cnt), ",")(1) + iOffset)) also z.b. A7
'Resize vergrößert den Zielbereich (Resize(Zeilenanzahl,Spaltenanzahl)
' mit Range(A7").Resize(,4) wird daraus der Bereich "A7:E7"
Worksheets("Druck").Range("A" & (Split(arrBereiche(cnt), ",")(1) + iOffset)).Resize(, 4).Value = Range("B" & (i + iZeilenbasis)).Resize(, 4).Value
End If
End If
Next
Next
End Sub

Anzeige
AW: VBA: Zellen verschieben nach neuer KW
18.09.2021 18:23:23
Stephan
perfekt, vielen Dank :-)
AW: VBA: Zellen verschieben nach neuer KW
19.09.2021 13:42:30
Stephan
Hallo Ralf,
der Praxistest hat gezeigt, dass ich die Inhalte im Tabellenblatt "Druck" löschen muss, bevor ich die "Planung" rüberkopiere. Sonst kann es sein, dass mir später "alte" Inhalte aus vorherigen Monaten stehenbleiben (wenn ich einmal weniger Zeilen kopiere, als in "Druck" schon vorhanden sind.
Zum Löschen der Inhalte habe ich per Recorder ein Makro aufgezeichnet, das ich aber nicht mit dem vorhandenen kombinieren kann:

Sub druckLöschen()
' druckLöschen Makro
Sheets("Druck").Select
Range("A7:D27").Select
ActiveWindow.SmallScroll Down:=20
Range("A7:D27,A33:D53").Select
Range("A33").Activate
Selection.ClearContents
ActiveWindow.SmallScroll Down:=-20
End Sub
Egal, ob ich den Code in dein Makro einfüge, oder per Button die 2 Makros hintereinander ausführen lasse, es kommt immer der Laufzeitfehler 13 "Typen unverträglich".
Kann ich diesen Code (oder einen angepassten...?) in deinen integrieren, sodass ich mit einem Makro alles zusammen habe? Also zuerst in "Druck" die Inhalte des Bereichs löschen und dann dein komplettes Makro2?
Anzeige
AW: VBA: Zellen verschieben nach neuer KW
19.09.2021 14:52:44
ralf_b
versuchs mal damit
aus dem Split soll die Zeilennummer und dann + 1 den Anfang des Zielbereiches ergeben.
resize() soll den zu löschenden Bereich anpassen 4 Spalten und 20 Zeilen

For cnT = 1 To UBound(arrBereiche)            'schleife über die Bereiche
Worksheets("Druck").Range("A" & Split(arrBereiche(cnT), ",")(1) + 1).Resize(20, 4).ClearContents

AW: VBA: Zellen verschieben nach neuer KW
19.09.2021 16:35:07
Stephan
klappt, danke :-)
AW: VBA: Zellen verschieben nach neuer KW
16.09.2021 21:09:12
Stephan
ok... danke...
Entschuldigung, falls ich mich falsch ausgedrückt haben sollte...
Ich wollte keine Umwandlung meines aufgezeichneten Makros in einen VBA Code, sondern eine Ergänzung, wie ich leere Zeilen zwischen die Wochen bekomme.
Dein Code kopiert mir meinen Text von A nach B, aber das hatte ich schon...
Anzeige
AW: VBA: Zellen verschieben nach neuer KW
16.09.2021 19:56:29
Daniel
Hi
probies mal mit diesem Code.
das kopieren der Blöcke lasst sich jeweils in einer Zeile durchführen.
Das einfügen der Leerzeilen nach jeder Kalenderwoche ist nicht ganz so einfach.
Da muss man immer bei einem Wechsel den Bereich ab dieser Zeile bis zum Ende kopieren und eine Zeile weiter unten einfügen und dann die Zeile leeren.
Auf diese weise werden darunter liegende Zellen nicht verschoben.
Du musst allerdings darauf achten, dass genügend Platz ist, denn einen Überschreibschutz habe ich nicht eingebaut.
Wenn jede Zeilen in einer neuen KW liegt, brauchst du das doppelte an Zeilen:

Sub Test()
Dim Z As Long
Dim S As Long
Dim Ende As Long
'--- Kopieren
Sheets("Planung").Range("B5:C25").Copy Sheets("Druck").Range("A7")
Sheets("Planung").Range("D5:E25").Copy Sheets("Druck").Range("C7")
'--- Leerzeilen einfügen
With Sheets("Druck")
For S = 1 To 3 Step 2 'Schleife über beide Bereiche
Ende = 27
For Z = Ende To 7 + 1 Step -1
If WorksheetFunction.WeekNum(.Cells(Z, S), 21)  _
WorksheetFunction.WeekNum(.Cells(Z - 1, S), 21) Then
.Range(.Cells(Z, S), .Cells(Ende, S + 1)).Copy .Cells(Z + 1, S)
.Cells(Z, S).Resize(, 2).Clear
Ende = Ende + 1
End If
Next
Next
End With
End Sub
Gruß Daniel
Anzeige
AW: VBA: Zellen verschieben nach neuer KW
16.09.2021 21:06:29
Stephan
Hallo Daniel, danke für die Meldung.
1. Das Einfügen von B5:C25 im Arbeitsblatt "Druck" unter A7:B27 erfolgte bei meinem aufgezeichneten Vorgang mit "nur Werte einfügen", da die Zellen B5:C25 per Formel befüllt sind. Mit deinem Code erhalte ich im Ziel-Arbeitsblatt nur #BEZUG!
Ich nehme an, mein Code hat das hier geregelt:
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
2. Das mit den leeren Zeilen nach jeder Woche funktioniert leider nicht. Nach Ausführen des Makros erscheint die Meldung:
Laufzeitfehler `1004`:
Die WeekNum-Eigenschaft des WorksheetFunction-Objektes kann nicht zugeordnet werden.
Wenn ich auf "Debuggen" klicke, werden im VBA diese 2 Zeilen gelb markiert:
If WorksheetFunction.WeekNum(.Cells(Z, S), 21) _
WorksheetFunction.WeekNum(.Cells(Z - 1, S), 21) Then
Die Datumsangaben habe ich ohne Kalenderwochenfunktion erstellt, falls das wichtig zu wissen ist...
Anzeige
AW: VBA: Zellen verschieben nach neuer KW
16.09.2021 21:25:09
Daniel
1. ja stimmt, hatte ich nicht bedacht.
dann in der ersten Zeile nur kopieren und in der zweiten Zeile das .PasteSpecial.
Aber bitte statt dem "Selection" hier die Zelle direkt einfügen. Beim einfügen reicht die linke obere Zelle des Zielbereichs, man braucht nicht den ganzen Bereich.
2. könnte daran liegen, dass in deinen Zellen kein Datum steht. Wenns kein Datum ist, kann man auch keine Kalenderwoche berechnen.
manchmal gibt es auch den Fall, dass etwas kein Datum ist, sondern ein Text der nur so aussieht, und der kann dann u.U. nicht umgewandelt werden.
Kann ich aber ohne die Datei nicht beurteilen. Bei mir in meiner Datei die ich nach deinen Vorgaben aufgebaut habe, hats funktioniert.
Gruß Daniel
Anzeige
AW: VBA: Zellen verschieben nach neuer KW
16.09.2021 21:47:20
Yal
Hallo Stefan,
basierend auf dem Code von Daniel:

Sub Test()
Dim Z As Long
Dim S As Long
Dim Ende As Long
'--- Kopieren
Sheets("Planung").Range("B5:C25").Copy
Sheets("Druck").Range("A7").PasteSpecial Paste:=xlPasteValues
Sheets("Planung").Range("D5:E25").Copy
Sheets("Druck").Range("C7").PasteSpecial Paste:=xlPasteValues
'--- Leerzeilen einfügen
With Sheets("Druck")
For S = 1 To 3 Step 2 'Schleife über beide Bereiche
Ende = 27
For Z = Ende To 7 + 1 Step -1
If WorksheetFunction.WeekNum(CDate(Left(.Cells(Z, S), 8)), 21)  _
WorksheetFunction.WeekNum(CDate(Left(.Cells(Z - 1, S), 8)), 21) Then
.Range(.Cells(Z, S), .Cells(Ende, S + 1)).Copy .Cells(Z + 1, S)
.Cells(Z, S).Resize(, 2).Clear
Ende = Ende + 1
End If
Next
Next
End With
End Sub
die Unterschied: es werden nur die ersten 8 Stellen der Zelle als Datum interpretiert.
VG
Yal
Anzeige
Beispieltabelle
17.09.2021 18:31:19
Stephan
Hallo Yal,
der Text wird kopiert, aber ich bekomme dann den Laufzeitfehler 13
wie auch an ralf_b geantwortet:
ich habe das Datum in B aus mehreren Zellen zusammengebaut (Tag in A, Monat in B3 und Jahr in C3):
B enthält die Formel
hier eine Beispieltabelle: Es geht nur um A:E
https://www.herber.de/bbs/user/148128.xlsm
AW: Beispieltabelle
21.09.2021 14:56:01
Yal
Hallo Stefan,
(gut, dass Du die Meldung per Mail eingeschaltet hast, sonst hätte ich 5 Tage danach nicht mehr geantwortet)
Der Code basiert auf die Bereiche B5:C25 und D5:E:25 im Blatt "Planung". Anscheinend ist diese Blatt jetzt in B5:C25 und B29:C29 organisiert. Erste Fehlerquelle.
Dann, da es leere Zelle dazwischen gibt, sollte die Gültigkeit der Eingangsgrösse getestet werden:

Sub Makro1()
Dim Z As Long
Dim LetzteWoche As Integer
Dim aktWoche As Integer
'--- Als Wert übertragen
Sheets("Planung").Range("B5:C25").Copy
Sheets("Druck").Range("A7").PasteSpecial Paste:=xlPasteValues
Sheets("Planung").Range("B29:C49").Copy
Sheets("Druck").Range("A33").PasteSpecial Paste:=xlPasteValues
'--- Leerzeilen einfügen
On Error Resume Next
With Sheets("Druck")
LetzteWoche = 0
LetzteWoche = WorksheetFunction.WeekNum(CDate(.Cells(53, 1)), 21)
For Z = 52 To 7 Step -1
aktWoche = 0
aktWoche = WorksheetFunction.WeekNum(CDate(.Cells(Z, 1)), 21)
If LetzteWoche  0 And aktWoche  0 Then
.Range(.Cells(Z, S), .Cells(Ende, S + 1)).Copy .Cells(Z + 1, S)
.Cells(Z, S).Resize(1, 2).Clear
End If
LetzteWoche = aktWoche
Next
End With
End Sub
VG
Yal
AW: Beispieltabelle
21.09.2021 17:29:17
Stephan
Vielen Dank, hab bereits den Code von ralf_b im Einsatz, damit passt es :-)
Ja, habe zu spät entdeckt :-) owT
22.09.2021 13:36:31
Yal

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige