<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: vba code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sun, 07 Sep 2008 11:24:08 GMT</pubDate>
    <description>DZone Snippets: vba code</description>
    <item>
      <title>feiertage berechnen / calculate holidays</title>
      <link>http://snippets.dzone.com/posts/show/4409</link>
      <description>// noch nicht fertig&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Option Compare Database&lt;br /&gt;&lt;br /&gt;    'zun&#228;chst auf Modulebene im Klassenmodul definiert,&lt;br /&gt;        'und zwar als dynamisches Array des Typs FTag&lt;br /&gt;Dim arrFTage() As FTag&lt;br /&gt;Dim typFTag As FTag&lt;br /&gt;&lt;br /&gt;    'Da &#246;ffentliche Datentypen in Klassenmodulen nicht zul&#228;ssig sind,&lt;br /&gt;        'm&#252;ssen Sie hier zwingend das Schl&#252;sselwort Private verwenden&lt;br /&gt;Private Type FTag&lt;br /&gt;    Tag As Byte&lt;br /&gt;    Monat As Byte&lt;br /&gt;    Name As String&lt;br /&gt;    Land As String&lt;br /&gt;End Type&lt;br /&gt;&lt;br /&gt;'Klassenmodul ein und setzen dessen Name Eigenschaft auf clsFeiertage&lt;br /&gt;    'Innerhalb der Klasse erstellen Sie eine &#246;ffentliche Funktion&lt;br /&gt;    'Ostersonntag(), der Sie als Parameter die Jahreszahl &#252;bergeben&lt;br /&gt;    'Damit ist schon die erste Variable der Formel bekannt.&lt;br /&gt;Public Function Ostersonntag(lngJahr As Long) As Variant&lt;br /&gt;&lt;br /&gt;Dim strFehler As String&lt;br /&gt;Dim lngTag As Long&lt;br /&gt;Dim bytMonat As Byte&lt;br /&gt;Dim bytA As Byte&lt;br /&gt;Dim bytB As Byte&lt;br /&gt;Dim bytM As Byte&lt;br /&gt;Dim bytN As Byte&lt;br /&gt;Dim lngE As Long&lt;br /&gt;Dim lngD As Long&lt;br /&gt;&lt;br /&gt;    'Berechnen von A, B und C&lt;br /&gt;bytA = lngJahr Mod 19&lt;br /&gt;bytB = lngJahr Mod 4&lt;br /&gt;bytC = lngJahr Mod 7&lt;br /&gt;    'Ermitteln von M und N&lt;br /&gt;bytM = 0&lt;br /&gt;bytN = 0&lt;br /&gt;    'gem&#228;&#223; der "Tabelle" in getMundN berechnet und zur&#252;ckgibt&lt;br /&gt;strFehler = getMundN(bytM, bytN, lngJahr)&lt;br /&gt;&lt;br /&gt;If strFehler = "" Then&lt;br /&gt;        'Berechnung fortsetzen&lt;br /&gt;        'Berechnen von D&lt;br /&gt;    lngD = ((19 * bytA) + bytM) Mod 30&lt;br /&gt;    lngE = ((2 * bytB) + (4 * bytC) + (6 * lngD) + bytN) Mod 7&lt;br /&gt;        'Tag berechnen&lt;br /&gt;    lngTag = 22 + lngD + lngE&lt;br /&gt;        'Ausnahmen pr&#252;fen&lt;br /&gt;        'Ist Ostersonntag gr&#246;&#223;er als 31, f&#228;llt Ostern in den April.&lt;br /&gt;        'Der Tag wird dann wie folgt berechnet: Ostersonntag =D+E-9.&lt;br /&gt;    If lngTag &gt; 31 Then&lt;br /&gt;        bytMonat = 4&lt;br /&gt;        lngTag = lngD + lngE - 9&lt;br /&gt;        &lt;br /&gt;            'weitere Ausnahmen pr&#252;fen&lt;br /&gt;        If lngTag = 26 Then&lt;br /&gt;                'Ist Ostersonntag der 26. April f&#228;llt Ostern&lt;br /&gt;                'auf den 19. April&lt;br /&gt;            lngTag = 19&lt;br /&gt;        ElseIf lngTag = 25 Then&lt;br /&gt;                'Ist Ostersonntag der 25. April und gleichzeitig&lt;br /&gt;                'A &gt; 10 und D = 28, dann ist Ostersonntag der 18. April&lt;br /&gt;            If (bytA &gt; 10) And (bytB = 28) Then&lt;br /&gt;                lngTag = 18&lt;br /&gt;            End If&lt;br /&gt;        End If&lt;br /&gt;        &lt;br /&gt;    Else&lt;br /&gt;    &lt;br /&gt;        bytMonat = 3&lt;br /&gt;    End If&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;    'G&#252;ltigkeitspr&#252;fung durchf&#252;hren&lt;br /&gt;    'Pr&#252;fen, ob das Datum g&#252;ltig ist.&lt;br /&gt;If (bytMonat &gt; 0) And (lngTag &gt; 0) Then&lt;br /&gt;&lt;br /&gt;    Ostersonntag = DateSerial(lngJahr, bytMonat, lngTag)&lt;br /&gt;    &lt;br /&gt;        'pr&#252;fen, ob das berechnete Datum ein Sonntag ist.&lt;br /&gt;    If Weekday(Ostersonntag, vbSunday) &gt; 1 Then&lt;br /&gt;    &lt;br /&gt;        strFehler = "Berechnungsfehler: Ostersonntag " &amp; _&lt;br /&gt;         "liegt nicht an einem Sonntag!"&lt;br /&gt;        &lt;br /&gt;        Ostersonntag = strFehler &amp; vbCrLf &amp; "Berechnungergebnis: " _&lt;br /&gt;         &amp; Format(Ostersonntag, "dd.MM.yyyy", vbSunday)&lt;br /&gt;    End If&lt;br /&gt;Else&lt;br /&gt;&lt;br /&gt;    Ostersonntag = strFehler&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Private Function getMundN(ByRef bytM As Byte, ByRef bytN As Byte, _&lt;br /&gt; lngJahr As Long) As String&lt;br /&gt; &lt;br /&gt;getMundN = ""&lt;br /&gt;&lt;br /&gt;Select Case lngJahr&lt;br /&gt;    Case 1582 To 1699:&lt;br /&gt;        bytM = 22&lt;br /&gt;        bytN = 2&lt;br /&gt;    Case 1700 To 1799:&lt;br /&gt;        bytM = 23&lt;br /&gt;        bytN = 3&lt;br /&gt;    Case 1800 To 1899:&lt;br /&gt;        bytM = 23&lt;br /&gt;        bytN = 4&lt;br /&gt;    Case 1900 To 2099:&lt;br /&gt;        bytM = 24&lt;br /&gt;        bytN = 5&lt;br /&gt;    Case 2100 To 2199:&lt;br /&gt;        bytM = 24&lt;br /&gt;        bytN = 6&lt;br /&gt;    Case 2200 To 2299:&lt;br /&gt;        bytM = 25&lt;br /&gt;        bytN = 0&lt;br /&gt;    Case 2300 To 2399:&lt;br /&gt;        bytM = 26&lt;br /&gt;        bytN = 1&lt;br /&gt;    Case 2400 To 2499:&lt;br /&gt;        bytM = 25&lt;br /&gt;        bytN = 1&lt;br /&gt;Case Else&lt;br /&gt;    getMundN = "Die Jahreszahl muss zwischen 1581 und 2500 liegen!"&lt;br /&gt;End Select&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Public Function Ostermontag(lngJahr As Long) As Variant&lt;br /&gt;    Dim varTemp As Variant&lt;br /&gt;    varTemp = Ostersonntag(lngJahr)&lt;br /&gt;    If IsDate(varTemp) Then&lt;br /&gt;        Ostermontag = DateAdd("d", 1, varTemp)&lt;br /&gt;    Else&lt;br /&gt;        Ostermontag = varTemp 'Fehlermeldung zur&#252;ckgeben&lt;br /&gt;    End If&lt;br /&gt;End Function&lt;br /&gt;Public Function Karfreitag(lngJahr As Long) As Variant&lt;br /&gt;    Dim varTemp As Variant&lt;br /&gt;    varTemp = Ostersonntag(lngJahr)&lt;br /&gt;    If IsDate(varTemp) Then&lt;br /&gt;        Karfreitag = DateAdd("d", -2, varTemp)&lt;br /&gt;    Else&lt;br /&gt;        Karfreitag = varTemp 'Fehlermeldung zur&#252;ckgeben&lt;br /&gt;    End If&lt;br /&gt;End Function&lt;br /&gt;Public Function Pfingstsonntag(lngJahr As Long) As Variant&lt;br /&gt;    Dim varTemp As Variant&lt;br /&gt;    varTemp = Ostersonntag(lngJahr)&lt;br /&gt;    If IsDate(varTemp) Then&lt;br /&gt;        Pfingstsonntag = DateAdd("d", 49, varTemp)&lt;br /&gt;    Else&lt;br /&gt;        Pfingstsonntag = varTemp 'Fehlermeldung zur&#252;ckgeben&lt;br /&gt;    End If&lt;br /&gt;End Function&lt;br /&gt;Public Function Pfingstmontag(lngJahr As Long) As Variant&lt;br /&gt;    Dim varTemp As Variant&lt;br /&gt;    varTemp = Ostersonntag(lngJahr)&lt;br /&gt;    If IsDate(varTemp) Then&lt;br /&gt;        Pfingstmontag = DateAdd("d", 50, varTemp)&lt;br /&gt;    Else&lt;br /&gt;        fingstmontag = varTemp 'Fehlermeldung zur&#252;ckgeben&lt;br /&gt;    End If&lt;br /&gt;End Function&lt;br /&gt;Public Function Rosenmontag(lngJahr As Long) As Variant&lt;br /&gt;    Dim varTemp As Variant&lt;br /&gt;    varTemp = Ostersonntag(lngJahr)&lt;br /&gt;    If IsDate(varTemp) Then&lt;br /&gt;        Rosenmontag = DateAdd("d", -48, varTemp)&lt;br /&gt;    Else&lt;br /&gt;        Rosenmontag = varTemp 'Fehlermeldung zur&#252;ckgeben&lt;br /&gt;    End If&lt;br /&gt;End Function&lt;br /&gt;Public Function Fastnacht(lngJahr As Long) As Variant&lt;br /&gt;    Dim varTemp As Variant&lt;br /&gt;    varTemp = Ostersonntag(lngJahr)&lt;br /&gt;    If IsDate(varTemp) Then&lt;br /&gt;        Fastnacht = DateAdd("d", -47, varTemp)&lt;br /&gt;    Else&lt;br /&gt;        Fastnacht = varTemp 'Fehlermeldung zur&#252;ckgeben&lt;br /&gt;    End If&lt;br /&gt;End Function&lt;br /&gt;Public Function Aschermittwoch(lngJahr As Long) As Variant&lt;br /&gt;    Dim varTemp As Variant&lt;br /&gt;    varTemp = Ostersonntag(lngJahr)&lt;br /&gt;    If IsDate(varTemp) Then&lt;br /&gt;        Aschermittwoch = DateAdd("d", -46, varTemp)&lt;br /&gt;    Else&lt;br /&gt;        Aschermittwoch = varTemp 'Fehlermeldung zur&#252;ckgeben&lt;br /&gt;    End If&lt;br /&gt;End Function&lt;br /&gt;Public Function Himmelfahrt(lngJahr As Long) As Variant&lt;br /&gt;    Dim varTemp As Variant&lt;br /&gt;    varTemp = Ostersonntag(lngJahr)&lt;br /&gt;    If IsDate(varTemp) Then&lt;br /&gt;        Himmelfahrt = DateAdd("d", 39, varTemp)&lt;br /&gt;    Else&lt;br /&gt;        Himmelfahrt = varTemp 'Fehlermeldung zur&#252;ckgeben&lt;br /&gt;    End If&lt;br /&gt;End Function&lt;br /&gt;Public Function Fronleichnam(lngJahr As Long) As Variant&lt;br /&gt;        Dim varTemp As Variant&lt;br /&gt;        varTemp = Ostersonntag(lngJahr)&lt;br /&gt;    If IsDate(varTemp) Then&lt;br /&gt;        Fronleichnam = DateAdd("d", 60, varTemp)&lt;br /&gt;    Else&lt;br /&gt;        Fronleichnam = varTemp 'Fehlermeldung zur&#252;ckgeben&lt;br /&gt;    End If&lt;br /&gt;End Function&lt;br /&gt;'############################################################&lt;br /&gt;    'Zum Lesen der Datei reicht eine private Prozedur,&lt;br /&gt;        'der Sie den Dateinamen einschlie&#223;lich des Pfads&lt;br /&gt;        'der Textdatei &#252;bergeben&lt;br /&gt;Private Sub FeiertageLesen(strDateiname As String)&lt;br /&gt;&lt;br /&gt;Dim lngDatei As Long&lt;br /&gt;Dim strFehler As String&lt;br /&gt;Dim strZeile As String&lt;br /&gt;Dim varZeile As Variant&lt;br /&gt;Dim lngZeile As Long&lt;br /&gt;&lt;br /&gt;On Error GoTo FEHLER&lt;br /&gt;&lt;br /&gt;lngDatei = FreeFile()&lt;br /&gt;&lt;br /&gt;    ' Datei &#246;ffnen.&lt;br /&gt;Open strDateiname For Input As #lngDatei&lt;br /&gt;&lt;br /&gt;    'Auslesen der Eintr&#228;ge und einf&#252;gen in das Array&lt;br /&gt;ReDim arrFTage(1)&lt;br /&gt;lngZeile = -1&lt;br /&gt;&lt;br /&gt;    'lesen sie in einer Schleife zeilenweise aus&lt;br /&gt;    'Schleife bis Dateiende.&lt;br /&gt;Do While Not EOF(lngDatei)&lt;br /&gt;    Input #lngDatei, strZeile&lt;br /&gt;    &lt;br /&gt;    If Trim(strZeile) &gt; "" Then&lt;br /&gt;        On Error Resume Next&lt;br /&gt;        &lt;br /&gt;            'Jede Zeile splitten Sie mit Hilfe der Split-Funktion in ein Array&lt;br /&gt;        varZeile = Split(strZeile, ";")&lt;br /&gt;        &lt;br /&gt;        typFTag.Tag = varZeile(0)&lt;br /&gt;        typFTag.Monat = varZeile(1)&lt;br /&gt;        typFTag.Name = varZeile(2)&lt;br /&gt;        typFTag.Land = varZeile(3)&lt;br /&gt;        &lt;br /&gt;        On Error GoTo FEHLER&lt;br /&gt;    &lt;br /&gt;    End If&lt;br /&gt;    &lt;br /&gt;        'Array vergr&#246;&#223;ern&lt;br /&gt;    lngZeile = lngZeile + 1&lt;br /&gt;    arrFTage(lngZeile) = typFTag&lt;br /&gt;    ReDim Preserve arrFTage(UBound(arrFTage) + 1)&lt;br /&gt;    Debug.Print strZeile&lt;br /&gt;Loop&lt;br /&gt;&lt;br /&gt;Close #lngDatei&lt;br /&gt;&lt;br /&gt;    'Texdatei &#246;ffnen&lt;br /&gt;Exit Sub&lt;br /&gt;&lt;br /&gt;'---------------------------------------------------------&lt;br /&gt;FEHLER:&lt;br /&gt;&lt;br /&gt;If Err.Number = 52 Then&lt;br /&gt;    strFehler = "Die Datei " &amp; strDateiname &amp; _&lt;br /&gt;    " ist nicht vorhanden oder kann nicht ge&#246;ffnet werden!"&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;    'Debug.Print Err.Number &amp; ": " &amp; Err.Description&lt;br /&gt;If strFehler &gt; "" Then&lt;br /&gt;    On Error Resume Next&lt;br /&gt;    MsgBox strFehler&lt;br /&gt;    Close #lngDatei&lt;br /&gt;    Exit Sub&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Public Function FixFeiertag(datDatum As Date, _&lt;br /&gt;    strDateiname As String, Optional strLand) As String&lt;br /&gt;    &lt;br /&gt;    'Pr&#252;ft ob es sich bei dem Datum um einen fixen Feiertag handelt&lt;br /&gt;    'Falls ja, wird der Name des Feiertags zur&#252;ckgegeben&lt;br /&gt;    &lt;br /&gt;Dim bytFehler As Byte&lt;br /&gt;Dim bytTag As Byte&lt;br /&gt;Dim bytMonat As Byte&lt;br /&gt;Dim lngZage&lt;br /&gt;&lt;br /&gt;bytFehler = 0&lt;br /&gt;FixFeiertag = ""&lt;br /&gt;&lt;br /&gt;On Error GoTo FEHLER&lt;br /&gt;&lt;br /&gt;    'Array durchsuchen&lt;br /&gt;        'weil bei einem noch nicht initialisierten Array&lt;br /&gt;        'das Abrufen der oberen Indexgrenze mit ubound einen&lt;br /&gt;        'Laufzeitfehler verursacht.&lt;br /&gt;If UBound(arrFTage) &gt;= 0 Then&lt;br /&gt;        'zun&#228;chst aus dem Parameter datDatum der Tag&lt;br /&gt;            'und der Monat ermittelt und in zwei Variablen gespeichert&lt;br /&gt;    bytTag = Day(datDatum)&lt;br /&gt;    bytMonat = Month(datDatum)&lt;br /&gt;    &lt;br /&gt;        'Danach durchl&#228;uft eine Schleife das Array.&lt;br /&gt;            'F&#252;r den Fall, dass der optionale Parameter strLand&lt;br /&gt;            'nicht &#252;bergeben wurde, wird nur gepr&#252;ft,&lt;br /&gt;            'ob Monat und Tag des aktuellen Array-Eintrags mit den Werten&lt;br /&gt;            'in den beiden Variablen &#252;bereinstimmen&lt;br /&gt;        'Wird zus&#228;tzlich das Land angegeben, wird auch dieses in die Pr&#252;fung einbezogen.&lt;br /&gt;    For lngZeile = LBound(arrFTage) To UBound(arrFTage)&lt;br /&gt;        typFTag = arrFTage(lngZeile)&lt;br /&gt;        &lt;br /&gt;        If IsMissing(strLand) Then&lt;br /&gt;        &lt;br /&gt;            If (bytTag = typFTag.Tag) _&lt;br /&gt;            And (bytMonat = typFTag.Monat) Then&lt;br /&gt;                    'der Name des Feiertags als R&#252;ckgabewert festgelegt&lt;br /&gt;                FixFeiertag = typFTag.Name&lt;br /&gt;                Exit For&lt;br /&gt;            End If&lt;br /&gt;            &lt;br /&gt;        Else&lt;br /&gt;    &lt;br /&gt;            If (bytTag = typFTag.Tag) _&lt;br /&gt;            And (bytMonat = typFTag.Monat) _&lt;br /&gt;            And (strLand = typFTag.Land) Then&lt;br /&gt;                    'der Name des Feiertags als R&#252;ckgabewert festgelegt&lt;br /&gt;                FixFeiertag = typFTag.Name&lt;br /&gt;                Exit For&lt;br /&gt;            End If&lt;br /&gt;            &lt;br /&gt;        End If&lt;br /&gt;        &lt;br /&gt;    Next lngZeile ' &lt;- befindet sich im For oder nicht?&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;Exit Function&lt;br /&gt;&lt;br /&gt;'---------------------------------------------------------&lt;br /&gt;FEHLER:&lt;br /&gt;    'Ist dies die Zahl 9, war das Array noch nicht initialisiert&lt;br /&gt;        'und die Prozedur FeiertageLesen wird aufgerufen&lt;br /&gt;bytFehler = bytFehler + 1&lt;br /&gt;If Err.Number = 9 Then&lt;br /&gt;    If bytFehler = 1 Then&lt;br /&gt;        FeiertageLesen strDateiname&lt;br /&gt;        Resume&lt;br /&gt;    Else&lt;br /&gt;        Exit Function&lt;br /&gt;    End If&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'Methoden zum Erfassen von Feiertagen&lt;br /&gt;'Wenn Sie dem Benutzer der Anwendung, der die Klasse verwendet,&lt;br /&gt;'die M&#246;glichkeit geben m&#246;chten, feste Feiertage &#252;ber ein Formular&lt;br /&gt;'oder eine UserForm zu erfassen, sollten Sie dazu schon in der&lt;br /&gt;'Klasse eine Methode vorsehen, die an die Textdatei eine Zeile&lt;br /&gt;'mit neuen Werten anh&#228;ngt. Diese Methode soll hier&lt;br /&gt;'FeierTagSchreiben lauten (Listing 4). Ihr &#252;bergeben Sie die zu&lt;br /&gt;'schreibenden Werte f&#252;r die einzelne Spalte sowie den Dateinamen&lt;br /&gt;'und den Pfad der Textdatei. Die Methode schreibt diese Daten&lt;br /&gt;'dann in die Textdatei.&lt;br /&gt;Public Sub FeierTagSchreiben(strDateiname As String, _&lt;br /&gt; bytTag As Byte, bytMonat As Byte, strName As String, strLand As String)&lt;br /&gt;&lt;br /&gt;Dim lngDatei As Long&lt;br /&gt;Dim strFehler As String&lt;br /&gt;Dim strZeile As String&lt;br /&gt;Dim varZeile As Variant&lt;br /&gt;Dim lngZeile As Long&lt;br /&gt;Dim bytFehler As Byte&lt;br /&gt;bytFehler = 0&lt;br /&gt;&lt;br /&gt;On Error GoTo FEHLER&lt;br /&gt;&lt;br /&gt;lngDatei = FreeFile()&lt;br /&gt;    'Datei &#246;ffnen.&lt;br /&gt;Open strDateiname For Append As #lngDatei&lt;br /&gt;    'Textdatei &#246;ffnen und Daten schreiben&lt;br /&gt;Print #lngDatei, bytTag &amp; ";" &amp; bytMonat &amp; ";" &amp; strName &amp; ";" &amp; strLand&lt;br /&gt;Close #lngDatei&lt;br /&gt;&lt;br /&gt;Exit Sub&lt;br /&gt;&lt;br /&gt;'---------------------------------------------------------&lt;br /&gt;FEHLER:&lt;br /&gt;bytFehler = bytFehler + 1&lt;br /&gt;If Err.Number = 52 Then&lt;br /&gt;    strFehler = "Die Datei " &amp; strDateiname &amp; _&lt;br /&gt;     " ist nicht vorhanden oder kann nicht ge&#246;ffnet werden!"&lt;br /&gt;ElseIf Err.Number = 55 Then&lt;br /&gt;    If bytFehler &lt; 5 Then&lt;br /&gt;        Resume&lt;br /&gt;    Else&lt;br /&gt;        strFehler = "In die Datei konnte nicht geschrieben werden!"&lt;br /&gt;    End If&lt;br /&gt;End If&lt;br /&gt;        &lt;br /&gt;If strFehler &gt; "" Then&lt;br /&gt;    On Error Resume Next&lt;br /&gt;    MsgBox strFehler&lt;br /&gt;    Close #lngDatei&lt;br /&gt;    &lt;br /&gt;    Exit Sub&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 10 Aug 2007 14:31:42 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4409</guid>
      <author>berot3 (berot3)</author>
    </item>
  </channel>
</rss>
