ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 17.06.2002

Diese Seite wurde zuletzt aktualisiert am 17.06.2002
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Werktagezählung

Zurück...


Anzeige

(-hg) mailto:hg_datediffworkdays@aboutvb.de

Die Visual Basic-Funktion DateDiff liefert Ihnen unter anderem auch die Differenz in Tagen zwischen zwei gegebenen Datumswerten. Wenn Sie allerdings nur die Zahl der Werktage in dem Zeitraum zwischen den Datumswerten ermitteln wollen, lässt sie diese an sich recht flexible Funktion im Stich.

Im Prinzip könnten Sie zwar die Anzahl der dazwischen liegenden Tage zunächst von DateDiff errechnen lassen und anschließend ebenso die Anzahl der Wochen. Für jede Woche könnten sie einen oder zwei Tage abziehen (je nach dem, ob Samstage als Werktage gelten sollen oder nicht). Allerdings ist es nicht ganz so einfach - vor allem die Ermittlung, ob in den verbleibenden Resttage, die keine ganze Woche ergeben, noch Nicht-Werktage enthalten sind und deswegen ebenfalls abgezogen werden müssen.

Der Ansatz ist allerdings im Prinzip richtig. Um das Ganze jedoch nicht unnötig zu verkomplizieren, treffen wir zunächst einige Annahmen und legen diese als Definitionen fest, die wir den zu ermittelnden Ergebnissen zugrunde legen.

Zunächst legen wir fest, dass wir auf die Zeitanteile der beiden Eck-Datumswerte verzichten wollen. Das erspart uns die Frage, ab welchem Stundenanteil ein Werktag noch oder schon als Werktag gewertet werden soll. Weiterhin beschränken wir uns darauf, nur eine positiv Differenz liefern zu wollen: Unabhängig davon, welcher von beiden gegebenen Datumswerten der kleinere ("ältere") und der größere ("jüngere") ist, wird immer der kleinere Wert als Anfangsdatum und der größere als Enddatum gesetzt. Diese Setzung erleichtert uns die schließlich letzte Definition, dass das Anfangsdatum gezählt wird, wenn es ein Werktag ist, das Enddatum jedoch nie gezählt wird. So beträgt etwa die Differenz zwischen einem Freitag und einem Samstag (wenn dieser kein Werktag sein soll) einen Werktag, und zwischen einem Freitag und einem Montag ebenso. Die Differenz zwischen einem Sonntag und einem Montag ergibt hingegen keinen Werktag.

Sie übergeben der Funktion DateDiffWorkdays die beiden Eckdatumswerte und legen im gegebenenfalls optionalen Parameter SaturdayIsWorkday mit der Übergabe von True fest, ob Samstage als Werktage gezählt werden sollen. Als Rückgabewert erhalten Sie gemäß den oben angeführten Festlegungen die Anzahl der Werktage. Die bei der VB-Funktion DateDiff optionale Angabe des ersten Wochentages und der Definition für die erste Woche eines Jahres erübrigt sich hier, da die Anzahl von Tagen zwischen zwei Datumswerten davon unberührt ist.

Public Function DateDiffWorkdays(Date1 As Date, Date2 As Date, _
 Optional ByVal SaturdayIsWorkday As Boolean) As Integer
  Dim nDay1 As Date
  Dim nDay2 As Date
  Dim nDays As Integer
  Dim nWeeks As Integer
  Dim nWeekday1 As Integer
  Dim nWeekday2 As Integer
  
  If Date1 < Date2 Then
    nDay1 = CDate(CLng(CDbl(Date1)))
    nDay2 = CDate(CLng(CDbl(Date2)))
  Else
    nDay1 = CDate(CLng(CDbl(Date2)))
    nDay2 = CDate(CLng(CDbl(Date1)))
  End If
  nDays = nDay2 - nDay1
  nWeeks = nDays \ 7
  nWeekday1 = Weekday(nDay1, vbMonday)
  nWeekday2 = Weekday(nDay2, vbMonday)
  If SaturdayIsWorkday Then
    nDays = nDays - nWeeks
    Select Case nWeekday1
      Case 7
        Select Case nWeekday2
          Case 7
          Case Else
            nDays = nDays - 1
        End Select
      Case Else
        Select Case nWeekday2
          Case 7
          Case Else
            If nWeekday1 > nWeekday2 Then
              nDays = nDays - 1
            End If
        End Select
    End Select
  Else
    nDays = nDays - 2 * nWeeks
    Select Case nWeekday1
      Case 6
        Select Case nWeekday2
          Case 7
            nDays = nDays - 1
          Case Else
            nDays = nDays - 2
        End Select
      Case 7
        Select Case nWeekday2
          Case Is < 7
            nDays = nDays - 1
        End Select
      Case Else
        Select Case nWeekday2
          Case 6
          Case 7
            nDays = nDays - 1
          Case Else
            If nWeekday1 > nWeekday2 Then
              nDays = nDays - 2
            End If
        End Select
    End Select
  End If
  DateDiffWorkdays = nDays
End Function

Modul modDateDiffWorkdays (datediffworkdays.zip - ca. 0,8 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikels

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche




Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer