Bạn đã bao giờ tự hỏi có bao nhiêu ngày trong tuần cụ thể xảy ra trong một tháng nhất định?

Đối với một số người, điều quan trọng là phải biết có bao nhiêu ngày thứ Ba trong một tháng. Và ai lại không muốn biết liệu một tháng cụ thể sẽ có bốn hay năm ngày thứ Bảy?

Excel không bao gồm một hàm nội tại mà bạn có thể sử dụng để xác định số lần một ngày trong tuần cụ thể xảy ra trong một tháng nhất định. Tuy nhiên, bạn có thể tạo công thức và hàm của riêng mình để hoàn thành nhiệm vụ.

Đầu tiên, hãy xem xét công thức sau.

=4+N((WEEKDAY(DATE(YEAR($A$1),MONTH($A$1),1)))



(DAY(DATE(YEAR($A$1),MONTH($A$1)+1,0))-28)>(7*(( WEEKDAY(DATE(YEAR($A$1),MONTH($A$1),1)))>(1+ROW()- ROW($A$2)))+(1+ROW()-ROW($A$2))))

Công thức dựa trên một ngày trong A1. Ngày này phải từ tháng bạn muốn “kiểm tra”. Công thức có nghĩa là được sao chép vào một ô ở hàng 2, và sau đó được sao chép vào sáu ô ngay bên dưới ô đó. Ví dụ: bạn có thể sao chép công thức này vào phạm vi ô B2: B8. Phản hồi đầu tiên (B2) là số ngày Chủ nhật trong tháng, câu trả lời thứ hai (B3) là số thứ Hai, v.v.

Hạn chế của công thức này là nó sử dụng vị trí của ô chứa công thức như một phần của công thức. Điều này có nghĩa là công thức phải được đặt ở đâu đó bắt đầu từ hàng thứ hai.

Một nhược điểm nữa là công thức khá dài và phức tạp. Nếu bạn muốn một công thức ngắn hơn, thì bạn cần chuyển sang công thức mảng. Một công thức hữu ích mà bạn có thể sử dụng, giả định rằng bạn cung cấp ba đối số: năm (ô C2), tháng (ô D2) và một ngày trong tuần (ô E2). Với ba mục này, công thức sau hoạt động tuyệt vời:

=SUM(IF(WEEKDAY(DATE(C2, D2, ROW(INDIRECT("1:" & DAY(DATE(C2, D2+1, 0))))))=E2, 1, 0))

Hãy nhớ rằng đây là một công thức mảng, có nghĩa là bạn phải nhập nó bằng cách nhấn Shift + Ctrl + Enter. Ngoài ra, giá trị ngày trong tuần bạn nhập vào ô E2 phải nằm trong khoảng từ 1 đến 7, trong đó 1 là Chủ Nhật, 2 là Thứ Hai, v.v.

Một cách tiếp cận khác — cách này không dựa vào công thức mảng — là kiểm tra ngày trong ô A1 cho bất kỳ ngày nào trong tuần được mong muốn, như được chỉ định trong E2.

(Một lần nữa, giá trị từ 1 đến 7, như trong ví dụ trước.)

=IF(MONTH(DATE(YEAR(A1),MONTH(A1),1)-WEEKDAY(DATE(YEAR(A1),MONTH(A1),1)-E2)+35)=MONTH(A1),5,4)

Về cơ bản, công thức kiểm tra xem có trường hợp thứ năm trong tháng của bất kỳ ngày nào trong tuần mà bạn đang kiểm tra hay không. Nếu có, thì giá trị 5 được trả về; nếu không, thì giá trị 4 được trả về. (Công thức giả định đúng rằng chỉ có thể có 4 hoặc 5 trường hợp của bất kỳ ngày nào trong tuần nhất định — không bao giờ ít hơn và không bao giờ nhiều hơn.)

Các giải pháp dựa trên vĩ mô cũng có sẵn. Một trong những giải pháp như sau:

Function MonthWeekDays(dDate As Date, iWeekDay As Integer)

Dim dLoop As Date     If iWeekDay < 1 Or iWeekDay > 7 Then         MonthWeekDays = CVErr(xlErrNum)

Exit Function     End If     MonthWeekDays = 0     dLoop = DateSerial(Year(dDate), Month(dDate), 1)

Do While Month(dLoop) = Month(dDate)

If WeekDay(dLoop) = iWeekDay Then _             MonthWeekDays = MonthWeekDays + 1         dLoop = dLoop + 1     Loop End Function

Bạn sử dụng hàm bằng cách nhập nội dung sau vào ô:

=MonthWeekDays(A1,4)

Trong cách sử dụng này, đối số đầu tiên (ô A1) chứa một ngày trong tháng được đánh giá. Đối số thứ hai là một giá trị số đại diện cho ngày trong tuần mà bạn muốn đếm. Giá trị này phải nằm trong khoảng từ 1 đến 7, trong đó 1 là Chủ nhật, 2 là Thứ hai, v.v.

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (2183) áp dụng cho Microsoft Excel 97, 2000, 2002 và 2003. Bạn có thể tìm phiên bản của mẹo này cho giao diện ribbon của Excel (Excel 2007 trở lên) tại đây: