Materiały

TF PART 1

Tabela „Reklamacje”

  • ID_Sprawy (Autonumer)
  • Nazwa_Klienta (Tekst)
  • Data_Zgloszenia (Data/Godzina, format YYYY-MM-DD)
  • Kwota (Waluta)
  • Termin_Odpowiedzi (Data/Godzina, obliczane jako 35 dni roboczych od daty zgłoszenia)
  • Decyzja (Tekst, tylko w formularzu edycji)
  • Data_Zakonczenia (Data/Godzina, format YYYY-MM-DD)

Formularz „Rejestracja_Reklamacji”

  • Pola do wprowadzenia danych (ID automatycznie)
  • VBA do obliczenia „Terminu Odpowiedzi” uwzględniającego 35 dni roboczych

Formularz „Edycja_Reklamacji”

  • Pobiera dane z tabeli i umożliwia edycję
Function ObliczTerminOdpowiedzi(DataZgloszenia As Date) As Date
    Dim LiczbaDni As Integer
    Dim DataTymczasowa As Date
    DataTymczasowa = DataZgloszenia
    LiczbaDni = 0
    
    ' Dodajemy 35 dni roboczych
    Do While LiczbaDni < 35
        DataTymczasowa = DataTymczasowa + 1
        ' Sprawdzamy, czy dzień nie jest sobotą (7) ani niedzielą (1)
        If Weekday(DataTymczasowa, vbMonday) <= 5 Then
            LiczbaDni = LiczbaDni + 1
        End If
    Loop
    
    ObliczTerminOdpowiedzi = DataTymczasowa
End Function

Jak zastosować w formularzu?

  • W polu „Data Zgłoszenia” (np. txtDataZgloszenia) dodaj zdarzenie „Po aktualizacji” (AfterUpdate):
vbaKopiujEdytujPrivate Sub txtDataZgloszenia_AfterUpdate()
    Me.txtTerminOdpowiedzi = ObliczTerminOdpowiedzi(Me.txtDataZgloszenia)
End Sub

Teraz, gdy użytkownik wpisze datę zgłoszenia, system automatycznie obliczy termin odpowiedzi, pomijając weekendy. 😊
Czy chcesz dodać obsługę dni świątecznych?

Powiedziałeś(-aś):
Function ObliczTerminOdpowiedzi(DataZgloszenia As Date) As Date
    Dim LiczbaDni As Integer
    Dim DataTymczasowa As Date
    Dim Swieta() As Date
    Dim i As Integer
    
    DataTymczasowa = DataZgloszenia
    LiczbaDni = 0
    
    ' Pobieramy listę świąt
    Swieta = PobierzSwieta(Year(DataZgloszenia))

    ' Dodajemy 35 dni roboczych, pomijając weekendy i święta
    Do While LiczbaDni < 35
        DataTymczasowa = DataTymczasowa + 1
        If Weekday(DataTymczasowa, vbMonday) <= 5 Then ' Pomija soboty i niedziele
            ' Sprawdzamy, czy dzień jest świętem
            Dim CzySwieto As Boolean
            CzySwieto = False
            For i = LBound(Swieta) To UBound(Swieta)
                If DataTymczasowa = Swieta(i) Then
                    CzySwieto = True
                    Exit For
                End If
            Next i
            
            ' Jeśli to nie święto, liczymy jako dzień roboczy
            If Not CzySwieto Then
                LiczbaDni = LiczbaDni + 1
            End If
        End If
    Loop
    
    ObliczTerminOdpowiedzi = DataTymczasowa
End Function

Function PobierzSwieta(Rok As Integer) As Date()
    Dim Swieta(3) As Date
    Dim Wielkanoc As Date
    
    ' Obliczanie Wielkanocy (algorytm Gaussa)
    Wielkanoc = ObliczWielkanoc(Rok)
    
    ' Lista świąt
    Swieta(0) = DateSerial(Rok, 1, 1) ' Nowy Rok
    Swieta(1) = Wielkanoc
    Swieta(2) = Wielkanoc + 1 ' Poniedziałek Wielkanocny
    Swieta(3) = DateSerial(Rok, 12, 25) ' Boże Narodzenie
    Swieta(4) = DateSerial(Rok, 12, 26) ' Drugi dzień świąt
    
    PobierzSwieta = Swieta
End Function

Function ObliczWielkanoc(Rok As Integer) As Date
    Dim a As Integer, b As Integer, c As Integer
    Dim d As Integer, e As Integer, f As Integer
    Dim g As Integer, h As Integer, i As Integer
    Dim k As Integer, l As Integer, m As Integer
    Dim miesiac As Integer, dzien As Integer
    
    a = Rok Mod 19
    b = Rok \ 100
    c = Rok Mod 100
    d = b \ 4
    e = b Mod 4
    f = (b + 8) \ 25
    g = (b - f + 1) \ 3
    h = (19 * a + b - d - g + 15) Mod 30
    i = c \ 4
    k = c Mod 4
    l = (32 + 2 * e + 2 * i - h - k) Mod 7
    m = (a + 11 * h + 22 * l) \ 451
    miesiac = (h + l - 7 * m + 114) \ 31
    dzien = ((h + l - 7 * m + 114) Mod 31) + 1
    
    ObliczWielkanoc = DateSerial(Rok, miesiac, dzien)
End Function