vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2019
 
zurück
Rubrik: Datum/Zeit und Timer · Datums- und Zeit-Funktionen   |   VB-Versionen: VB.NET18.02.05
Arbeitstage eines Monats (VB.NET)

Eine Klasse, die die Anzahl der Tage eines Monats ermittelt und zurückgibt.

Autor:   Joerg SchneiderBewertung:     [ Jetzt bewerten ]Views:  27.228 
ohne HomepageSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 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

Dieser Tipp wurde bereits 27.228 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!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.
 
   

Druckansicht Druckansicht Copyright ©2000-2019 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel