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

Brauche Tool ähnlich WORKDAY

Brauche Tool ähnlich WORKDAY
03.02.2006 09:52:23
Michael
Hallo,
hier etwas für echte Könner: ich muss ein Tool entwickeln, dass die Produktionstaktzeiten berechnet. Das muss also so aussehen: Do, 16:35 plus 7h und 25 min ergibt als nächste Taktzeit Fr., 14:00. (Wobei Schichtbeginn bzw. -ende 8:00 und 18:00 sind)
Wenn jetzt Freitag ein Feiertag wäre, müsste entsprechend Mo, 14:00 rauskommen. Problemstellung klar?
Das ganz sollte ich als Funktion habe und in einer Prozedur berechnen, aus diesem Grund kann ich WORKDAY nicht verwenden (Ich muss das ganze für tausende Zellen machen und kann dort keine Formeln reinschreiben, sonst wird die datei viel zu gross). WORKDAY kann überdies nur mit ganzen Tagen umgehen, ich brauche aber sogar Minuten.
Weiss jemand eine Lösung oder hat vielleicht den Quellcode von WORKDAY, den man anpassen kann?
Vielen Dank,
Michael

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
?
ransi
HAllo Michael
"Problemstellung klar?"
Nö.
Kannst du mal ein Beispiel machen was wo steht und was wo
wie warum gradeso berechnet werden soll?
Ich glaube dann wirds klarer.
ransi
AW: Klarer
03.02.2006 12:40:44
Michael
Ok,
ich versuche, es klarer zu machen:
WORKDAY(startdatum,x,feiertage) sagt dir, welcher arbeitstag x tage nach dem startdatum kommt. Berücksichtigt werden dabei Wochenenden sowie Feiertage.
das ist mir aber nicht genau genug, ich muss dieses Tool ausbauen, dass das ganze minutengenau funktioniert. Bespiel:
WORKMINUTE(startminute, x, feiertage) soll folgendes machen: startminute ist z.b. "mo, 13.2.2006 15:35". x ist "4 Stunden und 5 minuten". Die funktion soll mir jetzt für einen arbeiter sagen, wann der fertig ist. wenn er erst am montag abend angefangen hat, dienstag ein feiertag ist und er für den arbeitsschritt 4 stunden braucht ist er erst am mittwoch vormittag fertig. ich will jetzt genau diese zeit wissen. er arbeitet von 8:00 bos 18:00, überstunden macht er nicht.
Prinzip klar? WORKDAY ist schon so ähnlich, aber nicht fein genug.
Danke,
Michael
Anzeige
AW: Klarer
03.02.2006 14:51:34
Franz
Hallo Michael,
ich habe hier mal einen Anlauf genommen, eine entsprechende benutzerdefinierte Funktion zu schreiben. Die Feiertage und sonstige arbeitsfreien Tage werden dabei in eine separate Tabelle eingetragen und haben einen Bereichsnamen.
Die benutzerdefinierte Funktion kann sowohl direkt in der Tabelle verwendet werden als auch in einem Makro, das die Ergebnisse auf Basis der Taktzeiten berechnet und in die Tabelle einträgt.
Sub Taktzeiten()
'  Ermittelt aus den Taktzeiten jeweils Taktende und Taktbeginn und trägt die Werte in die Tabelle
'  Der Taktbeginn des 1. Taktes muß in der Tabelle vorgegeben werden!
Dim Daten As Range, Schichtbeginn As Date, Schichtende As Date
Set Daten = ActiveSheet.Range("A2:C" & ActiveSheet.UsedRange.Rows.Count)
Schichtbeginn = 8 / 24 'entspricht 08:00 Uhr
Schichtende = 18 / 24 ' entspricht 18:00 Uhr
For I = 1 To Daten.Rows.Count
Daten(I, 3) = Taktende(Daten(I, 1), Daten(I, 2), Schichtbeginn, Schichtende, Application.Range("Feiertage"))
If I < Daten.Rows.Count Then Daten(I + 1, 1) = Daten(I, 3)
Next I
End Sub
Function Taktende(Taktbeginn As Date, Taktzeit As Date, Schichtbeginn As Date, Schichtende As Date, Feiertage As Range) As Date
Dim Datum As Date, Arbeitstage As Integer, Restzeit As Date, Arbeitsfrei As Boolean
Dim I As Integer, J As Integer
Datum = Int(Taktbeginn) 'Datum des Taktbeginns
If Taktbeginn + Taktzeit <= Datum + Schichtende Then
'Takt wird am gleichen Tag vor Schichtende abgeschlossen
Taktende = Taktbeginn + Taktzeit
Exit Function
Else
'Takt wird an einem der folgenden Tage abgeschlossen
Restzeit = Taktzeit - (Datum + Schichtende - Taktbeginn)
' Arbeitstage für Restzeit
Arbeitstage = Int(Restzeit / (Schichtende - Schichtbeginn))
Taktende = Datum
For I = 0 To Arbeitstage
Taktende = Taktende + 1
Do
Arbeitsfrei = False
' Überprüfen auf Samstag oder Sonntag
If Application.WorksheetFunction.WeekDay(Taktende, 2) >= 6 Then
Arbeitsfrei = True
End If
' Überprüfen auf Feiertag
For J = 1 To Feiertage.Rows.Count
If Taktende = Feiertage(J, 1) Then
Arbeitsfrei = True
Exit For
End If
Next J
If Arbeitsfrei = True Then Taktende = Taktende + 1
Loop Until Arbeitsfrei = False
Next
Restzeit = Restzeit - Arbeitstage * (Schichtende - Schichtbeginn)
Taktende = Taktende + Restzeit + Schichtbeginn
End If
End Function

Als Hilfe hier eine kleine Beispiel-Datei mit den Makros:
https://www.herber.de/bbs/user/30628.xls
Gruß
Franz
Anzeige
Holla!
03.02.2006 15:19:21
Michael
Also,
ich schaue mir das gleich mal komplett durch, ich bin beeindruckt! vielen dank für den aufwand!
werde dann nochmal schreiben, wie es funktioniert.
gruss,
michael
AW: Klarer
03.02.2006 16:34:41
UweD
Hallo
vielleicht hilft dir das hier noch weiter, um die Feiertage zu berechnen.
kannst du ja (entsprechend angepasst) im anderen Makro aufrufen
FeierTag(DeinDatum, 0)
die 0 bewirkt, wenn kein Feiertag, wird "" zurückgegeben
bei 1 würde z.B. "gewöhnlicher Mittwoch" zurückgegeben

Public Function FeierTag(Datum As Date, N As Boolean) As String
Dim Jahr As Integer
Jahr = Year(Datum)
If (Jahr > 1904) And (Jahr < 2100) Then
Select Case Format$(Datum, "dd.mm")
' Gesetzliche Feiertage
Case "01.01": FeierTag = "Neujahr"
Case "06.01": FeierTag = "Heilige Drei Könige"
Case "01.05": FeierTag = "Tag der Arbeit"
Case "15.08":  FeierTag = "Mariä Himmelfahrt"
Case "03.10": FeierTag = "Tag der Deutschen Einheit"
Case "31.10": FeierTag = "Reformationstag"
Case "01.11": FeierTag = "Allerheiligen"
Case "24.12": FeierTag = "Heiligabend"
Case "25.12": FeierTag = "1. Weihnachtsfeiertag"
Case "26.12": FeierTag = "2. Weihnachtsfeiertag"
Case "31.12": FeierTag = "Sylvester"
Case Else
' Bewegliche Feste:
Select Case Datum - OsterSonntag(Datum)
Case -52: FeierTag = "Weiberfastnacht"
Case -48: FeierTag = "Rosenmontag"
Case -2:  FeierTag = "Karfreitag"
Case 0:  FeierTag = "Ostersonntag"
Case 1:  FeierTag = "Ostermontag"
Case 39:  FeierTag = "Christi Himmelfahrt"
Case 49:  FeierTag = "Pfingstsonntag"
Case 50:  FeierTag = "Pfingstmontag"
Case 60:  FeierTag = "Fronleichnam"
Case Else
If Datum = CDate("25.12." & Jahr) - Weekday("25.12." & Jahr, _
vbMonday) - 32 Then
FeierTag = "Buß- und Bettag"
Else
If N = True Then
FeierTag = "gewöhnlicher " & Format$(Datum, "DDDD") ' Kein Feiertag
ElseIf N = False Then
FeierTag = vbNullString ' Kein Feiertag
End If
End If
End Select
End Select
Else: FeierTag = vbNullString
End If
End Function
Public Function OsterSonntag(Datum As Date) As Date
Dim A As Integer, D As Integer, E As Integer, Jahr As Integer
Jahr = Year(Datum)
If (1904 < Jahr) And (Jahr < 2100) Then  ' Datum zulässig ?
A = Jahr Mod 19
D = (19 * A + 24) Mod 30
E = (2 * (Jahr Mod 4) + 4 * (Jahr Mod 7) + 6 * D + 5) Mod 7
OsterSonntag = CDate(DateSerial(Jahr, 3, 22 + D + E))
If Month(OsterSonntag) = 4 Then
If Day(OsterSonntag) = 26 Or (Day(OsterSonntag) = 25 And E = 6 And A > 10) Then
OsterSonntag = OsterSonntag - 7
End If
End If
End If
End Function

Gruß UweD
(Rückmeldung wäre schön)
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige