Addieren von Tagen zu einem Datum unter Berücksichtigung von Feiertagen und Wochenenden

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Addieren von Tagen zu einem Datum unter Berücksichtigung von Feiertagen und Wochenenden

    Hallo zusammen,

    ich überlege gerade wie ich , zu einem Datum entsprechend die Werktage anrechnen kann.

    also z.B zum 1.Mai 30 Werktage anrechenn müsste das ergebniss der 14.06 sein ( wenn man die wochenenden und die 2 Feiertage ausschlieest )
    ich finde dafür für mich kein ansatz wie man es umsetzen kann ?

    Ich danke schonmal für den gedanken kick den ich brauche.
    @TheDoctorWho Das musst Du elementar implementieren.
    Du brauchst eine Funktion IsWerktag(DATUM As DateTime).
    Dort testest Du ab, ob es Sonnabend oder Sonntag ist (das kann DateTime).
    Danach testest Du die Feiertage, das ist etwas tricky.
    Bewegliche Feiertage, 1. Mai, 3. Oktober usw. packst Du in eine Liste (ja, dies sind bewegliche Feiertage!).
    Feste Feiertage: Dazu müsstest Du den Osterkalender von Gauss implementieren (msdn.microsoft.com/de-de/library/bb979477.aspx)
    testen und feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Für die Berechnung von Feiertagen hab ich mal ne hübsche Klasse gefunden!

    Hier ist sie:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Feiertage
    3. Public Enum Feiertage
    4. ftNeujahr = 1
    5. ftErscheinungsfest = 2
    6. ftKarfreitag = 3
    7. ftOstersonntag = 4
    8. ftOstermontag = 5
    9. ftMaifeiertag = 6
    10. ftChristiHimmelfahrt = 7
    11. ftPfingstmontag = 8
    12. ftFronleichnam = 9
    13. ftMariaeHimmelfahrt = 10
    14. ftTagDerEinheit = 11
    15. ftReformationstag = 12
    16. ftAllerheiligen = 13
    17. ftBussUndBettag = 14
    18. ftWeihnachtsfeiertag1 = 15
    19. ftWeihnachtsfeiertag2 = 16
    20. End Enum
    21. Public Enum Bundeslaender
    22. blBadenWuerttemberg = CInt(2 ^ 0)
    23. blBayern = CInt(2 ^ 1)
    24. blBerlin = CInt(2 ^ 2)
    25. blBrandenburg = CInt(2 ^ 3)
    26. blBremen = CInt(2 ^ 4)
    27. blHamburg = CInt(2 ^ 5)
    28. blHessen = CInt(2 ^ 6)
    29. blMecklenburgVorpommern = CInt(2 ^ 7)
    30. blNiedersachsen = CInt(2 ^ 8)
    31. blNordrheinWestfalen = CInt(2 ^ 9)
    32. blRheinlandPfalz = CInt(2 ^ 10)
    33. blSaarland = CInt(2 ^ 11)
    34. blSachsen = CInt(2 ^ 12)
    35. blSachsenAnhalt = CInt(2 ^ 13)
    36. blSchleswigHolstein = CInt(2 ^ 14)
    37. blThueringen = CInt(2 ^ 15)
    38. End Enum
    39. Public Shared Function Ostersonntag(ByVal Jahr As Long) As Date
    40. ' Osterfunktion nach Carl Friedrich Gauß (1800). Rückgabewert
    41. ' ist das Datum des Ostersonntags im angegebenen (ersatzweise:
    42. ' aktuellen) Jahr. Gültigkeitsbereich: 1583 - 8702 (auf das
    43. ' Auslösen von Laufzeitfehlern bei Unter- oder Überschreitung
    44. ' dieses Gültigkeitsbereichs wird hier absichtlich verzichtet).
    45. Dim a As Long, b As Long, c As Long, d As Long, e As Long, f As Long
    46. ' Die "magische" Gauss-Formel anwenden:
    47. a = Jahr Mod 19
    48. b = Jahr \ 100
    49. c = (8 * b + 13) \ 25 - 2
    50. d = b - (Jahr \ 400) - 2
    51. e = (19 * (Jahr Mod 19) + ((15 - c + d) Mod 30)) Mod 30
    52. If e = 28 Then
    53. If a > 10 Then
    54. e = 27
    55. End If
    56. ElseIf e = 29 Then
    57. e = 28
    58. End If
    59. f = (d + 6 * e + 2 * (Jahr Mod 4) + 4 * (Jahr Mod 7) + 6) Mod 7
    60. ' Rückgabewert als Datum bereitstellen
    61. Ostersonntag = DateSerial(CInt(Jahr), 3, CInt(e + f + 22))
    62. End Function
    63. Public Shared Function Feiertagsdatum(ByVal Feiertag As Feiertage, ByVal Jahr As Integer) As Date
    64. ' Gibt das Datum eines datumsfesten oder beweglichen Feiertags zurück.
    65. ' Feiertage ermitteln:
    66. Select Case Feiertag
    67. Case Feiertage.ftNeujahr : Feiertagsdatum = DateSerial(Jahr, 1, 1)
    68. Case Feiertage.ftErscheinungsfest : Feiertagsdatum = DateSerial(Jahr, 1, 6)
    69. Case Feiertage.ftKarfreitag : Feiertagsdatum = DateAdd("d", -2, Ostersonntag(Jahr))
    70. Case Feiertage.ftOstersonntag : Feiertagsdatum = Ostersonntag(Jahr)
    71. Case Feiertage.ftOstermontag : Feiertagsdatum = DateAdd("d", 1, Ostersonntag(Jahr))
    72. Case Feiertage.ftMaifeiertag : Feiertagsdatum = DateSerial(Jahr, 5, 1)
    73. Case Feiertage.ftChristiHimmelfahrt : Feiertagsdatum = DateAdd("d", 39, Ostersonntag(Jahr))
    74. Case Feiertage.ftPfingstmontag : Feiertagsdatum = DateAdd("d", 50, Ostersonntag(Jahr))
    75. Case Feiertage.ftFronleichnam : Feiertagsdatum = DateAdd("d", 60, Ostersonntag(Jahr))
    76. Case Feiertage.ftMariaeHimmelfahrt : Feiertagsdatum = DateSerial(Jahr, 8, 15)
    77. Case Feiertage.ftTagDerEinheit : Feiertagsdatum = DateSerial(Jahr, 10, 3)
    78. Case Feiertage.ftReformationstag : Feiertagsdatum = DateSerial(Jahr, 10, 31)
    79. Case Feiertage.ftAllerheiligen : Feiertagsdatum = DateSerial(Jahr, 11, 1)
    80. Case Feiertage.ftBussUndBettag
    81. '' Feiertagsdatum = DateSerial(Jahr, 12, 25) - Weekday(DateSerial(Jahr, 12, 25), vbMonday) - 4 * 7 - vbWednesday
    82. 'Dim Das_Datum As Date = DateSerial(Jahr, 12, 25)
    83. 'Dim Minus_Tage As Integer = (Weekday(DateSerial(Jahr, 12, 25), vbMonday) - 4 * 7 - vbWednesday) * -1
    84. 'Dim Neues_Datum As Date = Das_Datum.Subtract(New TimeSpan(Minus_Tage, 0, 0, 0))
    85. 'Feiertagsdatum = Neues_Datum
    86. Dim datum = New DateTime(Jahr, 12, 25)
    87. Dim day As Integer = CInt(datum.DayOfWeek)
    88. day = If((day = 0), -11, -day - 4)
    89. datum = datum.AddDays(-4 * 7).AddDays(day)
    90. Feiertagsdatum = datum
    91. Case Feiertage.ftWeihnachtsfeiertag1 : Feiertagsdatum = DateSerial(Jahr, 12, 25)
    92. Case Feiertage.ftWeihnachtsfeiertag2 : Feiertagsdatum = DateSerial(Jahr, 12, 26)
    93. End Select
    94. End Function
    95. Public Shared Function Bundeslandname(ByVal Bundesland As Bundeslaender) As String
    96. ' Service-Funktion für Ausgabezwecke: Liefert zu einem Wert der Aufzählung
    97. ' "Bundeslaender" den Klartextnamen des durch den Wert repräsentierten
    98. ' Bundeslandes zurück.
    99. Select Case Bundesland
    100. Case Bundeslaender.blBadenWuerttemberg : Bundeslandname = "Baden-Württemberg"
    101. Case Bundeslaender.blBayern : Bundeslandname = "Bayern"
    102. Case Bundeslaender.blBerlin : Bundeslandname = "Berlin"
    103. Case Bundeslaender.blBrandenburg : Bundeslandname = "Brandenburg"
    104. Case Bundeslaender.blBremen : Bundeslandname = "Bremen"
    105. Case Bundeslaender.blHamburg : Bundeslandname = "Hamburg"
    106. Case Bundeslaender.blHessen : Bundeslandname = "Hessen"
    107. Case Bundeslaender.blMecklenburgVorpommern : Bundeslandname = "Mecklenburg-Vorpommern"
    108. Case Bundeslaender.blNiedersachsen : Bundeslandname = "Niedersachsen"
    109. Case Bundeslaender.blNordrheinWestfalen : Bundeslandname = "Nordrhein-Westfalen"
    110. Case Bundeslaender.blRheinlandPfalz : Bundeslandname = "Rheinland-Pfalz"
    111. Case Bundeslaender.blSaarland : Bundeslandname = "Saarland"
    112. Case Bundeslaender.blSachsen : Bundeslandname = "Sachsen"
    113. Case Bundeslaender.blSachsenAnhalt : Bundeslandname = "Sachsen-Anhalt"
    114. Case Bundeslaender.blSchleswigHolstein : Bundeslandname = "Schleswig-Holstein"
    115. Case Bundeslaender.blThueringen : Bundeslandname = "Thüringen"
    116. End Select
    117. End Function
    118. Public Shared Function IstFeiertagIn(ByVal Feiertag As Feiertage, Optional ByVal Bundesland As Bundeslaender = 0) As Boolean
    119. ' Gibt zurück, ob der im Parameter Feiertag angegebene Feiertag in
    120. ' einem angegebenen Bundesland begangen wird (True) oder nicht (False).
    121. ' Wird für den Parameter Bundesland kein Wert übergeben, wird zurückgegeben,
    122. ' ob der Feiertag ein bundesweit einheitlicher Feiertag ist.
    123. '
    124. ' HINWEIS: Feiertage, die nur in einzelnen Gemeinden eines Bundeslandes
    125. ' begangen werden (Fronleichnam: Sachsen, Thüringen; Mariä
    126. ' Himmelfahrt: Bayern), werden von dieser Funktion als in diesen
    127. ' Bundesländern als NICHT begangen behandelt! Hinweise, wie Sie
    128. ' dieses Verhalten bei Bedarf ändern können, finden Sie in diesem
    129. ' Sourcecode.
    130. '
    131. ' TIPP: Bei Übergabe durch den Or- oder +-Operator kumulierter Werte
    132. ' für den Parameter Bundesland können Sie feststellen, ob dieser
    133. ' Feiertag in mehreren Bundesländern begangen wird. Beispiel:
    134. ' IstFeiertagInBayernUndInHessen = _
    135. ' IstFeiertagIn(ftFronleichnam, ftBayern + ftHessen)
    136. ' Bundesweit einheitliche Feiertage
    137. Select Case Feiertag
    138. Case Feiertage.ftNeujahr, Feiertage.ftKarfreitag, Feiertage.ftOstersonntag, Feiertage.ftOstermontag,
    139. Feiertage.ftMaifeiertag, Feiertage.ftChristiHimmelfahrt, Feiertage.ftPfingstmontag,
    140. Feiertage.ftTagDerEinheit, Feiertage.ftWeihnachtsfeiertag1, Feiertage.ftWeihnachtsfeiertag2
    141. IstFeiertagIn = True
    142. End Select
    143. ' Wurde kein Wert für Bundesland übergeben, wird die Funktion hier Erlassen
    144. If Bundesland = 0 Then
    145. Exit Function
    146. End If
    147. ' Bundesweit nicht einheitliche Feiertage
    148. Select Case Feiertag
    149. Case Feiertage.ftErscheinungsfest : IstFeiertagIn = (Bundesland And (Bundeslaender.blBadenWuerttemberg Or Bundeslaender.blBayern Or Bundeslaender.blSachsenAnhalt)) = Bundesland
    150. Case Feiertage.ftFronleichnam
    151. ' HINWEIS: In Sachsen-Anhalt und Thüringen wird Fronleichnam
    152. ' nur vereinzelt als Feiertag begangen. Für diese Bundesländer
    153. ' liefert diese Funktion generell FALSE zurück. Ändern Sie
    154. ' dieses Verhalten bei Bedarf in diesem Select Case-Zweig.
    155. IstFeiertagIn = (Bundesland And (Bundeslaender.blBadenWuerttemberg Or
    156. Bundeslaender.blBayern Or
    157. Bundeslaender.blHessen Or
    158. Bundeslaender.blNordrheinWestfalen Or
    159. Bundeslaender.blRheinlandPfalz Or
    160. Bundeslaender.blSaarland)) = Bundesland
    161. Case Feiertage.ftMariaeHimmelfahrt
    162. ' HINWEIS: In Bayern wird Mariä Himmelfahrt nur in einzelnen
    163. ' Gemeinden als Feiertag begangen. Für dieses Bundesland
    164. ' liefert diese Funktion generell FALSE zurück. Ändern Sie
    165. ' dieses Verhalten bei Bedarf in diesem Select Case-Zweig.
    166. IstFeiertagIn = (Bundesland And (Bundeslaender.blSaarland)) = Bundesland
    167. Case Feiertage.ftReformationstag
    168. IstFeiertagIn = (Bundesland And (Bundeslaender.blBrandenburg Or
    169. Bundeslaender.blMecklenburgVorpommern Or
    170. Bundeslaender.blSachsen Or
    171. Bundeslaender.blSachsenAnhalt Or
    172. Bundeslaender.blThueringen)) = Bundesland
    173. Case Feiertage.ftAllerheiligen
    174. IstFeiertagIn = (Bundesland And (Bundeslaender.blBadenWuerttemberg Or
    175. Bundeslaender.blBayern Or
    176. Bundeslaender.blNordrheinWestfalen Or
    177. Bundeslaender.blRheinlandPfalz Or
    178. Bundeslaender.blSaarland)) = Bundesland
    179. Case Feiertage.ftBussUndBettag : IstFeiertagIn = (Bundesland And (Bundeslaender.blSachsen)) = Bundesland
    180. End Select
    181. End Function
    182. End Class



    Dann hab ich dazu noch Funktionen die die jeweiligen Tage des Jahres abrufen etc.:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Shared Function _getYearDates() As Dictionary(Of Integer, List(Of Date))
    2. _yearDates.Clear()
    3. For _m = 1 To 12
    4. _yearDates.Add(_m, _getMonthDates(_m, CInt(Form1.nudYearChanger.Value)))
    5. Next
    6. Return _yearDates
    7. End Function
    8. Public Shared Function _getMonthDates(ByVal _month As Integer, ByVal _year As Integer) As List(Of Date)
    9. Dim _monthDates As New List(Of Date)
    10. Dim _date As Date = New Date(_year, _month, 1)
    11. For d = 0 To DateTime.DaysInMonth(_year, _month) - 1
    12. _monthDates.Add(_date.AddDays(d))
    13. Next
    14. Return _monthDates
    15. End Function
    16. Public Shared Function _getSabbathDates(ByVal _year As Integer) As Dictionary(Of String, Date)
    17. _feiertage.Clear()
    18. For Each _feiertag As Feiertage.Feiertage In enumFeiertage
    19. _feiertage.Add(_feiertag.ToString.Substring(2, _feiertag.ToString.Length - 2), Feiertage.Feiertagsdatum(_feiertag, _year))
    20. Next
    21. Return _feiertage
    22. End Function



    Dann kann man über "Date.DayOfWeek" den Wochentag abrufen und so die Samstage und Sonntage rausfiltern!
    Dateien

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Morrison“ ()

    @Morrison: Die Osterformel nach Spencer ist noch ein wenig leichter.
    Und Augsburg hat noch den 08.08. jedes Jahres einen Feiertag (Friedensfest)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke für die Antworten , hatte leider kaum zeit weiter zu machen , so bin nun soweit hier:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. ace = TextBox1.Text
    3. Datum = DateTimePicker1.Value
    4. Zähler = -1
    5. Zeiger = -1
    6. Flag = False
    7. Do
    8. Zeiger = Zeiger + 1
    9. Zähler = Zähler + 1
    10. If (Datum.AddDays(Zähler).DayOfWeek < 1) Or (Datum.AddDays(Zähler).DayOfWeek > 5) Then
    11. ace = ace + 1
    12. Flag = True
    13. End If
    14. Monat = CStr(Datum.AddDays(Zähler).Month)
    15. If Len(Monat) = 1 Then
    16. Monat = "0" + Monat
    17. End If
    18. Tage = CStr(Datum.AddDays(Zähler).Day)
    19. If Len(Tage) = 1 Then
    20. Tage = "0" + Tage
    21. End If
    22. FeiTag = Tage + "." + Monat + "." + CStr(Datum.AddDays(Zähler).Year)
    23. If Flag = False Then
    24. IIf(FeiTag = "01.01.2018", ace = ace + 1, ace = ace + 0)
    25. IIf(FeiTag = "30.03.2018", ace = ace + 1, ace = ace + 0)
    26. IIf(FeiTag = "02.04.2018", ace = ace + 1, ace = ace + 0)
    27. IIf(FeiTag = "01.05.2018", ace = ace + 1, ace = ace + 0)
    28. IIf(FeiTag = "10.05.2018", ace = ace + 1, ace = ace + 0)
    29. IIf(FeiTag = "21.05.2018", ace = ace + 1, ace = ace + 0)
    30. IIf(FeiTag = "03.10.2018", ace = ace + 1, ace = ace + 0)
    31. IIf(FeiTag = "25.12.2018", ace = ace + 1, ace = ace + 0)
    32. IIf(FeiTag = "26.12.2018", ace = ace + 1, ace = ace + 0)
    33. IIf(FeiTag = "01.01.2019", ace = ace + 1, ace = ace + 0)
    34. IIf(FeiTag = "19.04.2019", ace = ace + 1, ace = ace + 0)
    35. IIf(FeiTag = "22.04.2019", ace = ace + 1, ace = ace + 0)
    36. IIf(FeiTag = "01.05.2019", ace = ace + 1, ace = ace + 0)
    37. IIf(FeiTag = "30.05.2019", ace = ace + 1, ace = ace + 0)
    38. IIf(FeiTag = "10.06.2019", ace = ace + 1, ace = ace + 0)
    39. IIf(FeiTag = "03.10.2019", ace = ace + 1, ace = ace + 0)
    40. IIf(FeiTag = "25.12.2019", ace = ace + 1, ace = ace + 0)
    41. IIf(FeiTag = "26.12.2019", ace = ace + 1, ace = ace + 0)
    42. End If
    43. Loop Until Zähler = ace
    44. DateTimePicker2.Value = FeiTag
    45. 'TextBox2.Text = Datum.AddDays(ace)
    46. TextBox2.Text = FeiTag
    47. End Sub


    wobei der IIF Befehl ausgeführt wird, aber nicht vgerarbeitet werden, also bleiben die Feiertage unberücksichtigt
    kann mir da noch mal jemand helfen ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TheDoctorWho“ ()

    @TheDoctorWho Jetzt muss ich Dir mal absolut schmerzhaft verdeutlichen, was Du falsch machst (bitte nicht böse sein ;)):
    Wenn in der TextBox "Roulade mit Klößen" steht, lässt Du es Dir schmecken.
    Also:
    Ein Datum ist kein String, sondern halt ein Datum, also arbeite mit dem Datentyp, der ein Datum darstellt: DateTime.
    Dann:
    IIF gibt einen Wert zurück, den Du einfach ignorierst!

    VB.NET-Quellcode

    1. MessageBox.Show(IIf(True, 1, 0).ToString())
    Überarbeite Deinen Code entsprechend, dann machen wir weiter.
    Fang an mit Option Strict On :!:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    deswegen hab ich das datum umgewandelt von Double zu String :

    Tage = CStr(Datum.AddDays(Zähler).Day) zB. hab also das datum extra in ein string umgewandelt durch den Befehl: CSTR

    jetzt sehe ich das problem: DateTimePicker2.Value = FeiTag
    wie kann ich dies anpassen das es als date formatiert ist ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TheDoctorWho“ ()

    @TheDoctorWho Du sollst mit DateTime-Instanzen arbeiten :!:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mach ich doch aber , aber der feiertagsabfrage mach ich nur über string :(
    aber irgendwie hab ich gerade ein denkfehler :(
    wenn ich das datum in string umwandel und zu vergleichen, aber der zähler weiteraddiert wird und dann mit datetime.addday dazuaddiert wird , irgendwie den ich gerade falsch



    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim ace As Integer
    4. Dim Datum As New DateTime
    5. Dim Zeiger As Integer
    6. Dim Zähler As Double
    7. Dim FeiTag As String
    8. Dim Tage As String
    9. Dim Monat As String
    10. Dim Flag As Boolean
    11. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    12. ace = Convert.ToInt32(TextBox1.Text)
    13. Datum = DateTimePicker1.Value
    14. Zähler = -1
    15. Zeiger = -1
    16. Flag = False
    17. Do
    18. Zeiger = Zeiger + 1
    19. Zähler = Zähler + 1
    20. If (Datum.AddDays(Zähler).DayOfWeek < 1) Or (Datum.AddDays(Zähler).DayOfWeek > 5) Then
    21. ace = ace + 1
    22. Flag = True
    23. End If
    24. Monat = CStr(Datum.AddDays(Zähler).Month)
    25. If Len(Monat) = 1 Then
    26. Monat = "0" + Monat
    27. End If
    28. Tage = CStr(Datum.AddDays(Zähler).Day)
    29. If Len(Tage) = 1 Then
    30. Tage = "0" + Tage
    31. End If
    32. FeiTag = Tage + "." + Monat + "." + CStr(Datum.AddDays(Zähler).Year)
    33. If Flag = False Then
    34. IIf(FeiTag = "01.01.2018", ace = ace + 1, ace = ace + 0)
    35. IIf(FeiTag = "30.03.2018", ace = ace + 1, ace = ace + 0)
    36. IIf(FeiTag = "02.04.2018", ace = ace + 1, ace = ace + 0)
    37. IIf(FeiTag = "01.05.2018", ace = ace + 1, ace = ace + 0)
    38. IIf(FeiTag = "10.05.2018", ace = ace + 1, ace = ace + 0)
    39. IIf(FeiTag = "21.05.2018", ace = ace + 1, ace = ace + 0)
    40. IIf(FeiTag = "03.10.2018", ace = ace + 1, ace = ace + 0)
    41. IIf(FeiTag = "25.12.2018", ace = ace + 1, ace = ace + 0)
    42. IIf(FeiTag = "26.12.2018", ace = ace + 1, ace = ace + 0)
    43. IIf(FeiTag = "01.01.2019", ace = ace + 1, ace = ace + 0)
    44. IIf(FeiTag = "19.04.2019", ace = ace + 1, ace = ace + 0)
    45. IIf(FeiTag = "22.04.2019", ace = ace + 1, ace = ace + 0)
    46. IIf(FeiTag = "01.05.2019", ace = ace + 1, ace = ace + 0)
    47. IIf(FeiTag = "30.05.2019", ace = ace + 1, ace = ace + 0)
    48. IIf(FeiTag = "10.06.2019", ace = ace + 1, ace = ace + 0)
    49. IIf(FeiTag = "03.10.2019", ace = ace + 1, ace = ace + 0)
    50. IIf(FeiTag = "25.12.2019", ace = ace + 1, ace = ace + 0)
    51. IIf(FeiTag = "26.12.2019", ace = ace + 1, ace = ace + 0)
    52. End If
    53. Loop Until Zähler = ace
    54. TextBox2.Text = CStr(Datum.AddDays(ace))
    55. End Sub
    56. End Class

    TheDoctorWho schrieb:

    VB.NET-Quellcode

    1. IIf(FeiTag = "01.01.2018", ace = ace + 1, ace = ace + 0)
    Jede dieser Zeilen enthält zwei elementare Fehler :!:
    • Du ignorierst den Rückgabewert vin IFF()
    • Du arbeitest mit Strings statt mit DateTime-Instanzen.
    Beratungsresistenz?
    Leseschwäche?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sorry wegen gestern, irgendwie hatte ich eine Denkblockade.
    Nachdem ich heute morgen mir es angeschaut habe alles funktioniert es in dem ich IIF mit if..End ausgetauscht habe

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim ace As Integer
    4. Dim Datum As New DateTime
    5. Dim Zeiger As Integer
    6. Dim Zähler As Double
    7. Dim FeiTag As String
    8. Dim Tage As String
    9. Dim Monat As String
    10. Dim Flag As Boolean
    11. Dim Jahre As String
    12. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    13. ace = Convert.ToInt32(TextBox1.Text)
    14. Datum = DateTimePicker1.Value
    15. Zähler = -1
    16. Zeiger = -1
    17. Flag = False
    18. Do
    19. Zeiger = Zeiger + 1
    20. Zähler = Zähler + 1
    21. If (Datum.AddDays(Zähler).DayOfWeek < 1) Or (Datum.AddDays(Zähler).DayOfWeek > 5) Then
    22. ace = ace + 1
    23. Flag = True
    24. End If
    25. Monat = CStr(Datum.AddDays(Zähler).Month)
    26. If Len(Monat) = 1 Then
    27. Monat = "0" + Monat
    28. End If
    29. Tage = CStr(Datum.AddDays(Zähler).Day)
    30. If Len(Tage) = 1 Then
    31. Tage = "0" + Tage
    32. End If
    33. FeiTag = Tage + "." + Monat + "." + CStr(Datum.AddDays(Zähler).Year)
    34. If Flag = False Then
    35. If FeiTag = "01.01.2018" Then
    36. ace = ace + 1
    37. End If
    38. If FeiTag = "02.04.2018" Then
    39. ace = ace + 1
    40. End If
    41. If FeiTag = "01.05.2018" Then
    42. ace = ace + 1
    43. End If
    44. If FeiTag = "30.03.2018" Then
    45. ace = ace + 1
    46. End If
    47. If FeiTag = "10.05.2018" Then
    48. ace = ace + 1
    49. End If
    50. If FeiTag = "03.10.2018" Then
    51. ace = ace + 1
    52. End If
    53. If FeiTag = "25.12.2018" Then
    54. ace = ace + 1
    55. End If
    56. If FeiTag = "26.12.2018" Then
    57. ace = ace + 1
    58. End If
    59. If FeiTag = "01.01.2019" Then
    60. ace = ace + 1
    61. End If
    62. If FeiTag = "19.04.2019" Then
    63. ace = ace + 1
    64. End If
    65. If FeiTag = "22.04.2019" Then
    66. ace = ace + 1
    67. End If
    68. If FeiTag = "01.05.2019" Then
    69. ace = ace + 1
    70. End If
    71. If FeiTag = "30.05.2019" Then
    72. ace = ace + 1
    73. End If
    74. If FeiTag = "10.06.2019" Then
    75. ace = ace + 1
    76. End If
    77. If FeiTag = "25.12.2019" Then
    78. ace = ace + 1
    79. End If
    80. If FeiTag = "26.12.2019" Then
    81. ace = ace + 1
    82. End If
    83. End If
    84. Loop Until Zähler = ace
    85. Jahre = CStr(Datum.AddDays(Zähler).Year)
    86. DateTimePicker2.Value = New DateTime(CInt(Jahre), CInt(Monat), CInt(Tage))
    87. End Sub
    88. End Class

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „TheDoctorWho“ ()

    TheDoctorWho schrieb:

    VB.NET-Quellcode

    1. FeiTag = Tage + "." + Monat + "." + CStr(Datum.AddDays(Zähler).Year)
    Wie war das mit dem DateTime?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!