Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Monatliche Arbeitszeit ermitteln

Begonnen von itwebmaster, Oktober 19, 2020, 09:56:50

⏪ vorheriges - nächstes ⏩

itwebmaster

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?

MzKlMu

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.
Gruß Klaus

itwebmaster

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.

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

MzKlMu

#4
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.
Gruß Klaus

itwebmaster

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

itwebmaster

Er sollte die als Parameter übergebene Stundenzahl in der Variablen StdZ addieren. Macht er aber nicht. Ich habe keine Ahnung wieso nicht.

Beaker s.a.

Na ja, "woTa" bleibt ja nach der Deklarierung immer 0.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

itwebmaster

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

itwebmaster

Und gibt die exakten Soll-Stunden bzw. die zu bezahlenden Stunden pro Monat zurück.

MzKlMu

Hallo,
hast Du Dir eigentlich mal mein Beispeil in #4 angesehen ?
Gruß Klaus

itwebmaster

#11
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: Sie dürfen in diesem Board keine Dateianhänge sehen.