Code tính số ngày nghỉ!

Liên hệ QC

ThuNghi

Hãy cho rồi sẽ nhận!
Thành viên đã mất
Tham gia
16/8/06
Bài viết
3,808
Được thích
4,449
Mình có làm Code tính số ngày nghỉ như sau:
Function Songay(NgayCuoi As Date, NgayDau As Date, Thu As Integer) As Integer
Dim i As Integer
Dim ThoiGian As Integer
Dim songay1 As Integer
'lay hieu so ngaycuoi-ngaydau
'neu thu =0, tinh bao nhieu T7+CN, thu=8 tinh bao nhieu ngay le
If NgayCuoi < NgayDau Or Thu > 8 Then
MsgBox ("Ban nhap sai-nhap lai songay(ngaycuoi,ngaydau,thu), thu < 9")
Exit Function
End If
ThoiGian = NgayCuoi - NgayDau
For i = ThoiGian To 0 Step -1
'1 la CN, 2 la thu 2 ....,7 la thu 7
'neu thu =0 tinh bao nhieu thu bay va cn
If Thu = 0 And (Weekday(NgayCuoi - i) = 1 Or Weekday(NgayCuoi - i) = 7) Then
Songay = Songay + 1
End If
If Weekday(NgayCuoi - i) = Thu Then
Songay = Songay + 1
End If
If Thu = 8 And WorksheetFunction.CountIf(Range("ngayle"), NgayCuoi - i) > 0 Then
Songay = Songay + 1
End If
Next i

End Function

Nếu thu = 0 thì tính những ngày t7+CN trong kỳ, thu=8 tính những ngày lễ theo range("ngayle") (tạo 1 name những ngày lễ), thu=1 tính bao nhiêu CN...
Xin hỏi, khi thu = 8 thì tính số ngày nghỉ lễ, ví dụ: A1=songay(ngaycuoi,ngaydau,8) là số ngày lễ trong thời gian cuoi-dau. Nhưng khi mình bỏ bớt 1 ngày lễ trong name ngayle thì thì A1 không update ngay mà phải vào A1 edit thì mới update.
Cám ơn chân thành!
 
Chào Thunghi,


Cho mình sửa cái code của bạn lại nhá. Cái này chạy OK rồi đây.


--------------------------------------------
Function songay(NgayCuoi As Date, NgayDau As Date, Thu As Integer) As Integer
Dim i As Integer
Dim ThoiGian As Integer
'Cu phap cach dung'=songay'("26/4/2007","2/1/2007",0)
'lay hieu so ngaycuoi-ngaydau
'neu thu =0, tinh bao nhieu T7+CN, thu=8 tinh bao nhieu ngay le
If NgayCuoi < NgayDau Or Thu > 8 Then
MsgBox ("Ban nhap sai-nhap lai songay(ngaycuoi,ngaydau,thu), thu < 9")
Exit Function
End If
ThoiGian = DateDiff("d", NgayDau, NgayCuoi)
For i = ThoiGian To 0 Step -1
'1 la CN, 2 la thu 2 ....,7 la thu 7
'neu thu =0 tinh bao nhieu thu bay va cn
If Thu = 0 And (Weekday(NgayCuoi - i) = 1 Or Weekday(NgayCuoi - i) = 7) Then
songay = songay + 1
ElseIf Thu = 8 And WorksheetFunction.CountIf(Range("ngayle"), NgayCuoi - i) > 0 Then
songay = songay + 1
End If
Next i
End Function
------------------------------

Mến chào
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Sao Bạn lại bỏ phần ngày, phần này là tính bao nhiêu thứ 2, 3, 4,...,CN
Nếu thu=2, tính bao nhiêu thứ hai.
If Weekday(NgayCuoi - i) = Thu Then
Songay = Songay + 1
End If
 
Upvote 0
A, mình quên. Cứ nhớ những ngày nghĩ mà không nhớ ngày đi làm! Đây là code hoàn chỉnh đếm ngày nào cũng được hết.

----------------------------------
Function songay(NgayCuoi As Date, NgayDau As Date, Thu As Integer) As Integer
Dim i As Integer
Dim ThoiGian As Integer
'Cu phap cach dung'=songay'("26/4/2007","2/1/2007",0)
'lay hieu so ngaycuoi-ngaydau, T2 = 2, T3 = 3 v.v.
'neu thu =0, tinh bao nhieu T7+CN, thu=8 tinh bao nhieu ngay le
'Tim bao nhieu ngay T6 giua 1/1/07 - 31/12/7
= songay("31/12/2007","1/1/2007",6)
If NgayCuoi < NgayDau Or Thu > 8 Then
MsgBox ("Ban nhap sai-nhap lai songay(ngaycuoi,ngaydau,thu), thu < 9")
Exit Function
End If
ThoiGian = DateDiff("d", NgayDau, NgayCuoi)
For i = ThoiGian To 0 Step -1
'1 la CN, 2 la thu 2 ....,7 la thu 7
'neu thu =0 tinh bao nhieu thu bay va cn
If Thu = 0 And (Weekday(NgayCuoi - i) = 1 Or Weekday(NgayCuoi - i) = 7) Then
songay = songay + 1
ElseIf Thu = 8 And WorksheetFunction.CountIf(Range("ngayle"), NgayCuoi - i) > 0 Then
songay = songay + 1
ElseIf Weekday(i, vbSunday) = Thu Then
songay = songay + 1
End If
Next i
End Function

--------------------------------
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Có vọc thữ cái hàm songay. Đúng như bạn ThuNghi đã nói, xoá 1 ngày lễ trong vùng "ngayle" giữa ngày đầu và ngày cuốI mà con số hàm songay tính ra không thay đổi gì cả. Theo mình đoán thì vì hàm tự tạo (UDF) được viết bằng ngôn ngữ VBA (giống như macro vậy), kích hoạt thì nó chạy còn không thì nó không rụt rị gì hết

XL cho phép chúng ta lập trình bằng những mệnh lệnh VBA (gần giống như cú pháp trong Anh Ngữ). Còn máy vi tính thì không hiểu 1 chử Ăng Lê nào. Khi kích hoạt 1 macro, XL chuyển những dòng mã VBA chúng ta viết thành ngôn ngữ máy tính gồm hàng triệu con số 0 & 1.


Các hàm worksheet có sẵn trong XL đã được chuyển mã (compile) qua ngôn ngữ máy tính số để có tác dụng chạy lồng trong XL và tự điều chỉnh kết quả khi có thay đỗi trong bảng số. Có thể đây là 1 bất lợi khi dùng UDF.

Để có kết quả chính xác cho những ô đã có hàm UDF thì ta phải đành gõ cái hàm UDF lại bằng cách bấm F2 rồi Enter.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Sao như thế này khi bỏ ngày lễ thì update luôn, không cần thiết phải đặt name ngayle nữa.
Function songayle(ngay1 As Date, ngay2 As Date, ngayle As Range)
Dim i As Integer
Dim ThoiGian As Integer
Dim ngaycuoi As Date
Dim ngaydau As Date
If ngay1 > ngay2 Then
ngaycuoi = ngay1
ngaydau = ngay2
Else
ngaycuoi = ngay2
ngaydau = ngay1
End If
'lay hieu so ngaycuoi-ngaydau
If ngaycuoi < ngaydau Then
MsgBox ("Ban nhap sai-nhap lai songay(ngaycuoi,ngaydau,thu), thu < 9")
Exit Function
End If
ThoiGian = ngaycuoi - ngaydau
For i = ThoiGian To 0 Step -1
If WorksheetFunction.CountIf(Range("ngayle"), ngaycuoi - i) > 0 Then
songayle = songayle + 1
End If
Next i
End Function
cú pháp là songayle(A1,B1,X1:Xi)
trong đó A1 hay B1 là ngày đầu hay cuối
X1:Xi là mảng ngày lễ
Bạn nghiên cứu hộ sao lạ quá, tách ra thì OK, còn gộp thì không update
Và nghiên cứu tiếp luôn để thay thế hàm workday và networkdays, các hàm có sẵn của Excel nhưng ngày nghỉ là t7 + CN. Phải chế biến lại.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom