PDA

View Full Version : Tính số ngày làm việc trong Access



chamnv
06-11-09, 07:06 PM
Các bác giúp em các tính số ngày làm việc trong Access với ạ.
Ví dụ:
Em có 3 trường ( ứng với 3 textbox)
Field1: Songaycongno
Field2: Ngaygiaohang
Field3: Hanthanhtoan

Em đã tính được
hanthanhtoantamthoi=songaycongno+ngaygiaohang

Nhưng làm cách nào để tính được:
hanthanhtoan=số ngày làm việc của khoảng thời gian ngaygiaohang+hanthanhtoantamthoi

Trong excel thì nó như cái bài này các bác ạ
http://www.giaiphapexcel.com/forum/showthread.php?t=15042

dongnamnb
07-11-09, 07:59 AM
HanThanhToanTamThoi=dateadd("d",SoNgayCongNo,NgayGiaoHang)
HanThanhToan=SoNgayLamViec(NgayGiaoHang,HanThanhTo anTamThoi)

Bạn tạo 1 modul và copy hàm SoNgayLamViec này vào:



Function SoNgayLamViec(TuNgay As Date, DenNgay As Date) As Long
Dim mTuNgay As Date, mDenNgay As Date
mTuNgay = IIf(TuNgay < DenNgay, TuNgay, DenNgay)
mDenNgay = IIf(TuNgay > DenNgay, TuNgay, DenNgay)
'Tim den ngay nghi dau tien trong khoang tu ngay den ngay
Do While mTuNgay <= mDenNgay
If Weekday(mTuNgay) = vbSaturday Or Weekday(mTuNgay) = vbSunday Then Exit Do
mTuNgay = DateAdd("d", 1, mTuNgay)
Loop
If mDenNgay - mTuNgay >= 7 Then
SoNgayLamViec = ((mDenNgay - mTuNgay) \ 7) * 2
mTuNgay = DateAdd("d", ((mDenNgay - mTuNgay) \ 7) * 7, mTuNgay)
End If
While mTuNgay <= mDenNgay
If Weekday(mTuNgay) = vbSaturday Or Weekday(mTuNgay) = vbSunday Then SoNgayLamViec = SoNgayLamViec + 1
mTuNgay = DateAdd("d", 1, mTuNgay)
Wend
End Function


Tuy nhiên hàm này chỉ trừ ra được các ngày thứ 7 và CN trong khoảng thời gian tungay denngay, Không trừ được các ngày lễ như 30/4, 01/5, 02/9,... Bạn nào có cách làm hay hơn mong được chia sẽ!

chamnv
07-11-09, 08:40 AM
Cảm ơn bác đã reply
Nhưng khi em thực hiện đúng như bác hưỡng dẫn thì nó vẫn hoạt động được chính xác
Ví dụ:
Ngày giao hàng của em là ngày 12/11/2009
Hạn công nợ của em là 07 ngày
=> Hanthanhtoantamthoi=19/11/2009
=> Khi đó sử dụng hàm songaylamviec nó sẽ cho ra kết quả ở
hanthanhtoan=2
Trong khi thực tế nó sẽ là: 6 ngày làm việc ( 12,13,14,15,16,19)
Khi sử dụng hàm songaycongviec ở trên thì nó ra kết quả sai ạ.

dongnamnb
07-11-09, 02:47 PM
Sorry bạn nhé, mình nhầm một chút. Thay vì đưa ra số ngày làm việc thì mình lại đưa ra số ngày nghỉ. Bạn copy lại hàm sau nhé:


Function SoNgayLamViec(TuNgay As Date, DenNgay As Date) As Long
Dim mTuNgay As Date, mDenNgay As Date, SoNgayNghi As Long
mTuNgay = IIf(TuNgay < DenNgay, TuNgay, DenNgay)
mDenNgay = IIf(TuNgay > DenNgay, TuNgay, DenNgay)
'Tim den ngay nghi dau tien trong khoang tu ngay den ngay
Do While mTuNgay <= mDenNgay
If Weekday(mTuNgay) = vbSaturday Or Weekday(mTuNgay) = vbSunday Then Exit Do
mTuNgay = DateAdd("d", 1, mTuNgay)
Loop
If mDenNgay - mTuNgay >= 7 Then
SoNgayNghi = ((mDenNgay - mTuNgay) \ 7) * 2
mTuNgay = DateAdd("d", ((mDenNgay - mTuNgay) \ 7) * 7, mTuNgay)
End If
While mTuNgay <= mDenNgay
If Weekday(mTuNgay) = vbSaturday Or Weekday(mTuNgay) = vbSunday Then SoNgayNghi = SoNgayNghi + 1
mTuNgay = DateAdd("d", 1, mTuNgay)
Wend
If DenNgay - TuNgay - SoNgayNghi + 1 > 0 Then SoNgayLamViec = DenNgay - TuNgay - SoNgayNghi + 1
End Function

tanhdakto
01-11-11, 10:26 AM
hàm này sao em làm nó vẫn cho ra = 1

Good-Luck
18-08-12, 09:32 PM
hàm này sao em làm nó vẫn cho ra = 1

tim so ngay trong do tru so ngay chu nhat va thu 7 chi can dung ham nay la ok roi ko can lam ham chi cho met


WORKDAY ( ngay bat dau, ngay ket thuc, ngay nghi)