-
Tính số ngày làm việc (trừ ngày nghỉ, ngày lễ)
ongke0711 > 11-12-16, 12:31 PM
Tôi có tham khảo một số hàm tính số ngày làm việc và thấy hàm này đáp ứng các tùy chọn tính hoặc không tính các ngày nghỉ (T7, CN) và ngày lễ (Hàm này tính luôn ngày bắt đầu).Tôi có chỉnh sửa và up lên chia sẽ với các bạn.
- Để tính các ngày nghỉ lễ, bạn phải tạo 1 table lưu cac ngày lễ. Trong demo tôi tạo table tên tblNgayLe có 2 trường [NgayLe]- Date, [DienGiai] - Text.
- Tham số “bytSoNgayLVTuan” trong hàm là số ngày làm việc trong 1 tuần. Các bạn nhập số 5 nếu 1 tuần làm 5 ngày, nghỉ T7+CN. Nhập số 6: nếu chỉ nghỉ ngày CN.
- Tham số "blnTinhNgayLe": chọn True nếu muốn trừ các ngày Lễ và False nếu không cần trừ ngày Lễ.
Code hàm fWorkingDays(). Copy vào module.
Mã PHP:Option Compare Database
Option Explicit
Public Function fWorkingdays(ByVal datTuNgay As Date, ByVal datDenNgay As Date, ByVal bytSoNgayLVTuan As Byte, _
Optional ByVal blnTinhNgayLe As Boolean) As Long
'-------------------------------------------------------------------------------------------------
'Muc dich: Tính so ngày làm viec giua 2 tham so (datTuNgay) và (datDenNgay).
'Có tùy chon tru ngày nghi (Thu 7, CN) và tru các ngày Le
'bytSoNgayLVTuan : là so ngày lam viec trong 1 tuan. 5: neu nghi thu 7 + CN; 6: nêu chi nghi CN
'blnTinhNgayLe : là 'True' neu có tru ngay Le; 'False' neu không tru ngay Le
'-------------------------------------------------------------------------------------------------
'Const bytSoNgayLVTuan 'Khai bao so ngay lam viec trong tuan
'Khai bao ten table Ngay Nghi.
Const cstrTenTableNgayLe As String = "tblNgayLe"
'Khai bao ten truong (Field) luu Ngay Nghi trong table Ngay Nghi.
Const cstrTenFieldNgayLe As String = "NgayLe"
Dim bytSunday As Byte
Dim intWeekdayTuNgay As Integer
Dim intWeekdayDenNgay As Integer
Dim lngDays As Long
Dim datDateTemp As Date
Dim strDateFrom As String
Dim strDateTo As String
Dim lngNgayLe As Long
Dim strFilter As String
'Dao nguoc TuNgay, DenNgay neu nhap lieu nguoc lai.
If datTuNgay > datDenNgay Then
datDateTemp = datTuNgay
datTuNgay = datDenNgay
datDenNgay = datDateTemp
End If
'Xac dinh Weekday cua Sunday.
'Nêu chon Sat là ngày dau tuan thì Weekday cua Sunday=7, Sunday là ngày dau tuan thì Weekday cua Sunday=1.
bytSunday = Weekday(vbSunday, vbMonday)
'Xac dinh Weekdays cua [TuNgay], [DenNgay].
intWeekdayTuNgay = Weekday(datTuNgay-1, vbMonday)
intWeekdayDenNgay = Weekday(datDenNgay, vbMonday)
intWeekdayTuNgay = intWeekdayTuNgay + (intWeekdayTuNgay = bytSunday)
intWeekdayDenNgay = intWeekdayDenNgay + (intWeekdayDenNgay = bytSunday)
lngDays = intWeekdayDenNgay - intWeekdayTuNgay - (bytSoNgayLVTuan * (intWeekdayDenNgay < intWeekdayTuNgay))
'Them so ngay lam viec ung voi so tuan giua TuNgay va DenNgay
lngDays = lngDays + (bytSoNgayLVTuan * DateDiff("w", datTuNgay-1, datDenNgay, vbMonday, vbFirstFourDays))
'Dem so ngay Le trong khoang thoi gian TuNgay va DenNgay
If blnTinhNgayLe And lngDays > 0 Then
strTuNgay = Format(datTuNgay, "yyyy\/mm\/dd")
strDenNgay = Format(datDenNgay, "yyyy\/mm\/dd")
strFilter = cstrTenFieldNgayLe & " Between #" & strTuNgay & "# And #" & strDenNgay & "# And Weekday(" & cstrTenFieldNgayLe & ", 2) <= " & bytSoNgayLVTuan & ""
lngNgayLe = DCount("*", cstrTenTableNgayLe, strFilter)
End If
fWorkingdays = lngDays - lngNgayLe
End Function
Link file demo: http://www.mediafire.com/file/28ohh1urbh...ngDays.mdb
Bổ sung thêm 1 hàm tính ngày khác đơn giản hơn là dùng vòng lặp qua các ngày và đếm. Hàm này cũng dùng Dcount để tính ngày nghỉ lễ trong table tblNgayLe.
Mã PHP:Public Function fCalcWorkingDays(dteTuNgay As Date, dteDenNgay As Date) As Integer
Dim intCount As Integer
intCount = 0
Do While dteTuNgay <= dteDenNgay
Select Case Weekday(dteTuNgay)
Case Is = 1
'La ngày CN -> không dem'
Case Is = 2, 3, 4, 5, 6, 7 'Tu thu 2 - thu 7'
'Kiem tra xem có nam trong table tblNgayLe không?'
If DCount("*", "tblNgayLe", "[NgayLe] = #" & Format(dteTuNgay, "mm/dd/yyyy") & "#") < 1 Then 'Không phai ngay le'
intCount = intCount + 1
End If
End Select
dteTuNgay = dteTuNgay + 1
Loop
fCalcWorkingDays = intCount
End Function -
RE: Tính số ngày làm việc (trừ ngày nghỉ, ngày lễ)
btamsgn > 06-06-23, 11:56 AM
đã tìm thấy lỗi.
Case Is = 1 Or 2 Or 4 Or 6
'La ngày CN -> không dem'