Tính số ngày công làm việc giữa hai khoảng thời gian (1 người xem)

  • Thread starter Thread starter DOSNET
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

DOSNET

Thành viên gắn bó
Thành viên danh dự
Tham gia
3/8/07
Bài viết
1,633
Được thích
2,370
Nghề nghiệp
E&A
hoangdanh282vn đã viết:
Mình có một câu hỏi này, mời các bạn cùng tham gia tìm giải pháp :
Tính số ngày công (2 buổi/ngày) làm việc của một nhân viên từ ngày 01/06/1980 đến ngày 29/02/2008.
Biết rằng ngày CN nghỉ, ngày thứ bảy làm 1/2 ngày, có 4 ngày nghỉ lễ là 01/01,30/04,01/05,02/09


ThuNghi đã viết:
Vấn đề này thấy vậy mà không đơn giản lắm. Những ngày 01/01, 30/04... nếu rơi vào T7, CN thứ tính làm sao. Và có cho dùng VBA không.
Theo tôi bài này dùng VBA là hay nhất
Còn 01/06/1980 - 29/02/2008 > 10.000 ngày
Nếu sumproduct(--(weekday(indirect(...))<>1),--(weekday(indirect(...))<>7),--(day()<>1),--...) với indirect 10.000 dòng thì không cách gì mà nhanh được.


DOSNET đã viết:
Do ta đếm số ngày T7 và CN giữa hai khoảng thời gian cho dù có rơi vào các ngày lễ vẫn được tính để trừ đi. (coi như nghỉ bù) nên vấn đề này vẫn đc giải quyết ổn thỏa bác ạh !


hoangdanh282vn đã viết:
Được bác à. Đây là giải pháp vì thế tất nhiên là VBA sẽ được ứng dụng nhiều. Tuy nhiên có công thức thì càng ok.
Công thức so với công thức, VBA so với VBA

DOSNET đã viết:
*Giải pháp của mình là :
Tống số buổi = (tổng số ngày giữa hai khoảng thời gian)*2 +1
Trong đó: phải trừ đi số buổi :
- trừ (tổng số ngày chủ nhật)*2
- trừ tổng số ngày Thứ 7
- Trừ ngày lễ (4*2)
Việc chính là đếm được có bao nhiêu ngày T7, CN trong khoảng thời gian đã cho !

-----------------
Do lỗi mạng nên trật tự các bài bị đảo lộn.
Xin phép sắp xếp lại.
BNTT
 
Chỉnh sửa lần cuối bởi điều hành viên:
Còn giải pháp của mình là:
Cái này, dùng hàm NETWORKDAYS() thì sẽ tính được số ngày làm việc giữa hai khoảng thời gian, trừ đi các ngày thứ Bảy, Chủ Nhật và mấy cái ngày nghỉ lễ.
Ở đây có thêm chuyện làm 1/2 ngày thứ Bảy, do đó hướng giải quyết là tìm xem trong khoảng từ 1/6/1980 đến 29/02/2008 có bao nhiêu ngày thứ Bảy, rồi lấy con số này nhân với 1/2, sẽ có một kết quả.
Xong lấy kết quả đó cộng với kết quả của NETWORKDAYS() sẽ có đáp số cuối cùng.
 
Giải pháp thì chắc là nhiều, chúng ta hãy gửi bài của mình lên xem cách ai ngắn gọn và chạy nhanh nhất, không dùng name hay cột phụ, test thử cho 100 nhân viên
 
Mình có một câu hỏi này, mời các bạn cùng tham gia tìm giải pháp :
Tính số ngày công (2 buổi/ngày) làm việc của một nhân viên từ ngày 01/06/1980 đến ngày 29/02/2008.
Biết rằng ngày CN nghỉ, ngày thứ bảy làm 1/2 ngày, có 4 ngày nghỉ lễ là 01/01,30/04,01/05,02/09

Góp ý thêm:
Mấu chốt vấn đề có thể là phải tạo mảng một chiều chứa tất cả các phần tử là ngày giữa hai mốc thời gian. Ví dụ: MyRng={"01/06/1980","02/06/1980",.....,"28/02/2008","29/02/2008"}
Còn tất cả các vấn đề khác thì đơn giản rồi.
 
Tôi hay tính thời gian bao gồm cả thứ bẩy và chủ nhật như sau:
Thời gian bắt đầu (tháng/ngày/năm) tại ô A1
Thời gian kết thúc (tháng/ngày/năm) tại ô A2

Kết quả ở ô A3:
=DATEDIF(A1;A2;"Y") & " năm " & DATEDIF(A1;A2;"M")-DATEDIF(A1;A2;"Y")*12 & " tháng " & DATEDIF(A1;A2;"MD") & " ngày"
Chi tiết hơn thì kết quả số năm trong ô A4: =DATEDIF(A1;A2;"Y")
Kết quả số tháng: A5=DATEDIF(A1;A2;"M")-A4*12
Kết quả số ngày: A6=DATEDIF(B15;B16;"MD")

Còn tính chính xác số ngày thì dùng hàm NETWORKDAYS() thì sẽ tính được số ngày làm việc giữa hai khoảng thời gian, trừ đi các ngày thứ Bảy, Chủ Nhật và mấy cái ngày nghỉ lễ như bạn BNTT nói.
 
Công thức của mình như sau: (A1 là ngày bắt đầu, A2 là ngày kết thúc):
=(A2-A1)-(SUMPRODUCT(--(WEEKDAY(ROW(INDIRECT(VALUE(A1)&":"&VALUE(A2))),1)=1)))-(SUMPRODUCT(--(WEEKDAY(ROW(INDIRECT(VALUE(A1)&":"&VALUE(A2))),1)=7))/2)-(SUMPRODUCT(--((DAY(ROW(INDIRECT(VALUE(A1)&":"&VALUE(A2))))=1)*MONTH(ROW(INDIRECT(VALUE(A1)&":"&VALUE(A2))))=1))+SUMPRODUCT(--((DAY(ROW(INDIRECT(VALUE(A1)&":"&VALUE(A2))))=30)*MONTH(ROW(INDIRECT(VALUE(A1)&":"&VALUE(A2))))=4))+SUMPRODUCT(--((DAY(ROW(INDIRECT(VALUE(A1)&":"&VALUE(A2))))=1)*MONTH(ROW(INDIRECT(VALUE(A1)&":"&VALUE(A2))))=5))+SUMPRODUCT(--((DAY(ROW(INDIRECT(VALUE(A1)&":"&VALUE(A2))))=2)*MONTH(ROW(INDIRECT(VALUE(A1)&":"&VALUE(A2))))=9)))

Do lười đặt tên nên ct hơi dài. Mình không dùng Networkdays vì phải có thêm cột phụ, và sẽ hơi khó tính nếu ngày lễ trùng vào t7, CN.

Kết quả cuối cùng là 7852.5 ngày!
 
Lần chỉnh sửa cuối:
Tôi hay tính thời gian bao gồm cả thứ bẩy và chủ nhật như sau:
Thời gian bắt đầu (tháng/ngày/năm) tại ô A1
Thời gian kết thúc (tháng/ngày/năm) tại ô A2

Kết quả ở ô A3:
=DATEDIF(A1;A2;"Y") & " năm " & DATEDIF(A1;A2;"M")-DATEDIF(A1;A2;"Y")*12 & " tháng " & DATEDIF(A1;A2;"MD") & " ngày"
Chi tiết hơn thì kết quả số năm trong ô A4: =DATEDIF(A1;A2;"Y")
Kết quả số tháng: A5=DATEDIF(A1;A2;"M")-A4*12
Kết quả số ngày: A6=DATEDIF(B15;B16;"MD")

Còn tính chính xác số ngày thì dùng hàm NETWORKDAYS() thì sẽ tính được số ngày làm việc giữa hai khoảng thời gian, trừ đi các ngày thứ Bảy, Chủ Nhật và mấy cái ngày nghỉ lễ như bạn BNTT nói.
Thực tế bài này không đơn giản như bạn nghĩ...hãy bắt tay vào làm và cho biết kết quả. Thân !
 
Mình có một câu hỏi này, mời các bạn cùng tham gia tìm giải pháp :
Tính số ngày công (2 buổi/ngày) làm việc của một nhân viên từ ngày 01/06/1980 đến ngày 29/02/2008.
Biết rằng ngày CN nghỉ, ngày thứ bảy làm 1/2 ngày, có 4 ngày nghỉ lễ là 01/01,30/04,01/05,02/09

Mình xin được nói thêm.
Do đây là giải pháp nên các bạn có thể làm thế này tùy thích, miễn sao chạy đúng là được, kể cả VBA.
Nếu ngày thứ 7 trùng vào ngày lễ thì coi như không đi làm. còn vấn đề nghỉ bù thì chưa quan tâm tới
 
Tôi xin làm kiểu củ chuối nhé, không phải là cách làm hay đâu, nhưng có thể dùng để kiểm tra cái đáp số của các bạn:
Mình có một câu hỏi này, mời các bạn cùng tham gia tìm giải pháp :
Tính số ngày công (2 buổi/ngày) làm việc của một nhân viên từ ngày 01/06/1980 đến ngày 29/02/2008.
Biết rằng ngày CN nghỉ, ngày thứ bảy làm 1/2 ngày, có 4 ngày nghỉ lễ là 01/01,30/04,01/05,02/09

Tôi làm nguyên một dãy (làm một ngày rồi fill down xuống) có tên là NGAY, từ A1:A10135, trong đó:
  • A1="01/6/1980" (đặt tên là Ngaydau)

  • A10135="29/2/2008" (đặt tên là Ngaycuoi)

  • Công thức tính số ngày làm việc trong khoảng thời gian từ ngày 01/06/1980 đến ngày 29/02/2008 (đã trừ đi thứ Bảy và Chủ Nhật):

    = NETWORKDAYS(Ngaydau, Ngaycuoi) = 7240 (ngày)


  • Công thức đếm các ngày thứ Bảy trong khoảng thời gian đó:

    {=SUM(IF(WEEKDAY(NGAY)=7,1,0))} = 1447 (ngày)


  • Công thức đếm các ngày 01/01 (mà không phải là thứ Bảy hay Chủ Nhật):

    =SUMPRODUCT((DAY(NGAY)=1)*(MONTH(NGAY)=1)*(WEEKDAY(NGAY)<>7)*(WEEKDAY(NGAY)<>1)) = 20 (ngày)


  • Công thức đếm các ngày 30/4 (mà không phải là thứ Bảy hay Chủ Nhật):

    =SUMPRODUCT((DAY(NGAY)=30)*(MONTH(NGAY)=4)*(WEEKDAY(NGAY)<>7)*(WEEKDAY(NGAY)<>1)) = 19 (ngày)


  • Công thức đếm các ngày 01/5 (mà không phải là thứ Bảy hay Chủ Nhật):

    =SUMPRODUCT((DAY(NGAY)=1)*(MONTH(NGAY)=5)*(WEEKDAY(NGAY)<>7)*(WEEKDAY(NGAY)<>1)) = 19 (ngày)


  • Công thức đếm các ngày 02/9 (mà không phải là thứ Bảy hay Chủ Nhật):

    =SUMPRODUCT((DAY(NGAY)=2)*(MONTH(NGAY)=9)*(WEEKDAY(NGAY)<>7)*(WEEKDAY(NGAY)<>1)) = 20 (ngày)

Ghép hết chúng lại với nhau:
= 7240 + 1447/2 - (20+19+19+20) = 7885.5 ngày

--------------------
@ Bạn dongdv: Bạn làm gần đúng rồi đó.
Chỉ cần để ý thêm có những ngày 1/1, 30/4, 1/5, và 2/9 trùng với ngày Chủ Nhật hoặc Thứ Bảy, do đó bạn đã trừ "nhiều" hơn là thực tế (ví dụ, bạn đã trừ một ngày 01/1/1984, rồi lại trừ thêm 1 ngày Chủ Nhật 01/1/1984 nữa, thành ra trừ mất 2 ngày), và kết quả là đáp số của bạn (7852.5) ít hơn của tôi.


-------------
Nói thêm tí nữa, theo tôi nghĩ, nếu không dùng VBA, thì bài này nên dùng những ô riêng chứa từng công thức nhỏ như tôi trình bày ở trên.
Vì nếu ghép thành một công thức duy nhất thì cũng được (như của bạn dongdv đã làm) nhưng nếu là để chia sẻ cho nhau, thì hóa ra lại là đánh đố nhau thôi.
Nếu không có môt trình độ nào đó nhất định, thì không thể nào hiểu được một cái công thức dài chừng nửa mét (!), huống hồ là cái công thức duy nhất cho bài toán này. Đó là chưa tính cái khoản nghỉ bù à! Và những thứ như: một năm thì có nhiêu ngày phép, rồi còn Tết Nguyên Đán, còn Giỗ Tổ Hùng Vương, v.v... Đã lảm thì làm tới nơi, mà nếu nhét hết tất cả vào trong một công thức thì có mà chết!

"Đường nào thì cũng đến La Mã", có đường gần, đường xa, đường dễ, đường khó... Tôi thì hay chọn đường dễ đi, dễ quay lại khi lạc đường, chứ ít khi tôi chọn đường tắt lắm, vì đường tắt thì có ngắn thật, nhưng lỡ lạc đường muốn quay lại thì chẳng biết đâu mà lần!
 
Lần chỉnh sửa cuối:
- Có thể đếm số ngày thứ 7 và CN như sau cho đơn giản hơn
Nhập ngày đầu vào A1 và ngày cuối vào B1 Đặt các name :
DAU=WEEKDAY($A2) {ngày đầu}

CUOI=WEEKDAY($B2) {ngày cuối}

NGHI=$B2-$A2+1-NETWORKDAYS($A2,$B2) {tổng số ngày nghỉ bao gồm cả T7 và CN}

T7=IF(AND(DAU<>1,CUOI=7),(NGHI+1)/2,IF(AND(DAU=1,CUOI<>7),(NGHI-1)/2,NGHI/2)) { số ngày T7}

CN= NGHI-THU7 {số ngày CN}
 

File đính kèm

Lần chỉnh sửa cuối:
DOSNET cho hỏi tí.
Vậy kết quả là bao nhiêu ngày công?
Kết quả nằm ở nơi cột C à?
Nghĩa là nó = ($B2-$A2-CN-NLE)*2-THU7 = 15709 ?
Sao nhiều thế?
Từ ngày 01/6/1980 đến ngày 29/2/2008 chỉ có 10134 ngày thôi mà?
 
Đó là số buổi bác ah, lấy (số buổi) /2 ra ngày công !
 
Lần chỉnh sửa cuối:
- Nếu thực tế là phải được nghỉ bù, bài của em cũng phải sửa lại một tý về cách tính ngày lễ. Do không sử dụng mảng nên phải tính theo cách sau :
- Tính tổng số năm trong khoảng thời gian
- Tính số ngày nghỉ lễ năm đầu (xác định thời điểm bắt đầu nằm trong đoạn nào của các ngày lễ)
- Tính số ngày nghỉ lễ năm cuối. ( xác định thời điểm kết thúc nằm trong đoạn nào của các ngày lễ)
--> Số ngày lễ = (Tổng số năm -2)*4 + số ngày lễ năm đầu + Số ngày lễ năm cuối
Tuy nhiên nếu vận dụng được mảng sẽ tính chi tiết và chính xác hơn nhưng chắc chắn tốc độ sẽ rùa bò ( bài của e với 1000 dòng ko thấy độ trễ tính toán)
------------------
P/s : Khó quá... ngồi chờ sung rụng vậy !
 
- Nếu thực tế là phải được nghỉ bù, bài của em cũng phải sửa lại một tý về cách tính ngày lễ. Do không sử dụng mảng nên phải tính theo cách sau :
- Tính tổng số năm trong khoảng thời gian
- Tính số ngày nghỉ lễ năm đầu (xác định thời điểm bắt đầu nằm trong đoạn nào của các ngày lễ)
- Tính số ngày nghỉ lễ năm cuối. ( xác định thời điểm kết thúc nằm trong đoạn nào của các ngày lễ)
--> Số ngày lễ = (Tổng số năm -2)*4 + số ngày lễ năm đầu + Số ngày lễ năm cuối
Tuy nhiên nếu vận dụng được mảng sẽ tính chi tiết và chính xác hơn nhưng chắc chắn tốc độ sẽ rùa bò ( bài của e với 1000 dòng ko thấy độ trễ tính toán)
------------------
P/s : Khó quá... ngồi chờ sung rụng vậy !

Hic... làm kiểu của mình đi, chia nhỏ ra, tính từng phần, rồi cộng kết quả lại.
Nhanh lắm à, không rùa đâu.
Mà đọc lại kỹ đề thì bài của mình cũng chưa đúng
Bỏ sót mất cái này: "Nếu ngày lễ là thứ Bảy thì nghỉ luôn, không có làm 1/2 ngày" !
Để mình sửa lại cái đã.
 
Hic... làm kiểu của mình đi, chia nhỏ ra, tính từng phần, rồi cộng kết quả lại.
Nhanh lắm à, không rùa đâu.
Mà đọc lại kỹ đề thì bài của mình cũng chưa đúng
Bỏ sót mất cái này: "Nếu ngày lễ là thứ Bảy thì nghỉ luôn, không có làm 1/2 ngày" !
Để mình sửa lại cái đã.
Nếu được show dữ liệu ra thì bài của bác là tương đối chính xác. Tính cho 500 nhân viên thì không đủ cột để nhập ! Khó ở chỗ nhập liệu ! chỉ nhập ngày đầu và ngày cuối-->ra kết quả !
 
Nếu được show dữ liệu ra thì bài của bác là tương đối chính xác. Tính cho 500 nhân viên thì không đủ cột để nhập ! Khó ở chỗ nhập liệu ! chỉ nhập ngày đầu và ngày cuối-->ra kết quả !
Ôi... lại không đọc kỹ đề bài nữa rồi.
Tính số ngày công (2 buổi/ngày) làm việc của một nhân viên từ ngày 01/06/1980 đến ngày 29/02/2008.
Biết rằng ngày CN nghỉ, ngày thứ bảy làm 1/2 ngày, có 4 ngày nghỉ lễ là 01/01,30/04,01/05,02/09
Với cái đề bài như thế này thì nếu muốn tính lương cho 500 người, chỉ việc lấy số ngày công nhân với 500 rồi nhân với tiền thôi!

Quay lại chuyện lúc nãy, do tác giả thêm cái này:
Mình xin được nói thêm.
Do đây là giải pháp nên các bạn có thể làm thế này tùy thích, miễn sao chạy đúng là được, kể cả VBA.
Nếu ngày thứ 7 trùng vào ngày lễ thì coi như không đi làm. còn vấn đề nghỉ bù thì chưa quan tâm tới
Nên mình phải thêm một cái SUMPRODUCT nữa để tính những ngày lễ trùng với ngày thứ Bảy:

Ví dụ cho ngày 1/1:
= SUMPRODUCT((DAY(NGAY)=1)*(MONTH(NGAY)=1)*(WEEKDAY(NGAY)=7))​

Cả 4 ngày: 1/1, 30/4, 1/5 và 2/9, mỗi cái đều cho ra kết quả là 4, nghĩa là có 4 x 4 = 16 ngày nghỉ lễ trùng với thứ Bảy.

Vậy, đáp số đúng là (các bạn chịu khó dò với bài lúc nãy của tôi nghe):

Lấy số ngày làm của hàm NETWORKDAYS (=7240), cộng thêm tổng số ngày thứ bảy mà trừ bớt đi 16 rồi chia 2 (= (1447 - 16)/2 = 715.5), rồi trừ đi tổng số ngày nghỉ rơi vào những ngày thường trong tuần (= 20 + 19 + 19 + 20 = 78):
7240 + 715.5 - 78 = 7877.5
Có đúng không Hoàng Danh ơi?
 
Lần chỉnh sửa cuối:
Với cái đề bài như thế này thì nếu muốn tính lương cho 500 người, chỉ việc lấy số ngày công nhân với 500 rồi nhân với tiền thôi!

Chẳng nhẽ 500 ông nhân viên vào cùng một ngày, "ra đi" một ngày sao bác. Dù là bài toán thách đố cũng nên thực tế để ứng dụng được chứ ?
 

Ôi... lại không đọc kỹ đề bài nữa rồi.

Với cái đề bài như thế này thì nếu muốn tính lương cho 500 người, chỉ việc lấy số ngày công nhân với 500 rồi nhân với tiền thôi!

Quay lại chuyện lúc nãy, do tác giả thêm cái này:

Nên mình phải thêm một cái SUMPRODUCT nữa để tính những ngày lễ trùng với ngày thứ Bảy:

Ví dụ cho ngày 1/1:
= SUMPRODUCT((DAY(NGAY)=1)*(MONTH(NGAY)=1)*(WEEKDAY(NGAY)=7))​

Cả 4 ngày: 1/1, 30/4, 1/5 và 2/9, mỗi cái đều cho ra kết quả là 4, nghĩa là có 4 x 4 = 16 ngày nghỉ lễ trùng với thứ Bảy.

Vậy, đáp số đúng là (các bạn chịu khó dò với bài lúc nãy của tôi nghe):

Lấy số ngày làm của hàm NETWORKDAYS (=7240), cộng thêm tổng số ngày thứ bảy mà trừ bớt đi 16 rồi chia 2 (= (1447 - 16)/2 = 715.5), rồi trừ đi tổng số ngày nghỉ rơi vào những ngày thường trong tuần (= 20 + 19 + 19 + 20 = 78):
7240 + 715.5 - 78 = 7877.5
Có đúng không Hoàng Danh ơi?

Em cũng không chắc nữa anh à, có nhiều kết quả khác nhau và em cũng không chắc chắn rằng kết quả của em là chính xác, tối nay về test lại và chứng minh từng khúc đã.
- Đã làm thì làm cho tới luôn :
Tính số ngày công làm việc của 1 nhân viên từ ngày 01/06/1980 đến ngày 29/02/2008, biết rằng ngày thứ 7 làm 1/2 ngày, có 4 ngày nghỉ lễ, đó là 01/01; 30/04; 01/05; 02/09. Nếu ngày chủ nhật trùng với ngày nghỉ lễ thì sẽ tính công cho ngày này. Ngày thứ 7 trùng vào ngày nghỉ lễ thì được nghỉ lễ bình thường (ngày thứ 7 xem như là ngày làm việc bình thường, nhưng chỉ làm 1/2 ngày).
- Làm hoàn thành sẽ tính cho danh sách 100 nhân viên với ngày vào làm việc và ngày nghỉ khác nhau.
Hy vọng nhận được giải pháp từ các Bác VBA.
 
Nếu bài này dùng VBA thì tôi nghĩ không khó lắm, vòng lập For quét qua toàn bộ ngày rồi đặt d/k là ra!
Dùng công thức cũng không phải là không được, tôi đang tính nhưng chưa hài lòng vì giãi pháp dùng mãng khá nặng
 
Em góp vui với :

Giả sử rằng các ngày lễ nếu trùng vào T7 thì vẫn được tính là nghỉ 1,5 ngày. Nếu trùng vào CN thì được tính là nghỉ 2 ngày.

Ta có 2 UDF sau :

Theo kiểu truyền thống : Quét từ đàu đến cuối : Hơi lâu

PHP:
Function NgayCong(NgayDau As Date, NgayCuoi As Date) As Double
    If NgayDau > NgayCuoi Then Exit Function
    Application.Volatile (False)
    Dim i As Long, NgayGiam As Double
    For i = NgayDau To NgayCuoi
        ' Xet Ngay T7 va ngay Chu Nhat
        If Weekday(i, vbSunday) = 7 Then
            NgayGiam = NgayGiam + 0.5
        ElseIf Weekday(i, vbSunday) = 1 Then
            NgayGiam = NgayGiam + 1
        End If
        'Cac ngay duoc nghi 01/01,30/04,01/05,02/09
        Select Case Format(i, "dd/mm")
        Case "01/01", "30/04", "01/05", "02/09"
            NgayGiam = NgayGiam + 1
        End Select
    Next
    NgayCong = WorksheetFunction.Max(NgayCuoi - NgayDau + 1 - NgayGiam, 0)
End Function





Theo kiểu khác : Nhanh hơn (chưa phải là nhất)
PHP:
Function NC(NgayDau As Date, NgayCuoi As Date) As Double
    If NgayDau > NgayCuoi Then Exit Function
    Application.Volatile (False)
    Dim i As Long, NgayGiam As Double, iLe As Byte, Ngay As Date
    Dim SoTuan As Integer
    
    SoTuan = Int((NgayCuoi - NgayDau) / 7)
    NC = SoTuan * 5.5 + (NgayCuoi - (NgayDau + SoTuan * 7) + 1)
    
    ' Xet Ngay T7 va ngay Chu Nhat
    For i = NgayDau + SoTuan * 7 To NgayCuoi
        
        If Weekday(i, vbSunday) = 7 Then
            NgayGiam = NgayGiam + 0.5
        ElseIf Weekday(i, vbSunday) = 1 Then
            NgayGiam = NgayGiam + 1
        End If
    Next
    'Cac ngay duoc nghi 01/01,30/04,01/05,02/09
     ' Xet cac nam
    For i = Year(NgayDau) To Year(NgayCuoi)
        For iLe = 1 To 4
            Ngay = Choose(iLe, DateSerial(i, 1, 1), _
                    DateSerial(i, 4, 30), DateSerial(i, 5, 1), _
                    DateSerial(i, 9, 2))
            If Ngay >= NgayDau And Ngay <= NgayCuoi Then
                NgayGiam = NgayGiam + 1
            ElseIf Ngay > NgayCuoi Then
                GoTo thoat
            End If
        Next
    Next
thoat:
    NC = WorksheetFunction.Max(NC - NgayGiam, 0)
End Function



Than!
 

File đính kèm

Lần chỉnh sửa cuối:
Em nhẩm ra con số chính xác:
Từ 1-6-1980 đến ngày 29-2-2008 là 10134 ngày
(Từ 1-6-1980 đến hết ngày 29-2-2008 là 10135 ngày)
Trong đó:
  1. 1448 ngày chủ nhật
  2. 1447 ngày thứ 7
  3. 110 ngày lễ (1-1, 30-4, 1-5, 2-9)
    • 28 ngày 1-1
    • 27 ngày 30-4
    • 27 ngày 1-5
    • 28 ngày 2-9
  4. 16 ngày lễ trùng với ngày thứ 7
    • 4 ngày 1-1
    • 4 ngày 30-4
    • 4 ngày 1-5
    • 4 ngày 2-9
  5. 16 ngày lễ trùng với ngày chủ nhật
    • 4 ngày 1-1
    • 4 ngày 30-4
    • 4 ngày 1-5
    • 4 ngày 2-9
Vậy theo các bác tổng số ngày công là bao nhiêu?
 
Lần chỉnh sửa cuối:
Mình lập thử 1 bảng ngày lễ từ năm 1980 -> 2008 (NgayLe) và lập 1 list ngày từ 01/06/1980 -> 29/02/2008. Và dùng hàm if kết hợp countif thì ra tổng số ngày là
7877,5 nếu không tính CN = Lễ
7893,5 nếu tính CN = Lễ (trong khỏang TG trên có 16 ngày lễ là CN)
Theo bảng kèm theo.
Và làm thử 1 code Sobuoi và SoBuoiNL (chưa gọt) nhưng thấy dài dòng quá, các bạn giúp cải tiến lại hộ. Và test có đúng không.
Cám ơn nhiều.
Thông cảm file nặng do có > 10.000 row có ct.
 

File đính kèm

Em cũng không chắc nữa anh à, có nhiều kết quả khác nhau và em cũng không chắc chắn rằng kết quả của em là chính xác, tối nay về test lại và chứng minh từng khúc đã.
- Đã làm thì làm cho tới luôn :
Tính số ngày công làm việc của 1 nhân viên từ ngày 01/06/1980 đến ngày 29/02/2008, biết rằng ngày thứ 7 làm 1/2 ngày, có 4 ngày nghỉ lễ, đó là 01/01; 30/04; 01/05; 02/09. Nếu ngày chủ nhật trùng với ngày nghỉ lễ thì sẽ tính công cho ngày này. Ngày thứ 7 trùng vào ngày nghỉ lễ thì được nghỉ lễ bình thường (ngày thứ 7 xem như là ngày làm việc bình thường, nhưng chỉ làm 1/2 ngày).
- Làm hoàn thành sẽ tính cho danh sách 100 nhân viên với ngày vào làm việc và ngày nghỉ khác nhau.
Hy vọng nhận được giải pháp từ các Bác VBA.

Cần rõ hơn xíu : Nếu đi làm :
  1. Ngày bình thường : Được tính 1 công
  2. Ngày Thứ 7 : được tính 0,5 công
  3. Ngày CN (dĩ nhiên là không đi làm) : 0 công
Nếu là ngày lễ :
  1. Ngày bình thường : Được tính thêm 1 công
  2. Ngày Thứ 7 : được tính thêm 0,5 công
  3. Ngày CN (dĩ nhiên là không đi làm) : 1 công
Như thế có đúng không nhỉ ???

Thân!
 
Nếu dùng UDF để tính công thì theo tôi nên thêm 1 tham số nửa: Holiday As String
Như vậy sẽ tăng thêm sức mạnh cho hàm
1/1 chỉ cần gỏ 0101
30/4 chỉ cần gỏ 3004
1/5 chỉ cần gỏ 0105
2/9 chỉ cần gỏ 0209

Là đủ (đở mất công nhầm)
Tôi dùng công thức mãng cũng dựa trên cách này, rất dể dàng
=IF(Text(...... ,"ddmm")="3004",......)
(Vớicông thức thì tham số này tôi cho vào name)
 
Em cũng không chắc nữa anh à, có nhiều kết quả khác nhau và em cũng không chắc chắn rằng kết quả của em là chính xác, tối nay về test lại và chứng minh từng khúc đã.
- Đã làm thì làm cho tới luôn :
Tính số ngày công làm việc của 1 nhân viên từ ngày 01/06/1980 đến ngày 29/02/2008, biết rằng ngày thứ 7 làm 1/2 ngày, có 4 ngày nghỉ lễ, đó là 01/01; 30/04; 01/05; 02/09. Nếu ngày chủ nhật trùng với ngày nghỉ lễ thì sẽ tính công cho ngày này. Ngày thứ 7 trùng vào ngày nghỉ lễ thì được nghỉ lễ bình thường (ngày thứ 7 xem như là ngày làm việc bình thường, nhưng chỉ làm 1/2 ngày).
- Làm hoàn thành sẽ tính cho danh sách 100 nhân viên với ngày vào làm việc và ngày nghỉ khác nhau.
Hy vọng nhận được giải pháp từ các Bác VBA.
Tôi thì lại xin góp ý như vầy cho chuyện làm tới nơi:
Trong thực tế chắc chẳng có công ty nào mà dồn ngày công của nhân viên từ năm 1980 đến năm 2008 mới ngồi mà tính sổ. Cho nên nếu cứ phải đi dò theo kiểu xuyên năm, xuyên thế kỷ vầy, mà không áp dụng được, thì có nên không?

Nên chăng chúng ta chỉ tập trung làm chuyện tính ngày công cho một nhân viên trong thời hạn tối đa là 1 năm mà thôi.
Trong trường hợp lỡ như mà có phải tính lại các năm trước, thì vẫn tính theo từng năm, sau đó cộng lại.
Thiết nghĩ như vậy thực tế hơn, và có thể áp dụng vào thực tế được.
 
Nên chăng chúng ta chỉ tập trung làm chuyện tính ngày công cho một nhân viên trong thời hạn tối đa là 1 năm mà thôi.
Trong trường hợp lỡ như mà có phải tính lại các năm trước, thì vẫn tính theo từng năm, sau đó cộng lại.
Thiết nghĩ như vậy thực tế hơn, và có thể áp dụng vào thực tế được.
Đúng là làm từng năm thì đơn giản nhất, nhưng ta cứ xem đây là 1 bài toán đi
Cùng nhau tìm giãi pháp là điều kiện tốt nhất cho ta học hỏi thêm thuật toán
 
Trước hết mình tham gia ý kiến,nếu tính công làm việc từ ngày 1/6/1980 đến 29/2/2008 thì các bạn nên tính tổng số ngày từ 1/6/1980 đến 29/2/2008 là 10135 ngày ,rồi trên cơ sở đó sẽ tính số công làm việc cụ thể theo từng điều kiện không thì họ kiện đó,dám ăn bớt ngày công của họ
 
Bác BNTT test lại hộ đáp số nào là chính xác cái, làm xuyên thế kỷ khó test quá.
Cám ơn Bác nhiều. Cái vụ này mà làm = Ct thì nên dùng cột phụ nhiều là dễ hiểu.
 
Thunghi đã viết:
BNTT test lại hộ đáp số nào là chính xác cái, làm xuyên thế kỷ khó test quá.
Em xin tính lại theo cái đề mới nhất (và cũng mong là sau cùng) này:
hoangdanh282vn đã viết:
- Đã làm thì làm cho tới luôn :
Tính số ngày công làm việc của 1 nhân viên từ ngày 01/06/1980 đến ngày 29/02/2008, biết rằng ngày thứ 7 làm 1/2 ngày, có 4 ngày nghỉ lễ, đó là 01/01; 30/04; 01/05; 02/09. Nếu ngày chủ nhật trùng với ngày nghỉ lễ thì sẽ tính công cho ngày này. Ngày thứ 7 trùng vào ngày nghỉ lễ thì được nghỉ lễ bình thường (ngày thứ 7 xem như là ngày làm việc bình thường, nhưng chỉ làm 1/2 ngày).
Đây là các đầu vào:
  • Số ngày có trong khoảng thời gian từ ngày 01/06/1980 đến ngày 29/02/2008 là 10.135 ngày
  • Số ngày thứ Bảy có trong 10.135 ngày nói trên = 1.447 ngày
  • Số ngày Chủ Nhật có trong 10.135 ngày nói trên = 1.448 ngày
  • Số ngày nghỉ lễ: 1/1 (28 ngày), 30/4 (27 ngày), 1/5 (27 ngày) và 2/9 (28 ngày), tổng cộng = 110 ngày
  • Số ngày nghỉ lễ trùng với thứ Bảy: mỗi loại 4 ngày, tổng cộng = 16 ngày
  • Số ngày nghỉ lễ trùng với Chủ Nhật: mỗi loại cũng 4 ngày, tổng cộng = 16 ngày


Tính từng bước một theo đề bài (như làm toán lớp 6 vậy):
  • Số công bình thường (chưa thêm bớt):
    = 10.135 (ngày) - 1.448 (CN) - 1.447 (T7) = 7.240 công
    (cái này dùng hàm NETWORKDAYS cũng cho ra kết quả tương tự)

  • Số ngày nghỉ lễ sau khi trừ đi các ngày trùng với Chủ Nhật và Thứ Bảy:
    = 110 - 16 - 16 = 78 ngày
    Vậy số công còn lại để tính là:
    = 7.240 - 78 = 7.162 công

  • Số ngày thứ Bảy trùng với ngày nghỉ lễ là 16 ngày, vì sẽ được nghỉ nguyên ngày như ngày nghỉ lễ, nên số ngày thứ bảy sẽ được tính 1/2 công còn lại là:
    = 1.447 - 16 = 1.431 ngày

    và số công được tính cho những ngày thứ Bảy là:
    = 1.431 x 1/2 = 715,5 ngày

    vậy số công bi giờ sẽ là:
    = 7.162 + 715.5 = 7.877,5 công

  • Vì ngày Chủ nhật mà trùng với ngày nghỉ lễ (16 ngày) thì được tính 1 công, do đó số công sẽ tăng thêm, và đây là kết quả cuối cùng:
    = 7.877,5 + 16 = 7.893,5 công
 
Lần chỉnh sửa cuối:
Cám ơn nhưng chưa đúng lắm sẽ sửa lại code
Còn ct minh sẽ làm như sau
Bây giờ mình làm ct thử xem
1/ Ngày lễ: 2 công
2/ Ngày lễ = thứ bảy: 2 công (đương nhiên rồi)
Ta có
A2: ngaydau: 01/06/1980
B2: ngaycuoi: 29/02/2008
Tạo 1 name tạm cho ngắn bớt
eDay=ROW(INDIRECT(VALUE(ct!$A$2)&":"&VALUE(ct!$B$2)))
1/ Số công chưa tính NL, T7, CN: ($B$2-$A$2+1)*2
2/ Số CN:
=SUMPRODUCT(--(WEEKDAY(eDay)=1))
3/ Số CN là NL =SUMPRODUCT(--(NOT(ISNA(MATCH(TEXT(eDay,"ddmm"),{"0101";"3004";"0105";"0209"},0)))),--(WEEKDAY(eDay)=1))
4/ Số công CN mà khác NL (2) - (3) =SUMPRODUCT(--(1-NOT(ISNA(MATCH(TEXT(eDay,"ddmm"),{"0101";"3004";"0105";"0209"},0)))),--(WEEKDAY(eDay)=1))*2
...
tương tự
5/ Số công TB mà khác NL =SUMPRODUCT(--(1-NOT(ISNA(MATCH(TEXT(eDay,"ddmm"),{"0101";"3004";"0105";"0209"},0)))),--(WEEKDAY(eDay)=7))
6/ Số công NL là
=SUMPRODUCT(--(NOT(ISNA(MATCH(TEXT(eDay,"ddmm"),{"0101";"3004";"0105";"0209"},0)))))*2

Từ đó => số công trừ T7, CN, NL, nếu NL là T7 thì 2 công là:
(1) - (4) -(5) : là

=($B$2-$A$2+1)*2-SUMPRODUCT(--(1-NOT(ISNA(MATCH(TEXT(eDay,"ddmm"),{"0101";"3004";"0105";"0209"},0)))),--(WEEKDAY(eDay)=1))*2-SUMPRODUCT(--(1-NOT(ISNA(MATCH(TEXT(eDay,"ddmm"),{"0101";"3004";"0105";"0209"},0)))),--(WEEKDAY(eDay)=7))
Đáp số là 15.975/2 =7987,5 ngày
 
1/ Ngày lễ: 2 công
2/ Ngày lễ = thứ bảy: 2 công (đương nhiên rồi)
Ủa đề bài của Hoàng Danh đâu có nói chuyện này anh ?
hoangdanh282vn đã viết:
- Đã làm thì làm cho tới luôn :
Tính số ngày công làm việc của 1 nhân viên từ ngày 01/06/1980 đến ngày 29/02/2008, biết rằng ngày thứ 7 làm 1/2 ngày, có 4 ngày nghỉ lễ, đó là 01/01; 30/04; 01/05; 02/09. Nếu ngày chủ nhật trùng với ngày nghỉ lễ thì sẽ tính công cho ngày này. Ngày thứ 7 trùng vào ngày nghỉ lễ thì được nghỉ lễ bình thường (ngày thứ 7 xem như là ngày làm việc bình thường, nhưng chỉ làm 1/2 ngày).
 
Ủa đề bài của Hoàng Danh đâu có nói chuyện này anh ?
Thì tính trừ lại số T7 là NL: 16 ngày, NL mà trùng T7 tính 1/2 buồn lắm đó.
Lúc này sẽ quan tâm CN trùng NL là bao nhiêu ngày
Lấy SN*2 - TB*1 - (CN-NL(trùng CN))*2
 
Đây là cái bảng tính minh họa cho những gì tôi viết ở bài #34.
Đáp số vẫn là 7893,5 ngày.
 

File đính kèm

Theo em hiểu thì như thế này, các Bác cho ý kiến nha.
Số ngày công từ thứ 2->6 :
=networkdays(Sheet2!$A1,Sheet2!$B1)
: 7240 ngày
Số ngày công thứ 7 :
=SUMPRODUCT(--(WEEKDAY(tg)=7))/2
: 723.5 ngày
=> Số ngày công từ thứ 2->7 : 7963.5 ngày
Số ngày nghỉ lễ :
=(SUMPRODUCT((DAY(tg)=1)*(MONTH(tg)=1)+(DAY(tg)=30)*(MONTH(tg)=4)+(DAY(tg)=1)*(MONTH(tg)=5)+(DAY(tg)=2)*(MONTH(tg)=9)))
: 110 ngày
Với
tg=ROW(INDIRECT(Sheet2!$A1&":"&Sheet2!$B1))
Nếu ngày lễ trùng vào ngày thứ 7 thì đương nhiên là người lao động được nghỉ bình thường, và chế độ cũng như các ngày khác.
Nếu ngày CN trùng vào ngày lễ trùng và CN thì người lao động được nghỉ bù vào một ngày nào đó và dĩ nhiên là đã nghỉ rồi, vậy cứ coi như đây là một ngày nghỉ lễ như các ngày khác trong tuần.
Như vậy : số ngày công sẽ là số ngày làm việc từ thứ 2->7 trừ cho số ngày nghỉ lễ là ổn rồi.
7963.5-110=7853.5 ngày
Các anh xem coi có đúng vậy không
 

File đính kèm

Lần chỉnh sửa cuối:
Theo em hiểu thì như thế này, các Bác cho ý kiến nha.
Số ngày công từ thứ 2->6 :
=networkdays(Sheet2!$A1,Sheet2!$B1)
: 7240 ngày
CÁI NÀY ĐÚNG

Số ngày công thứ 7 :
=SUMPRODUCT(--(WEEKDAY(tg)=7))/2
: 723.5 ngày
SAI. VÌ CÒN MẤY THỨ BẢY TRÙNG VỚI NGÀY LỄ THÌ SAO?

=> Số ngày công từ thứ 2->7 : 7963.5 ngày
SAI, VÌ Ở TRÊN ĐÃ SAI

Số ngày nghỉ lễ :
=(SUMPRODUCT((DAY(tg)=1)*(MONTH(tg)=1)+(DAY(tg)=30 )*(MONTH(tg)=4)+(DAY(tg)=1)*(MONTH(tg)=5)+(DAY(tg) =2)*(MONTH(tg)=9)))
: 110 ngày
CÁI NÀY ĐÚNG


Với
tg=ROW(INDIRECT(Sheet2!$A1&":"&Sheet2!$B1))
Nếu ngày lễ trùng vào ngày thứ 7 thì đương nhiên là người lao động được nghỉ bình thường, và chế độ cũng như các ngày khác.
Cái này không giống với đề bài của em nêu ra.

Nếu ngày CN trùng vào ngày lễ trùng và CN thì người lao động được nghỉ bù vào một ngày nào đó và dĩ nhiên là đã nghỉ rồi, vậy cứ coi như đây là một ngày nghỉ lễ như các ngày khác trong tuần.
Cái này cũng không giống với đề bài của em.

Như vậy : số ngày công sẽ là số ngày làm việc từ thứ 2->7 trừ cho số ngày nghỉ lễ là ổn rồi.
Không ổn!

7963.5-110=7853.5 ngày
Không đúng. Vì ở trên đã sai nhiều.

Các anh xem coi có đúng vậy không

Em lại mâu thuẫn với cái đề bài do chính em đặt ra rồi.
Đề bài của em nè:
Tính số ngày công làm việc của 1 nhân viên từ ngày 01/06/1980 đến ngày 29/02/2008, biết rằng ngày thứ 7 làm 1/2 ngày, có 4 ngày nghỉ lễ, đó là 01/01; 30/04; 01/05; 02/09. Nếu ngày chủ nhật trùng với ngày nghỉ lễ thì sẽ tính công cho ngày này. Ngày thứ 7 trùng vào ngày nghỉ lễ thì được nghỉ lễ bình thường (ngày thứ 7 xem như là ngày làm việc bình thường, nhưng chỉ làm 1/2 ngày).
Đây nhé:
  1. Ngày thứ 7 trùng vào ngày nghỉ lễ thì được nghỉ lễ bình thường
    Nếu đúng như vậy, thì khi số công của ngày thứ Bảy, em phải lấy số ngày thứ Bảy bình thường trừ đi số ngày thứ Bảy mà trùng vào ngày lễ, rồi mới đem chia cho 2 chứ?
    Sao em lại lấy số ngày thứ Bảy bình thường chia luôn cho 2 ?
    Những ngày thứ Bảy mà trùng với ngày nghỉ lễ thì sẽ tính là ngày nghỉ, do dó số công của nó = 0, chứ không phải bằng 1/2 công.
    Và tổng số ngày nghỉ lễ phải trừ bớt đi số ngày trùng với ngày thứ Bảy nữa, nếu không thì sẽ trừ 2 lần, một lần cho ngày nghỉ (trong số 110 ngày), thêm một lần trừ cho ngày thứ Bảy mà trùng ngày nghỉ.

  2. Nếu ngày chủ nhật trùng với ngày nghỉ lễ thì sẽ tính công cho ngày này
    Nếu đúng theo cái này, thì tổng số ngày nghỉ lễ phải trừ bớt đi số ngày trùng với ngày Chủ Nhật, vì những ngày trùng với ngày Chủ Nhật vẫn được tính 1 công.

Xem lại cái file anh gửi lên đi.
Trong đó có một hàng (hàng 2) là cách tính công cho những ngày tương ứng ở hàng 1.
Cách tính này bám theo cái đề bài của em.
 
Tôi nêu thử PA này thử nhé:
- Từ 01/06/1980 - 29/02/2008 có 10.135 ngày => 10.135 x 2 = 20.270 C (1)
- Có: 1.448 CN # 1.448 x 2 = 2.896 C (2)
- Có: 1.447 T7 # 1.447 C (3)
Chưa xét yếu tố này lễ => Số công là: 1-2-3:
20.270 - 2.896 - 1.447 = 15.927 C
Bây giờ xét NL trùng
- Số NL trùng với CN là: 16 => + 16 x 2 C = 32
- Số NL trùng với T7 là: 16 => + 16 x c C =16 (T7 chỉ tính 1 công)
Vậy số công là
15.927 + 32 + 16 = 15.975 C => Số ngày là: 15.975/2 = 7.987,5
Các bạn kiểm tra có đúng.
Cám ơn!
 
Tôi nêu thử PA này thử nhé:
- Từ 01/06/1980 - 29/02/2008 có 10.135 ngày => 10.135 x 2 = 20.270 C (1)
- Có: 1.448 CN # 1.448 x 2 = 2.896 C (2)
- Có: 1.447 T7 # 1.447 C (3)
Chưa xét yếu tố này lễ => Số công là: 1-2-3:
20.270 - 2.896 - 1.447 = 15.927 C
Bây giờ xét NL trùng
- Số NL trùng với CN là: 16 => + 16 x 2 C = 32
- Số NL trùng với T7 là: 16 => + 16 x c C =16 (T7 chỉ tính 1 công)
Vậy số công là
15.927 + 32 + 16 = 15.975 C => Số ngày là: 15.975/2 = 7.987,5
Các bạn kiểm tra có đúng.
Cám ơn!

Em vẫn không đồng ý với cách tính Chủ Nhật = 2 công.
Theo em, và nhất là theo đề bài, thì Chủ Nhật = 0 công
Chỉ khi nào Chủ Nhật là một ngày lễ thì mới tính công cho nó (trong đề bài nói như vậy)

Thôi bây giờ em xin hỏi lại tác giả một lần cuối.
Đây là đề bài:
Tính số ngày công làm việc của 1 nhân viên từ ngày 01/06/1980 đến ngày 29/02/2008, biết rằng ngày thứ 7 làm 1/2 ngày, có 4 ngày nghỉ lễ, đó là 01/01; 30/04; 01/05; 02/09. Nếu ngày chủ nhật trùng với ngày nghỉ lễ thì sẽ tính công cho ngày này. Ngày thứ 7 trùng vào ngày nghỉ lễ thì được nghỉ lễ bình thường (ngày thứ 7 xem như là ngày làm việc bình thường, nhưng chỉ làm 1/2 ngày).
Theo đề bài này thì cách tính ngày công như sau:

  • [*]Ngày bình thường từ thứ Hai đến thứ Sáu = 1 ngày công


    [*]Ngày thứ Bảy mà không trùng với ngày lễ = 1/2 ngày công


    [*]Ngày Chủ Nhật mà không trùng với ngày lễ = 0 ngày công


    [*]Ngày lễ mà không trùng với thứ Bảy, Chủ Nhật = 0 ngày công


    [*]Ngày thứ Bảy mà trùng với ngày lễ = 0 ngày công


    [*]Ngày Chủ Nhật mà trùng với ngày lễ = 1 ngày công
Xin tác giả cho ý kiến.
Có đúng là muốn tính như vậy không.
Chứ cứ ngồi mà tranh luận với nhau như vầy đến Sinh Nhật GPE cũng chưa xong.
 
Lần chỉnh sửa cuối:
Em vẫn không đồng ý với cách tính Chủ Nhật = 2 công.
Theo em, và nhất là theo đề bài, thì Chủ Nhật = 0 công
Chỉ khi nào Chủ Nhật là một ngày lễ thì mới tính công cho nó (trong đề bài nói như vậy)
Đâu có tính công CN đâu, chỉ tính có 16 ngày x 2 là CN trùng với ngày lễ thôi mà.
 
Đâu có tính công CN đâu, chỉ tính có 16 ngày x 2 là CN trùng với ngày lễ thôi mà.

Em xin lỗi. Đọc không kỹ cái bài của anh (vì anh viết tắt quá...)
Nhưng sai ở đây (chỗ em bôi màu đỏ):
Tôi nêu thử PA này thử nhé:
- Từ 01/06/1980 - 29/02/2008 có 10.135 ngày => 10.135 x 2 = 20.270 C (1)
- Có: 1.448 CN # 1.448 x 2 = 2.896 C (2)
- Có: 1.447 T7 # 1.447 C (3)
Chưa xét yếu tố này lễ => Số công là: 1-2-3:
20.270 - 2.896 - 1.447 = 15.927 C
Bây giờ xét NL trùng
- Số NL trùng với CN là: 16 => + 16 x 2 C = 32
- Số NL trùng với T7 là: 16 => + 16 x c C =16 (T7 chỉ tính 1 công)
Vậy số công là
15.927 + 32 + 16 = 15.975 C => Số ngày là: 15.975/2 = 7.987,5
Các bạn kiểm tra có đúng.
Cám ơn!
Sai là vì tác giả nói nếu ngày lễ trùng với thứ bảy thì được nghỉ bình thường, nghĩa là không đi làm mà không đi làm thì không tính công được, dù là tính 1 công.
Do đó anh cộng thêm 16 nữa là không đúng, mà phải trừ bớt đi 16 mới đúng, vì ở trên anh chỉ tính thứ bảy bình thường (trong số 1447 cái thứ Bảy, đều là 1 công).

Và cách của anh thì vẫn còn thiếu.
Anh mới tính có 16 ngày lễ trùng với CN và 16 ngày lễ trùng với thứ Bảy.
Vậy mấy ngày nghỉ bình thường đâu hết rồi?
Trong 10.135 ngày đó có 110 ngày lễ. Trừ bớt đi 32 ngày là T7, CN, thì cũng còn đến 110-32 = 78 ngày nghỉ => trừ đi thêm 78x2=156 công nữa.

Vậy em thử lấy làm lại theo kiểu của anh nha (cái màu đỏ là cái em sửa và thêm vào):
20270 - 2896 -1447 + 32 -16 - 156 = 15787 (công)

Vậy ngày công = 15787/2 = 7893.5 ngày công (giống cái kết quả của em đã tính ở các bài trước)
 
Lần chỉnh sửa cuối:
Tác giả này lựu đạn rồi, giải pháp đã có, bài toán không thực tế. Vậy bây giờ đóng topic này nhé. Mà đóng thì phải làm sao. Smod đóng hộ. Cám ơn!

Tại sao lại phải đóng anh ơi ?
Tác giả buồn chết. Đợi tác giả lên tiếng đã.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Tác giả này lựu đạn rồi, giải pháp đã có, bài toán không thực tế. Vậy bây giờ đóng topic này nhé. Mà đóng thì phải làm sao. Smod đóng hộ. Cám ơn!

Tại sao lại phải đóng anh ơi ?
Tác giả buồn chết. Đợi tác giả lên tiếng đã.

Nãy giờ bận nên không lên mạng được, giờ rãnh tý.
To Bác Thunghi : Sai lại nói vậy hả Bác, Giải pháp đâu đã có hả Bác, em vẫn chưa đồng tình với kết quả trên.
To Anh Tường : Em thừa nhận đã thiếu sót ở cái khoản ngày lễ trùng thứ 7. Đúng là ngày thứ 7-ngày lễ trùng thứ 7 rồi chia 2. Nhưng cái khoản ngày lễ trùng chủ nhật thì vẫn chưa ổn. Nếu ngày lễ trùng CN thì "tính công cho ngày này". Tính ở đây là tạm tính thôi, nhưng thực chất người ta đã nghỉ bù vào một ngày làm việc khác rồi nên sẽ không tính cho ngày lễ này.
Em gửi lại file đã chỉnh sửa
 

File đính kèm

PHÀO !!

Vấn đề to lớn hóa ra không phải là vấn đề giải thuật, mà vấn đề khái niệm : Như thế nào được gọi là một ngày công !!

PHÀO!
 

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

Back
Top Bottom