konto usunięte

Temat: Liczenie daty w tył na bazie business days

Witam,

szukam rozwiązania vba w accessie, które pozwoliłoby mi na zwrócenie daty z przeszłości odejmując daną ilość dni od daty bazowej. Żeby było trudniej musiałaby omijać weekendy (sobota i niedziela) oraz holidays (wpisywane z ręki do dodatkowej tabeli); dni robocze.

Byłbym wdzięczny za pomoc w tym temacie. :)

Pozdrawiam

Temat: Liczenie daty w tył na bazie business days


Public Function PastDate(StartDate As Range, DaysNo As Long, Holidays As Range) As Date
Dim tempDate As Date
tempDate = StartDate.Value
Do Until WorksheetFunction.NetworkDays(tempDate, StartDate.Value, Holidays) = DaysNo
tempDate = tempDate - 1
Loop
PastDate = tempDate
End Function

konto usunięte

Temat: Liczenie daty w tył na bazie business days

Maciej Kraszewski:
[/quote]<ciach>[quote]        Do Until WorksheetFunction.NetworkDays(tempDate, 	[/quote]<ciach>[quote]

Jeśli chcemy użyć excelowego wynalazku WorksheetFunction, to należy dodać, że do użycia tego w VBA w Accessie przyda się np. zaznaczenie w edytorze referencji do biblioteki Excela. Dla 2010 będzie to Microsoft Excel 14.0 Object Librany.

--
Paweł Kiraga, piszący blog o praktycznym wykorzystaniu pakietu Microsoft Office

Temat: Liczenie daty w tył na bazie business days

Tego nie wiedziałem.
Nigdy mi nie krzyczał o tą bibliotekę, mam ją odhaczoną z automatu. Czy może to dlatego, że mam zainstalowany dodatek Analysis ToolPak i Analysis ToolPak VBA?

Temat: Liczenie daty w tył na bazie business days

o kurde, to jest forum accessa! hehee w takim razei moja funkcja chyba nie zabangla z tymi range'ami :)

konto usunięte

Temat: Liczenie daty w tył na bazie business days

Maciej Kraszewski:
o kurde, to jest forum accessa! hehee w takim razei moja funkcja chyba nie zabangla z tymi range'ami :)

Jakoś tak wyszło, że to forum Accessa, też skręciłem tu jadąc na Excela ;-)
Przyznam, że nie czytałem funkcji, tylko zerknąłem na ten kod i wpadła mi w oko funkcja Excela.
W sumie to można jej użyć, tylko oczywiście bez zakresów, jeśli ma być stosowane w Access.

Mała podpowiedź dla autora wątku: datę z przeszłości policzy nam funkcja DateAdd. Ilość dni weekendowych możemy uzależnić od tego, jaka jest różnica dni pomiędzy datami oraz jakimi dniami tygodnia są "data z przesłości" i "data nowsza".
Zostaje nam tylko policzenie ilości dni holidaya, mamy te informacje zapisane w tabeli "z boku", tak?

konto usunięte

Temat: Liczenie daty w tył na bazie business days

Witam, dziękuję za opisane podpowiedzi. W końcu skończyło się na poniższym kodzie. Pewnie można to zrobić łatwiej, ale działa. :)
-----------------------------------------------------------------------------------------------------------------------------
Public Function MinusCalendarDays(StartDate As Date, BusinessDays As Integer, Optional ReturnDate As Boolean) As Variant

' Jesli "ReturnDate" = True funkcja podaje date odlegla o "BusinessDays" dni roboczych od "StartDate" wstecz
' (w tej wersji jest uzywana w aplikacji)
'
' Do obliczec wymaga funkcji IsHoliday (sprawdza czy mamy po drodze swieto), bazuje na tabeli "Holidays"
' oraz IsWeekend (sprawdza czy po drodze jest weekend)

StartDate = DateAdd("d", -1, StartDate)

Dim i As Integer: i = 0
Do Until i = BusinessDays

If IsWeekend(StartDate - i) = True Then
BusinessDays = BusinessDays + 1
Else
If IsHoliday(StartDate - i) = True Then BusinessDays = BusinessDays + 1
End If

i = i + 1
Loop

MinusCalendarDays = BusinessDays
If ReturnDate = True Then MinusCalendarDays = StartDate - MinusCalendarDays + 1
End Function

-----------------------------------------------------------------------------------------------------------------------------

Public Function IsHoliday(QueryDate As Date) As Boolean
Dim nHolidays As Integer
Dim strWhere As String

' Funkcja wymagana przez funckje "CalendarDays"
'
' Wymaga tabeli "Holidays" z polem [Holiday] gdzie powinny byc wpisane daty swiat

strWhere = "[Holiday] = #" & Format(QueryDate, "yyyy-mm-dd") & "#"

' Count the number of holidays.
nHolidays = DCount(Expr:="[Holiday]", _
Domain:="Holidays", _
Criteria:=strWhere)

If nHolidays = 1 Then
IsHoliday = True
Else
IsHoliday = False
End If

End Function
-----------------------------------------------------------------------------------------------------------------------------

Public Function IsWeekend(QueryDate As Date) As Boolean
' Funkcja wymagana przez funckje "CalendarDays"

Select Case Weekday(QueryDate, vbMonday)
Case 6
IsWeekend = True
Case 7
IsWeekend = True
End Select

End Function

Następna dyskusja:

Access grupowanie i liczeni...




Wyślij zaproszenie do