Leerzeile nach bestimmter Uhrzeit mit Makro einfügen

cesar

Stammgast
Guten Tag zusammen
Ich habe ein File, das in der Kolonne B Uhrzeiten enthält. Nun möchte ich mit VBA nach 10:00 Uhr, 14:00 Uhr und nach 20:00 Uhr jeweils eine Leerzeile einfügen. Die in der Kolonne enthaltenen Uhrzeiten sind aber verschieden, ZB: 09:45 oder 09:55 oder 13:05 oder 13:20 und nicht immer gleich. Die Uhrzeit 10:00 oder 14:00 etc. kommt so nicht unbedingt vor. Hat jemand für mich eine Lösung?

09:45
09:45
09:50
09:55
hier sollte die Leerzeile sein
12:25
12:40
12:50
13:05
13:10
13:10
13:15
13:20
hier sollte die Leerzeile sein
17:20
17:30
17:55
hier sollte die Leerzeile sein
21:30
22:40
22:40


Herzlichen Dank
cesar

PS: ich kann keine Beispiele hochladen.
 

nochEinAndreas

Stammgast
So?

Hallo cesar,

versuch mal diesen Code. Ich bin davon ausgegangen, dass die Zeiten in Spalte A stehen.

Code:
Option Explicit
Option Base 1

Sub leerZeilen()
    Dim ze As Long
    Dim zeiten As Variant
    Dim zt As Integer
    
    zeiten = Array(CDbl(TimeSerial(10, 0, 0)), CDbl(TimeSerial(14, 0, 0)), CDbl(TimeSerial(20, 0, 0)))
    ze = 1
    For zt = 1 To UBound(zeiten)
        While Cells(ze, 1) <= zeiten(zt)
            ze = ze + 1
        Wend
        Cells(ze, 1).Insert Shift:=xlDown
        ze = ze + 1
    Next zt
End Sub

Grüße, Andreas
 

cesar

Stammgast
Hallo Andreas
Danke für die rasche Antwort. Funktioniert aber noch nicht so ganz richtig.

Es werden Zellen und nicht Zeilen eingefügt und zudem nur um 20:00 und um 14:00 Uhr. Um 10:00 Uhr passiert überhaupt nichts. Formatierung der Zellen ist hh:mm.

Gruss
cesar
 

nochEinAndreas

Stammgast
Sorry

Das mit der Zelle statt Zeile stimmte. Habe ich hier berichtigt:

Code:
Option Explicit
Option Base 1

Sub leerZeilen()
    Dim ze As Long
    Dim zeiten As Variant
    Dim zt As Integer
    
    zeiten = Array(CDbl(TimeSerial(10, 0, 0)), CDbl(TimeSerial(14, 0, 0)), CDbl(TimeSerial(20, 0, 0)))
    ze = 1
    For zt = 1 To UBound(zeiten)
        While Cells(ze, 1) <= zeiten(zt)
            ze = ze + 1
        Wend
        Cells(ze, 1).EntireRow.Insert
        ze = ze + 1
    Next zt
End Sub

Dass bei 10:00 nichts passiert, konnte ich nicht nachstellen. Bei mir funktioniert es. Auch wenn ich genau 10:00 eintrage statt 09:55 wie in deinem Beispiel. Kannst du mal die Mappe hochladen?

Grüße, Andreas
 

cesar

Stammgast
Funktioniert jetzt einwandfrei

Hallo Andreas

Jetzt funktioniert das Makro einwandfrei. Es werden Zeilen eingeschoben, auch um 10:00 Uhr.
Herzlichen Dank für deine Hilfe
Cesar
 

weer

Stammgast
Grüezi Andreas, grüezi Cesar

Ich habe einige Zeit gebraucht, bis ich dieses Super-Makro "durchschaut" hatte!
Einen Hinweis möchte ich noch geben: Wenn die Zeitangaben in Spalte A mit 17:55 h enden, wenn es also keine Zeiten > 20:00 h gibt, kommt es zu einer Endlosschleife, oder?

Um das zu verhindern würde ich noch zwei Zeilen einbauen:
Code:
lr = Cells(Rows.Count, 1).End(xlUp).Row    ' <<<<<<<<<<<<<<

und in der Schleife:
    For zt = 1 To UBound(zeiten)
        While Cells(ze, 1) <= zeiten(zt)
            ze = ze + 1
                If ze > lr + 2 Then Exit Sub   ' <<<<<<<<<<<<<<
        Wend
        Cells(ze, 1).EntireRow.Insert
        ze = ze + 1
    Next zt

@Andreas: Wie löst man dieses Problem eleganter?

Grüsse Niclaus
 

nochEinAndreas

Stammgast
Völlig richtig

Hallo Niclaus,

du hast mal wieder völlig Recht mit deinem Einwand. Ich war einfach davon ausgegangen, dass es einen Eintrag > 17:55 gibt. Wenn der fehlt läuft der Makro wirklich in einer (fast) Endlos-Schleife, bzw. es tritt ein Fehler auf, wenn ze irgendwann größer als die maximale Zeilenzahl ist. Ich würde die Abbruchbedingung genau so (o.ä.) wie du lösen. Etwas "eleganteres" fällt mir da auch nicht ein.
Danke für deine wichtige Ergänzung und Grüße,
Andreas
 

cesar

Stammgast
Hallo ihr Profis

Danke euch beiden für die Bereitschaft, mir zu helfen. Werde das Makro so ergänzen, obwohl es vermutlich immer einen Eintrag nach 17:55 Uhr gibt.

gruss
cesar
 

cesar

Stammgast
Eine Unsicherheit

Hallo Niclaus

Ich habe deinen Vorschlag befolgt, nun erhalte ich aber die Meldung:

Fehler beim Kompilieren: Variable nicht definiert

Wo genau muss die Definition stehen?

Danke
cesar
 

nochEinAndreas

Stammgast
Hallo Cesar,

ich hatte an den Anfang des Makros die "Option Explicit" Anweisung geschrieben. Die schreibt vor, dass jede Variable, die benutzt wird, auch vorher dimensioniert werden muss. Das ist hilfreich, um Tippfehler bei Variablennamen zu vermeiden.
Niclaus hat die Variable lr (last row) in den Code eingeführt. Diese muss also vor der ersten Benutzung noch dimensioniert werden:
Schreibe unter die Zeile "Dim zt As Integer" noch die Zeile "Dim lr As Long". Dann sollte es klappen.

Grüße, Andreas
 
Oben