ongke0711 > 11-12-16, 12:31 PM
![[Hình: 31527058956_c5251cb19b_b.jpg]](https://c5.staticflickr.com/1/33/31527058956_c5251cb19b_b.jpg)
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 
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 
btamsgn > 06-06-23, 11:56 AM