Rubrik: Datum/Zeit und Timer · Datums- und Zeit-Funktionen | VB-Versionen: VB.NET | 18.02.05 |
Arbeitstage eines Monats (VB.NET) Eine Klasse, die die Anzahl der Tage eines Monats ermittelt und zurückgibt. | ||
Autor: Joerg Schneider | Bewertung: | Views: 29.815 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Dieser Code ist eine Umsetzung des Beitrages von Hermann Röttger Bewegliche Feiertage und Arbeitstage eines Monats von VB6 nach VB.NET.
Die Form im nachfolgenden Beispiel dient lediglich der Eingabe des Datums! Alle Berechnungen werden in der Klasse ausgeführt und sind über dessen Funktionen bzw. Variablen abrufbar! Man bräuchte also nur die Klasse einbinden.
Das Klassenmodul
Imports Microsoft.VisualBasic.DateAndTime Public Class Class1 Public arbtage As Integer Public monatstage(11) As Integer Public Property arbeitstage_imjahr(ByVal zahl As Integer) As Integer Get Return monatstage(zahl) End Get Set(ByVal anz As Integer) End Set End Property Public Property arbeitstage_immonat() As Integer Get Return arbtage End Get Set(ByVal anz As Integer) End Set End Property Public Function Ostern(ByVal x As Integer) As Date Dim K, M, S, D, R, A, OG, SZ, OE, OSI As Integer Dim OS1 As Double Dim OS2 As String K = Int(x / 100) M = 15 + Int((3 * K + 3) / 4) - Int((8 * K + 13) / 25) S = 2 - Int((3 * K + 3) / 4) A = x Mod 19 D = (19 * A + M) Mod 30 R = Int(D / 29) + (Int(D / 28) - Int(D / 29)) * Int(A / 11) OG = 21 + D - R SZ = 7 - (x + Int(x / 4) + S) Mod 7 OE = 7 - (OG - SZ) Mod 7 OSI = ((OG + OE) - 1) OS2 = "01.03." & x OS2 = CDate(OS2) Dim da As New Date da = OS2 OS1 = CType(da.ToOADate(), Double) OS1 = CType(da.ToOADate(), Double) OS1 = OS1 + OSI Ostern = CType(Date.FromOADate(OS1), Date) End Function Public Function arbeitstag(ByVal x As Date) As Boolean Dim feiertage(12) As Date Dim feiertag As String Dim jahr, SaSo, Arbeitst, i As Integer jahr = CInt(Format(x, "yyyy")) SaSo = CInt(Weekday(x)) arbeitstag = True If (SaSo = 1 Or SaSo = 7) Then arbeitstag = False Else feiertage(1) = DateAdd(DateInterval.Day, -2, Ostern(jahr)) feiertage(2) = DateAdd(DateInterval.Day, +1, Ostern(jahr)) feiertage(3) = DateAdd(DateInterval.Day, +50, Ostern(jahr)) feiertage(4) = DateAdd(DateInterval.Day, +39, Ostern(jahr)) feiertage(5) = DateAdd(DateInterval.Day, +60, Ostern(jahr)) feiertage(6) = (CDate("01.01." & jahr)) feiertage(7) = (CDate("01.05." & jahr)) feiertage(8) = (CDate("03.10." & jahr)) feiertage(9) = (CDate("01.11." & jahr)) feiertage(10) = (CDate("25.12." & jahr)) feiertage(11) = (CDate("26.12." & jahr)) For i = 1 To 11 If x = feiertage(i) Then arbeitstag = False Exit For End If Next End If End Function Public Function arbeitstage(ByVal x As Date, ByVal zahl As Integer) Dim tage, m, anz, i As Integer Dim wert As String ' unterscheiden, ob Jahres oder Monatsberechnung ' anhand Parameter "zahl" Select Case zahl Case 1 ' jeden Monat durchlaufen For m = 1 To 12 Dim datum As New Date datum = "#01/" & m & "/" & Year(x) & "#" ' Anzahl der Tage im Monat ermitteln tage = x.DaysInMonth(Year(x), Month(datum)) anz = 0 ' alle Tage überprüfen ob Arbeitstag! For i = 1 To tage wert = "#" & i & "/" & m & "/" & Year(x) & "#" If arbeitstag(wert) Then anz = anz + 1 End If Next ' Anzahl der Arbeitstage im Array speichern monatstage(m - 1) = anz Next Case 2 ' Anzahl der Tage im Monat ermitteln tage = x.DaysInMonth(Year(x), Month(x)) ' alle Tage überprüfen ob Arbeitstag! For i = 1 To tage wert = "#" & i & "/" & Month(x) & "/" & Year(x) & "#" If arbeitstag(wert) Then anz = anz + 1 End If Next ' Anzahl der Arbeitstage speichern arbtage = anz End Select End Function End Class
Beispiel für die Anwendung/Aufruf der Klasse
Benötigen Sie nachfolgende Controls auf die Form:
- Label (Label1)
- TextBox (TextBox1)
- CommandButton (Button1)
Die TextBox dient der Eingabe für Monat/Jahr bzw. nur Jahr. Beim Klick auf den Button werden demzufolge die Anzahl der Arbeitstage entweder für den eingegeben Monat oder der Reihe nach für alle Monate des Jahrs ermittelt.
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Label1.Text = "Geben Sie das Jahr bzw. Monat und Jahr im Format (mm/jjjj) ein!" TextBox1.Text = "" Button1.Text = "Arbeitstage errechnen" End Sub Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click If TextBox1.Text = "" Then Exit Sub Dim arb As New Class1 Dim eingabe As String Dim datum As Date Dim i As Integer eingabe = TextBox1.Text ' hier wird anhand der Länge des eingegebenen Textes unterschieden ' (01.2005 oder 2004), ob die Arbeitstage für einen Monat ' oder für das ganze Jahr berechnet werden soll Select Case eingabe.Length Case 4 Try datum = "#01/01/" & TextBox1.Text & "#" If IsDate(datum) Then arb.arbeitstage(datum, 1) ' Parameter 1 steht für Jahresberechnung For i = 0 To 11 MsgBox(arb.arbeitstage_imjahr(i)) Next End If Catch ex As Exception TextBox1.ResetText() Exit Sub End Try Case 7 Try datum = "#01/" & TextBox1.Text & "#" If IsDate(datum) Then arb.arbeitstage(datum, 2) ' Parameter 2 steht für Monatsberechnung MsgBox(arb.arbeitstage_immonat) End If Catch ex As Exception TextBox1.ResetText() Exit Sub End Try Case Else TextBox1.ResetText() End Select End Sub