ich stelle mich ein wenig ungeschickt an, seit Tagen versuche ich eine Funktion zu schreiben, die mir die monatliche Arbeitszeit via Schleife ermittelt. Die Idee, ich übergebe an eine Funktion Monat, Jahr und die Wochenarbeitszeit in der Form (mo,di,mi,do,fr,sa,so) also (8,8,8,6,5,7,0). Rückgabe soll die monatliche Arbeitszeit sein. Hat jemand eine Idee?
Hallo,
das wird wohl nicht ganz so einfach wie Du Dir das denkst.
Die Monate gehen ja nicht mit den Wochen auf.
Und was ist mit der Person, nicht jede Person hat ja die gleiche Zeit?
Ein weiteres Problem dürfte auch sein, dass die Zeiten ja wahrscheinlich nicht gleich bleiben und wenn sich die Zeiten ändern, dürfen sich die alten Zeiten nicht änden.
Wie ist denn die Arbeitszeit gespeichert. Also die Stunden je Tag abhängig von der Person ?
Am geschicktesten löst man sowas mit einer Kalendertabelle. Das lässt sich dann über die Beziehungen regeln. Die Monatszeit ist dann eine einfache Summierung.
Ich will keine Arbeitzeitverwaltung, sondern nur die monatliche Arbeitszeit ermitteln. Meine Idee
Function mtlAZ(Startdatum as date, Enddatum as date, moAZ as long, diAZ as long, miAZ as long, doAZ as long ...)
Dann Soll die Funktion eine Schleife von startdatum bis Enddatum durchlaufen und für die täglichen AZ mo-so die Stunden aufsummieren und als Wert zurückgeben. Das mir die Tage aufgelistet werden habe ich schon geschafft. Leider erzeugt meine Funktion von donkarl erzeugt immer wieder Fehler.
ZitatDas mir die Tage aufgelistet werden habe ich schon geschafft.
Dann braucht man keine Funktion mehr, sondern nur noch eine Abfrage, die die Tage über den Monat gruppiert und die zugehörigen Werte summiert.
Schleife und Funktion hört sich aber wichtig an, ist umfangreicher und langsamer und fehleranfälliger.
Zitatmeine Funktion ... erzeugt immer wieder Fehler
Alles klar bei dieser gigantischen Informationsdichte. Tipp: Mach es anders.
Hallo,
im Anhang ein einfaches Beispiel für Dein Vorhaben mit einer Kalendertabelle.
Geht ohne einen Buchstaben VBA.
Die Abfrage zeigt die monatliche Arbeitszeit und kann noch auf einen bestimmten Monat gefiltert werden.
Und das auch noch rasend schnell für alle Monate.
Oder man kann in einem Formularfeld die mon. Arbeitszeit mit DomSumme ermitteln. Auch ohne VBA.
DomSumme verwendet dann die Abfrage und wird mit Monat und Jahr gefiltert.
Wo habe ich da einen Denkfehler
Public Function mtlArbeitszeitErm(ByVal dStart As Date, ByVal dEnde As Date, SMo As Double, SDi As Double, SMi As Double, SDo As Double, SFr As Double, SSa As Double, SSo As Double) As Double
Dim i As Date
Dim StdZ As Double 'Stundenzähler
Dim woTa As Integer 'Wochentag 1 = Sonntag 7 = Samstag
StdZ = 0 'Initialisierung Stundenzähler
For i = dStart To dEnde
FktCntDate = i
Select Case woTa
Case Is = 1
StdZ = StdZ + SSo
Case Is = 2
StdZ = StdZ + SMo
Case Is = 3
StdZ = StdZ + SDi
Case Is = 4
StdZ = StdZ + SMi
Case Is = 5
StdZ = StdZ + SDo
Case Is = 6
StdZ = StdZ + SFr
Case Is = 7
StdZ = StdZ + SSa
End Select
'Debug.Print StdZ
'Kontrollausgabe im Direktfenser
'Debug.Print Format(FktCntDate, "ddd dd.mm.yyyy") & " Tag: " & Weekday(FktCntDate)
Next i
mtlArbeitszeitErm = StdZ
End Function
Er sollte die als Parameter übergebene Stundenzahl in der Variablen StdZ addieren. Macht er aber nicht. Ich habe keine Ahnung wieso nicht.
Na ja, "woTa" bleibt ja nach der Deklarierung immer 0.
Danke für den Denkansatz, so funktioniert es
For i = dStart To dEnde
mtlArbeitszeitErm = i
woTa = Weekday(i)
Select Case woTa '= Weekday(i)
Case Is = 1
StdZ = StdZ + SSo
Case Is = 2
StdZ = StdZ + SMo
Case Is = 3
StdZ = StdZ + SDi
Case Is = 4
StdZ = StdZ + SMi
Case Is = 5
StdZ = StdZ + SDo
Case Is = 6
StdZ = StdZ + SFr
Case Is = 7
StdZ = StdZ + SSa
End Select
Und gibt die exakten Soll-Stunden bzw. die zu bezahlenden Stunden pro Monat zurück.
Hallo,
hast Du Dir eigentlich mal mein Beispeil in #4 angesehen ?
Hallo Klaus, habe ich gerade gemacht ... Könnte man ja eine komplette Arbeitzeitverwaltung darum herum bauen. Allerdings benötige ich nur ein Formular, das mir bei einem bestimmten Eintrittsdatum die monatliche Sollarbeitszeit und die Sollarbeitstage ausgibt. Multipliziert mit dem Stundensatz den Bruttolohn, oder per Division den "virtuellen" Stundensatz bei Gehalt. Unter Umständen ist es ein Unterschied, ob ich 8888800 oder 0888880 arbeite. Kommt eben drauf an wieviele Mo, Di usw. im Monat anfallen. Wenn ich jetzt noch wüsste, wie man hier eine Access-Datei hochladen könnte, würde ich das mal glatt tun, falls jemand mal das gleiche oder ein ähnliches Problem hat.
Gefunden: Arbeitstage im Monat.zip