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
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 Dieser Tipp wurde bereits 29.811 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
Neu! sevCoolbar 3.0 Professionelle Toolbars im modernen Design! Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 TOP Entwickler-Paket TOP-Preis!! Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR... |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |