Dùng hàm hoặc code nào để tính được số ngày Chủ Nhật trong một quãng T/G bất kỳ
Chào cả nhà !
Mình có thể dùng hàm hoặc code nào để tính được số ngày Chủ Nhật trong một quãng thời gian các bác nhỉ ?
Ví dụ:
Ô A1 Nhập dữ liệu ngày: 01/01/2007
Ô B1 Nhập dữ liệu ngày: 10/03/2007
Ô C1, Công thức hoặc code nào để tính được kết quả số ngày Chủ Nhật từ A1:B1 (Theo mình tính thủ công đếm theo trên lịch là 9 ngày Chủ Nhật cho quãng thời gian trên).Mong sớm nhận được sự trợ giúp của cả nhà.
Chân thành cảm ơn !
Tại sao chúng ta lại quên rằng hàm WEEKDAY còn có tham số nữa, là 1, 2 hoặc 3. Trước giờ cứ quen xài dạng WEEKDAY (X), mặc định ko ghi gì có nghĩa là tham số = 1, WEEKDAY(X) cũng = WEEKDAY(X,1). Tôi vừa phát hiện ra 1 công thức tổng quát khác. Nó có thể tính được số ngày bất kỳ giữa 2 móc thời gian:
Tính số ngày thứ hai: =INT((A2-A1-WEEKDAY(A2,2)+8)/7)
Tính số ngày thứ ba: =INT((A2-A1-WEEKDAY(A2-1,2)+8)/7)
Tính số ngày thứ tư: =INT((A2-A1-WEEKDAY(A2-2,2)+8)/7)
Tính số ngày thứ năm: =INT((A2-A1-WEEKDAY(A2-3,2)+8)/7)
Tính số ngày thứ sáu: =INT((A2-A1-WEEKDAY(A2-4,2)+8)/7)
Tính số ngày thứ bảy: =INT((A2-A1-WEEKDAY(A2-5,2)+8)/7)
Tính số ngày chủ nhật: =INT((A2-A1-WEEKDAY(A2-6,2)+8)/7)
Và cũng từ đây, ta có thể suy ra nhiều công thức khác, chẳng hạn tìm ngày CHỦ NHẬT đầu tiên, ngày CHỦ NHẬT cuối cùng:
Ngày CHỦ NHẬT đầu tiên: = A1 – WEEKDAY(A1,2)+ 7
Ngày CHỦ NHẬT cuối cùng: = A2 – WEEKDAY(A2) + 1
Rất cám ơn bạn VuNgoc đã đưa ra 1 đề tài khá thú vị
Mến!
ANH TUẤN
www.giaiphapexcel.com/diendan/threads/d%C3%B9ng-h%C3%A0m-ho%E1%BA%B7c-code-n%C3%A0o-%C4%91%E1%BB%83-t%C3%ADnh-%C4%91%C6%B0%E1%BB%A3c-s%E1%BB%91-ng%C3%A0y-ch%E1%BB%A7-nh%E1%BA%ADt-trong-m%E1%BB%99t-qu%C3%A3ng-t-g-b%E1%BA%A5t-k%E1%BB%B3.2515/
Xây dựng Lương 3P, KPI cho Doanh nghiệp
Làm thế nào để trả lương cho nhân viên chính xác nhất? Đây là một trong những câu hỏi khó trong quản trị nhân...
Xem khóa học
Bạn thử xem hàm này có dùng dc ko nha!
=INT((A2-WEEKDAY(A2)-A1+8)/7)
Rất đơn giãn! Thử xem đúng ko?
Mến
ANH TUẤN
Bạn yeudoi thử cho 1 VD cụ thể đi, trường hợp nào cho kết quả sai? Tôi đã thử cả ở những năm khác nhau nhưng chưa phát hiện trường hợp nào sai như bạn nói!
Có nhiều cách đễ biết dc có bao nhiêu ngày CN giữa 2 thời điểm cho trước X, Y (Với X=<Y). Tất cả dựa trên nguyên tắc: "Trong 7 ngày liên tiếp có ít nhất 1 ngày CN"
Vậy bây giờ ta xét các kết quả sau:
1/- Xét phép chia: INT((A2-A2+1)/7) (Tạm gọi là kết quả (a))
2/- Xét phần dư MOD(A2-A1+1,7) (Tạm gọi là kết quả (b))
3/- Xét xem ngày CN đầu tiên là ngày thứ mấy so với móc thời gian X. Hoặc xét ngày CN cuối cùng cách bao nhiêu ngày so với móc thời gian Y (Tạm gọi đây là kết quả (c)).
Kinh nghiệm của tôi cho thấy nên xét ngày CN cuối cùng so với móc thời gian Y thì sẽ dễ cho việc tính toán hơn (Đễ ý weekday(A2) có liên quan đến ngày CN cuối cùng. Weekday(A2) = bao nhiêu thì ngày CN cuối cùng cách Y bấy nhiêu)
Cuối cùng ta có thể kết luận rằng: Nếu (c)=< (b) thì số ngày CN là (a)+1, ngược lại số ngày CN là (a)
VD: từ X đến Y có 23 ngày. Vậy (a)=3 và (b)=2. Vậy nếu như ngày CN đầu tiên nằm lọt trong khoảng 2 ngày đầu hoặc ngày CN cuối cùng cách Y nhỏ hơn 2 (nghĩa là (c)=<2) thì từ X đến Y sẽ có (a)+1= 4 ngày CN. Ngược lại thì từ X đến Y có 3 ngày CN
Cách suy luận là thế, còn tùy theo cách mỗi người tạo công thức như thế nào đó miễn sao có thể hiểu dc.
Chẳng hạn tôi cũng có thể ra 1 công thức dài hơn nhưng tương đối dễ hiểu hơn như sau:
=IF(MOD(A2-A1+1,7)>=WEEKDAY(A2),INT((A2-A1+1)/7)+1,INT((A2-A1+1)/7))
Mong nghe thêm những ý kiến đóng góp khác!
Mến
ANH TUẤN
Cần INT chứ bạn! Số (A2-WEEKDAY(A2)-A1+8) đâu có chia hết cho 7 trong mọi trường hợp đâu. VD nha! A1=15-5-2007… A2=15-6-2007… Vậy thì (A2-weekday(A2)-A1+8)=33 làm sao chia hết cho 7?
mến
ANH TUẤN
Tôi xin đính chính bài viết lần trước. Đúng ra nó phải như vầy: "Trong 7 ngày liên tiếp chỉ có duy nhất 1 ngày CN, bất kể ngày CN ấy nằm ở vị trí nào trong 7 ngày này"
Xin lỗi!
ANH TUẤN
Có cách nào dựa trên công thức INT((A2-A1-weekday(A2)+8)/7) đễ làm ra 1 công thức khác có khả năng tính dc có bao nhiêu ngày bất kỳ giữa 2 thời điễm ko nhỉ?
Đễ tính ngày CN thì:
1/- Đầu tiên người ta xét xem ngày cuối cùng là ngày thứ mấy (bằng cách xét weekday (Y)), sau đó cộng thêm 1 số ngày nữa sao cho ngày cuối trở thành ngày THỨ BẢY (Satuday). Lấy tổng số ngày (Y-X+1) trừ đi weekday(Y) rồi cộng thêm 7 ta luôn luôn có được ngày cuối cùng là ngày THỨ BẢY (Y-X+1-weekday(Y)+7) hay (Y-X-weekday(Y)+8). Việc cộng thêm này không làm thay đổi số lượng ngày CHỦ NHẬT đang có giữa khoảng thời gian X, Y
2/- Phân chia toàn bộ số ngày (Y-X-weekday(Y)+8) thành nhiều nhóm nhỏ, mỗi nhóm là 7 ngày, bắt đầu từ CHỦ NHẬT và kết thúc ở THỨ BẢY. Riêng nhóm đầu tiên bắt đầu từ ngày X đến THỨ BẢY. Giã sử ta đang có n+1 nhóm thì loại trừ nhóm đầu tiên ra, ta luôn luôn có n ngày CHỦ NHẬT, và tổng số ngày của n nhóm này luôn chia hết cho 7 (vì mỗi nhóm có 7 ngày).
3/- Với nhóm đầu tiên (từ X đến THỨ BẢY) thì tổng số ngày của nó chính là phần dư trong phép chia (Y-X-weekday(Y)+8)/7. Nếu nhóm đầu tiên này bắt đầu bằng ngày CHỦ NHẬT thì mặc nhiên phần dư sẽ bằng 7 và ta có thêm 1 ngày CHỦ NHẬT nữa đã được cộng sẳn vào kết quả.
Tôi cảm giác rằng đễ tính số ngày bất kỳ thì công thức này có thể sử dụng dc nhưng phải thay đỗi cái gì đó… Cái gì đó là cái gì nhỉ? Sao nghĩ hoài vẫn ko ra. Dạo này đầu óc bả đậu quá!
Bạn ThuNghi thử nghiên cứu xem, tôi đễ ý thấy rằng việc đếm số ngày CN và số ngày thường chỉ khác nhau có 1 điểm duy nhất thôi, đó là weekday(ngày CN) thì = 1. tức là số đầu tiên trong chu kỳ 1,2,… 7. Vậy bạn hãy nghĩ xem nếu ta muốn đếm số ngày thường, chẳng hạn là THỨ TƯ đi, thì có cách nào đó chuyễn đỗi weekday(thứ tư) này thành số 1 dc ko?. Ý tôi ko phải là thay đỗi hàm weekday, mà làm 1 công việc chuyễn đỗi thôi, chuyễn THỨ TƯ thành số 1, lúc này THỨ NĂM sẽ = 2… và THỨ BA = 7. Lúc đó ta sẽ xem nó như 1 ngày CN bình thường và dùng công thức đễ đếm như các trường hợp ở trên.
Tôi cãm giác là thế mà nghĩ hoài vẩn ko ra. Bạn thử xem giãi pháp này có khả thi ko?
Ah, tôi vừa nghĩ ra cách tính số ngày bất kỳ giữa 2 thời điễm cho trước. Tôi post file lên các bạn xem thử có thể rút gọn dc ko nha! Vì trong file, khi tính số ngày nào đó ko phải là CN thì tôi phải dùng quá nhiều cột phụ, Thấy ko hay cho lắm! Đã vậy tôi chỉ mới thử sơ qua thôi, chưa biết có sai xót gì nữa ko. Nhờ các bạn xem giúp. (Tôi cũng đang áp dụng cách mà tôi vừa nói ở trên)
Mến
ANH TUẤN
Bài toán này chỉ khó ở chổ xác định: Có bao nhiêu ngày CN giữa 2 thời điểm
Làm thử, bạn xem thế nào nhé
Công thức này phải khai triển thế này mới có thể hiểu được
=INT(((A2 – WEEKDAY(A2-6,2)+7)–A1+1))/7)
Với WEEKDAY(A2-6,2) chính bằng WEEKDAY(A2)
Vậy viết lại công thức:
=INT(((A2 – WEEKDAY(A2)+7)–A1+1))/7)
Ta xét (A2 – WEEKDAY(A2)+7) —-> Một ngày trừ đi WEEKDAY của ngày ấy rồi cộng thếm 7 sẽ luôn luôn là ngày thứ 7 tới —> Và sự gia giảm này không hề làm thay đổi tổng số ngày CN (Ý nghĩa của sự gia giảm này là "dịch" ngày cuối cùng đến ngày thứ 7 tới gần nhất)
Giả sử ta đặt NCGL = (A2 – WEEKDAY(A2)+7) tạm gọi là ngày cuối giả lập
(A2 – WEEKDAY(A2)+7)–A1+1 = NCGL– A1+1 Chính là tổng số ngày
Phần nguyên của phép chia NCGL– A1+1 với 7 chính là tổng số ngày CN —> Vậy thôi
———————
Thuật toán có thể hiểu ngay (nằm ở chổ A2 – WEEKDAY(A2)+7 ấy), nhưng giải thích quả thật là khó… Hic…
Hôm nay thức khuya mới phát hiện bài này —> Chẳng hiểu bạn tính cách nào mà ra thứ bảy nữa
Này nhé:
– Ta có ngày 10/01/2007 tại cell A1
– Suy ra WEEKDAY(A1,2) = 3 (chú ý có số 2 trong Weekday nhé)
– Suy ra A1 – WEEKDAY(A1,2)+ 7 = 10/01/2007 – 3 + 7 —-> Chẳng bằng 14/01/2007 là gì?
Sao bạn lại ra được kết quả 13/01/2007 cơ chứ?
Một cách khác để bạn thêm tham khảo: Hàm mảng tự tạo
Giả định bạn có 2 giá trị StartDate và EndDate, với EndDate > StartDate
– Vậy, bằng cách nào đó, bạn tìm được 1 giá trị Start_1 >= StartDate lại vừa là ngày CN. Hãy gõ nó vào 1 cell.
– Cell bên dưới sẽ bằng cell trên cộng thêm 7 (ngày CN kế tiếp)
– Cứ thể kéo fill đến khi nào thấy vượt quá EndDate thì ngưng (ta có thể lồng thêm điều kiện để nó tự "ngưng")
Quá dễ
Gợi ý cho bạn giá trị Start_1 = StartDate – WEEKDAY(StartDate,2)+ 7
thêm một cách mới cho excel 2010—>trở lên
đếm bao nhiêu ngày chủ nhật
với a1 là ngày bắt đầu
b1 là ngày kết thúc
thay đổi tham số từ 11–> 17 để tính các ngày còn lại–=0