Giúp đỡ hoàn thiện hàm UDF tính ngày làm việc

Liên hệ QC

quyenpv

Thu nhặt kiến thức
Tham gia
5/1/13
Bài viết
719
Được thích
97
Giới tính
Nam
Nghề nghiệp
Decode cuộc đời!
Kính gửi các anh chị!
Ý tưởng của em sau khi bị kiểm toán sờ gáy với lý do rất chi là ẩu là ngày chủ nhật vẫn trình ký hợp đồng dẫn đến phải sửa nhiều bộ hồ sơ để hoàn thiện lại. Em hay dùng công thức để tính nhưng do công thức nhiều dẫn đến file chạy chậm, nên em viết hàm UDF NgayLV với tiêu chí
- Các ngày trong tuần thì giữ nguyên ngày nhâph vào
- Nếu ngày nhập vào là thứ 7 thì +2 ngày để sang thứ 2 tuần sau
- Nếu ngày nhập vào hoặc tính toán tiếp theo rơi vào chủ nhật thì +1 ngày để sang ngày thứ 2 tuần sau
Do chưa biết hoàn thiện bẫy lỗi dẫn đến ngày chạy không chính xác hoặc nhảy về 01/01/1900
Mong anh chị bớt chút thời gian sửa lỗi giúp em hàm này với ạ
Em cám ơn anh chị nhiều

Hàm kiểm tra ngày cuối tuần hay không phục vụ cho công thức tính
Mã:
Function IsWeekendDay(MyDate As Variant) As Boolean

    Dim DayNum      As Variant
    Dim IsWeekend   As Boolean

    DayNum = Application.Weekday(MyDate)
    If Not IsError(DayNum) Then
        Select Case DayNum
            Case 2 To 6    ' Monday thru Friday
                IsWeekend = False
            Case Else
                IsWeekend = True
        End Select
    Else
        IsWeekend = False    ' error
    End If
    IsWeekendDay = IsWeekend
End Function

Công thức em hay dùng

Mã:
=IF(IsWeekendDay(C2)=TRUE;IF(WEEKDAY(C2;2)=6;C2+2;C2+1);C2)

Mã:
Function NgayLV(MyDate As Date) As Date

    Dim DayNum      As Variant

    DayNum = Application.Weekday(MyDate, 2)
    If Not IsError(DayNum) Then
        Select Case DayNum
            Case 2 To 5                     'Monday thru Friday
                NgayLV = MyDate
            Case 6                          'Thu 7
                NgayLV = MyDate + 2
            Case 7                          'Chu nhat
                NgayLV = MyDate + 1
        End Select
    End If
    NgayLV = NgayLV
End Function

1651540969114.png
 

File đính kèm

  • NgayLV.xlsm
    17.3 KB · Đọc: 2
Nếu ngày thường hoặc + xx ngày nó rơi vô ngày lễ, Tết thì sao bạn?
 
Upvote 0
Kính gửi các anh chị!
Ý tưởng của em sau khi bị kiểm toán sờ gáy với lý do rất chi là ẩu là ngày chủ nhật vẫn trình ký hợp đồng dẫn đến phải sửa nhiều bộ hồ sơ để hoàn thiện lại. Em hay dùng công thức để tính nhưng do công thức nhiều dẫn đến file chạy chậm, nên em viết hàm UDF NgayLV với tiêu chí
- Các ngày trong tuần thì giữ nguyên ngày nhâph vào
- Nếu ngày nhập vào là thứ 7 thì +2 ngày để sang thứ 2 tuần sau
- Nếu ngày nhập vào hoặc tính toán tiếp theo rơi vào chủ nhật thì +1 ngày để sang ngày thứ 2 tuần sau
Do chưa biết hoàn thiện bẫy lỗi dẫn đến ngày chạy không chính xác hoặc nhảy về 01/01/1900
Mong anh chị bớt chút thời gian sửa lỗi giúp em hàm này với ạ
Em cám ơn anh chị nhiều

Hàm kiểm tra ngày cuối tuần hay không phục vụ cho công thức tính
Mã:
Function IsWeekendDay(MyDate As Variant) As Boolean

    Dim DayNum      As Variant
    Dim IsWeekend   As Boolean

    DayNum = Application.Weekday(MyDate)
    If Not IsError(DayNum) Then
        Select Case DayNum
            Case 2 To 6    ' Monday thru Friday
                IsWeekend = False
            Case Else
                IsWeekend = True
        End Select
    Else
        IsWeekend = False    ' error
    End If
    IsWeekendDay = IsWeekend
End Function

Công thức em hay dùng

Mã:
=IF(IsWeekendDay(C2)=TRUE;IF(WEEKDAY(C2;2)=6;C2+2;C2+1);C2)

Mã:
Function NgayLV(MyDate As Date) As Date

    Dim DayNum      As Variant

    DayNum = Application.Weekday(MyDate, 2)
    If Not IsError(DayNum) Then
        Select Case DayNum
            Case 2 To 5                     'Monday thru Friday
                NgayLV = MyDate
            Case 6                          'Thu 7
                NgayLV = MyDate + 2
            Case 7                          'Chu nhat
                NgayLV = MyDate + 1
        End Select
    End If
    NgayLV = NgayLV
End Function

View attachment 275324
Sub không phải tính nhiều lần khi dùng mới nhẹ file chứ còn UDF thì nó vẫn tính toán mà bạn. Nếu phức tạp mới dùng UDF chứ theo mình thấy bài này công thức cũng đơn giản mà?
 
Upvote 0
Sub không phải tính nhiều lần khi dùng mới nhẹ file chứ còn UDF thì nó vẫn tính toán mà bạn. Nếu phức tạp mới dùng UDF chứ theo mình thấy bài này công thức cũng đơn giản mà?
Dạ do em muốn đơn giản hoá công thức thôi ạ
 
Upvote 0
Excel có sẵn hàm WORKDAY. Nó né thứ 7, CN và ngày lễ. sao không xài mà phải viết UDF?

.
 
Upvote 0

File đính kèm

  • NgayLV.xlsm
    17.5 KB · Đọc: 8
Upvote 0
Dạ đây ạ, đối với việc chuẩn bị hồ sơ em đang dùng theo công thức. Nếu hàm Workday nó sẽ qua cả thứ 7 và Chủ nhật, trong khi luật của mình đưa ra là sau bao nhiêu ngày làm việc

Vấn đề ở chỗ có biết dùng nó không? Xem đính kèm:


Thứ Hai
1​
Số ngày hoàn thiện
Ngày test
05/02/2022​
SaiĐúng
Hàm NgayLVCông thứcWorkdayDùng hàm Workday
Pháp lý triển khai
01/01/1900​
1​
05/03/2022​
05/03/2022​
05/03/2022​
Ngày trình 1
01/03/1900​
1​
05/04/2022​
05/04/2022​
05/04/2022​
Ngày trình 2
01/08/1900​
5​
05/09/2022​
05/11/2022​
05/09/2022​
Ngày trình 3
01/16/1900​
7​
05/16/2022​
05/20/2022​
05/16/2022​
 
Upvote 0
Vấn đề ở chỗ có biết dùng nó không? Xem đính kèm:


Thứ Hai
1​
Số ngày hoàn thiện
Ngày test
05/02/2022​
SaiĐúng
Hàm NgayLVCông thứcWorkdayDùng hàm Workday
Pháp lý triển khai
01/01/1900​
1​
05/03/2022​
05/03/2022​
05/03/2022​
Ngày trình 1
01/03/1900​
1​
05/04/2022​
05/04/2022​
05/04/2022​
Ngày trình 2
01/08/1900​
5​
05/09/2022​
05/11/2022​
05/09/2022​
Ngày trình 3
01/16/1900​
7​
05/16/2022​
05/20/2022​
05/16/2022​
Anh gửi cho xin file đính kèm với nhé. Thanks
 
Upvote 0
Bạn dùng WORKDAY.INTL bình thường nhé. WORKDAY.INTL(NGÀY_BĐ, số_ngày,1, ngày _lễ)
Để tránh ngày bđ rơi vào gày weekend hoặc lễ, thì bạn lùi ngày bđ lại 1 ngày, đồng thời + thêm 1 ngày bù lại
WORKDAY.INTL(NGÀY_BĐ-1, số_ngày+1,1, ngày _lễ)
Mã:
=WORKDAY.INTL($C$2-1,$D4+1,1,$K$2:$K$5)
với K2:K5 bạn nhập ngày lễ vào
 

File đính kèm

  • NgayLV.xlsm
    15.7 KB · Đọc: 7
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom