• Tính số ngày làm việc (trừ ngày nghỉ, ngày lễ)
  • 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ễ.

    [Hình: 31527058956_c5251cb19b_b.jpg]

    Code hàm fWorkingDays(). Copy vào module.

    Mã PHP:
    Option Compare Database
    Option Explicit

    Public Function fWorkingdays(ByVal datTuNgay As DateByVal datDenNgay As DateByVal bytSoNgayLVTuan As Byte_
       Optional ByVal blnTinhNgayLe 
    As Boolean) As Long
    '-------------------------------------------------------------------------------------------------
    '
    Muc dichTính so ngày làm viec giua 2 tham so  (datTuNgayvà (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 tuan5neu nghi thu 7 CN6nê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 (Fieldluu 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-1vbMonday)
       intWeekdayDenNgay Weekday(datDenNgayvbMonday)

       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("*"cstrTenTableNgayLestrFilter)
       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 DatedteDenNgay 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 234567      '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'
  • RE: Tính số ngày làm việc (trừ ngày nghỉ, ngày lễ)

    ongke0711 > 07-06-23, 11:14 AM

    (06-06-23, 11:56 AM)btamsgn Đã viết: đã tìm thấy lỗi.
    Case Is = 1 Or 2 Or 4 Or 6
                  'La ngày CN -> không dem'

    Vậy là ứng dụng tính ngày ở trên lỗi hay không lỗi bạn?