有没有想过在给定的月份中某个特定工作日有多少次发生?

对于某些人来说,重要的是要知道一个月中有多少个星期二。谁不想知道某个特定的月份是否会有四个或五个星期六?

Excel不包含可用于确定给定月份中特定工作日发生次数的内部函数。但是,您可以创建自己的公式和函数来完成任务。

首先,考虑以下公式。

=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))))

该公式依赖于A1中的日期。该日期应从您要“测试”的月份开始。该公式应复制到第2行的一个单元格中,然后复制到该行正下方的六个单元格中。例如,您可以将此公式复制到单元格B2:B8的范围内。第一个响应(B2)是一个月中的星期日数,第二个响应(B3)是星期一中的数,依此类推。

该公式的缺点是它使用包含该公式的单元格的位置作为公式的一部分。这意味着公式必须放在第二行的某个位置。

另一个缺点是该公式相当长且复杂。如果需要较短的公式,则需要使用数组公式。您可以使用一个方便的公式,假设您提供三个参数:年份(单元格C2),月份(单元格D2)和工作日(单元格E2)。对于这三个项目,以下公式非常有用:

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

请记住,这是一个数组公式,这意味着您必须通过按Shift + Ctrl + Enter来输入它。此外,您在单元格E2中输入的工作日值必须在1到7的范围内,其中1是星期日,2是星期一,依此类推。

另一种方法(该方法不依赖数组公式)是测试单元格A1中的日期是否需要E2中指定的任何工作日。

(同样,如前面的示例,值为1到7。)

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

该公式基本上会检查您所检查的每个工作日的月份中是否有第五个实例。如果存在,则返回值5;否则,返回0。如果不是,则返回值4。 (该公式正确地假定在给定的工作日中只能有4或5个实例-永不减少,永不增加。)

也可以使用基于宏的解决方案。一种这样的解决方案如下:

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

您可以通过在单元格中输入以下内容来使用该功能:

=MonthWeekDays(A1,4)

在这种用法中,第一个参数(单元格A1)包含要评估的月份中的日期。第二个参数是一个数值,表示您要计算的工作日。此值必须在1到7的范围内,其中1是星期日,2是星期一,依此类推。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

链接:/ excelribbon-ExcelTipsMacros [点击此处在新的浏览器标签中打开该特殊页面]。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(2183)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本:

链接:/ excelribbon-Weekdays_in_a_Month [一个月的工作日]。