[Code] [VBA] Schleife wird nicht fortgeführt

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von H5N1, 7. November 2012 .

Schlagworte:
  1. 7. November 2012
    Zuletzt bearbeitet: 7. November 2012
    [VBA] Schleife wird nicht fortgeführt

    Ich habe eine Schleife in der geprüft wird, ob der Arbeitsbeginn und das Arbeitsende eines Users eingetragen ist.
    Wenn nichts eingetragen ist, dann soll sie aufhören.
    Es müssen beide Werte (Beginn und Ende) vorhanden sein, damit die Arbeitszeit berechnet wird.
    Außerdem wird die errechnete Arbeitszeit an eine Funktion übergeben die überprüft, ob die Arbeitszeit größer/gleich 9 Stunden ist, denn dann werden 45 Minuten Pause eingetragen, ansonsten nur 30 Minuten.

    Nur soweit kommt es nicht, denn die Schleife zählt den Schleifenzähler nicht hoch und kontrolliert somit nicht die nächsten Zellen sondern bleibt immer in den ersten.

    Hier ist der Code für die Berechnung der Arbeitszeit und die Schleife:
    Code:
    Function Arbeitszeit()
     
    Dim dateAZanfang As Date 'Variable für den Anfang der Arbeit
    Dim dateAZende As Date 'Variable für das Ende der Arbeit
    Dim dateAZ As Date 'Variable zum verrechnen von Ende und Anfang der Arbeitszeit
    Dim intArbeitstag As Integer 'Variable welche den Arbeitstag im Monat wiederspiegelt und als Zählervariable für die Schleife genutzt wird
    
    intArbeitstag = 2
     Do
     intArbeitstag = intArbeitstag + 1
     
     If Cells(intArbeitstag, 4).Value = "" Or Cells(intArbeitstag, 6).Value = "" Then Exit Function 'Prüft ob die Zellen für Arbeitszeiten leer sind, wenn ja wird bei diesen nicht berechnet
     
     dateAZanfang = ActiveSheet.Cells(intArbeitstag, 4).Value 'Liest Arbeitsbeginn ein
     
     dateAZende = ActiveSheet.Cells(intArbeitstag, 6).Value 'Liest Arbeitsende ein
     
     dateAZ = dateAZende - dateAZanfang 'Berechnet die gearbeitete Zeit
     
     ActiveSheet.Cells(intArbeitstag, 7).Value = Pausefuellen(dateAZ) 'Die gearbeitete Zeit wird an die Funktion "Pausefuellen" übergeben
     'Der Rückgabewert wird in die aktuelle Zelle des aktuellen Worksheets eingetragen
     Loop
    
    End Function 'Ende Funktion "Arbeitszeit

    Hier ist die Funktion für die Pause:
    Code:
    Function Pausefuellen(AZ As Date) As Date
    
    If AZ >= CDate("09:00:00") Then 'Bedingung wird erfüllt, wenn die gearbeitete Zeit über 9 Stunden liegt
     Pausefuellen = "00:45:00" 'dann werden 45 Minuten Pause eingetragen
    Else
     Pausefuellen = "00:30:00" 'wenn die AZ unter 9 Stunden liegt werden 30 Minuten Pause eingetragen
    End If
    
    End Function

    Vorhin hatte es noch funktioniert. Ich weiß nicht, warum es auf einmal nicht geht.



    Vielen Dank für jegliche Hilfe.


    E:// also ich weiß schon einmal jetzt, dass es an der Einbindung der Funktion liegt, denn wenn ich diese auskommentiere, läuft es wieder einwandfrei.


    MfG
    H5N1
     
  2. 7. November 2012
    AW: [VBA] Schleife wird nicht fortgeführt

    Also zuerst einmal finde ich is recht unhöflich in dem anderen Thread wo du nach dem Kalender gefragt hast, nicht einmal eine Antwort zu geben ob es funktioniert hat oder nicht.
    Gleichzeitig machst du aber einen anderen Thread auf mit einer neuen Frage

    Naja wie dem auch sei ist es zuerst einmal immer Sinnvoll beim Zugriff auf Zellen auch die zugehörige Tabelle mit anzugeben. Also immer Schreiben Tabelle1.Cells(Zeile,Spalte) Sowas wie Activesheet würde ich wenn es nicht unbedingt nötig ist weg lassen. Bringt nur Fehlerquellen mit sich.

    Zusätzlich würde ich das .Value hinter den ganzen Zellverweisen weglassen. Brauchst du nicht wirklich

    Würde das erstmal machen und wenns dann nicht klappt wäre es ganz gut wenn du mal schreiben könntest was genau in spalte 4 und 6 drin steht. Gegebenenfalls kannst du mir auch die Excel Datei schicken dann guck ich mal rein
     
    1 Person gefällt das.
  3. 7. November 2012
    AW: [VBA] Schleife wird nicht fortgeführt

    Zu dem ersten, ich bin dir sehr dankbar, konnte es nur noch nicht testen, da das andere halt höhere Priorität hat. Werde es aber morgen ausprobieren!

    Zu dem anderen. Active deshalb, weil ich die Functionen aus den Sheets heraus aufrufe und dann muss natürlich immer das aktuelle Sheet gewählt werden, weil es ist ja sinnlos für jedes Sheet alle Funktionen zu kopieren.
    Aber danke, dass ich Value nicht brauche wusste ich nicht, bin noch etwas neu bei VBA
     
  4. 7. November 2012
    AW: [VBA] Schleife wird nicht fortgeführt

    Hab deine Funktionen gerade mal getestet und zwar mit 08:00:00 in Spalte 4 und 17:00:00 in Spalte 6.
    Ergebnis in Spalte 7 ist dann nachdem man die Spalte als Uhrzeit ("00:00:00") Formatiert hat:
    0:45:00

    Ist also alles richtig. Das einzige was mir noch aufgefallen ist, ist das du deinen Zähler bei 2 Starten lässt. Ist das Richtig so weil du quasi 2 Überschriften hast? Der Fängt nämlich so erst in Zeile 3 an mit der Berechnung

    Ansich ist aber alles soweit richtig.
     
  5. 8. November 2012
    AW: [VBA] Schleife wird nicht fortgeführt

    Ja das mit er mit 2 beginnt, ist richtig, denn er rechnet schon +1 zu Anfang der Schleife rauf
    Also wenn ich zB. 2 Werte habe sagen wir
    In Cell(1,4) und Cell(1,6) und dann eben Cell(2,4)&Cell(2,6) dann stürzt es ab, es berechnet immer und immer wieder nur die Zeile 1 und geht nicht weiter herunter.
     
  6. 8. November 2012
    AW: [VBA] Schleife wird nicht fortgeführt

    Würde mit MsgBox die Variablen ausgeben, ist nicht die schönste Lösung aber dann siehst du was passiert und kannst es vielleicht besser nachvollziehen.?(
     
  7. 8. November 2012
    Zuletzt bearbeitet: 9. November 2012
    AW: [VBA] Schleife wird nicht fortgeführt

    E:// Okay ich habe es hinbekommen.
    Ich weiß nicht woran es liegt, aber der Code sieht jetzt so aus.

    Für die Sub Arbeitszeit:
    Code:
    Function Arbeitszeit()
     
    Dim dateAZanfang As Date 'Variable für den Anfang der Arbeit
    Dim dateAZende As Date 'Variable für das Ende der Arbeit
    Dim dateAZ As Date 'Variable zum verrechnen von Ende und Anfang der Arbeitszeit
    Dim intArbeitstag As Integer 'Variable welche den Arbeitstag im Monat wiederspiegelt und als Zählervariable für die Schleife genutzt wird
    Dim j As Integer 'Variable für die Zählervariable
    
    j = 3 'setzt Variable j auf 3, denn das Befüllen und Überprüfen der Zellen beginnt erst in Zeile 3
    
    For j = 3 To 33 'Wiederholt die Schleife von Zeile 3 bis 33 denn das ist die maximale Anzahl an Tagen
     If Cells(j, 4) = "" Or Cells(j, 6) = "" Then Exit Function 'Prüft ob die Zellen für Arbeitszeiten leer sind, wenn ja werden diese nicht berechnet
     
     
     ''''''''''''Abfrage ob die Zeiteingabe auch eine Zeit ist und keine anderen Zeichen
     
     If IsNumeric(Cells(j, 4)) = False Then 'Wenn in der Zelle etwas steht
     Cells(j, 4).Select 'wird diese Zelle ausgewählt
     MsgBox ("Bitte geben Sie in D" & j & " eine gültige Uhrzeit ein") 'und der User erhält eine Fehlermeldung
     Exit Function
     End If
     If IsNumeric(Cells(j, 6)) = False Then 'Wenn in der Zelle etwas steht
     Cells(j, 6).Select 'wird diese Zelle ausgewählt
     MsgBox ("Bitte geben Sie in F" & j & " eine gültige Uhrzeit ein") 'und der User erhält eine Fehlermeldung
     Exit Function
     End If
     
     ''''''''''''Abfrage Ende
     
     
     dateAZanfang = Cells(j, 4) 'Liest Arbeitsbeginn ein
     dateAZende = Cells(j, 6) 'Liest Arbeitsende ein
     dateAZ = dateAZende - dateAZanfang 'Berechnet die totale Arbeitszeit
     Range("G" & j).Value = Pausefuellen(dateAZ) 'Die totale Arbeitszeit wird an die Funktion "Pausefuellen"
     'übergeben. In dieser wird die Pausenzahl berechnet.
     'Der Rückgabewert wird in eine Zelle eingetragen.
    
     
     
    
    Next j 'Ende der Forschleife
    
    End Function 'Ende Funktion "Arbeitszeit"

    Die Funktion "Pausefuellen" sieht so aus:
    Code:
    ''''''''''''Funktion zum überprüfen, ob die übergebene totale Arbeitszeit größer,gleich 9 Stunden ist
    
    Function Pausefuellen(AZ As Date) As Date
    
    If AZ >= CDate("09:00:00") Then 'Bedingung wird erfüllt, wenn die gearbeitete Zeit über 9 Stunden liegt,
     Pausefuellen = "00:45:00" 'dann werden 45 Minuten Pause eingetragen
    Else
     Pausefuellen = "00:30:00" 'Wenn die AZ unter 9 Stunden liegt, werden 30 Minuten Pause eingetragen
    End If
    
    End Function
    
    ''''''''''''Ende der Funktion "Pausefuellen"
    
     
  8. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.