|在本文中,我们将创建一个用户定义函数(UDF),以计算指定日期之间的工作日数,包括或不包括作为周休假的星期六和星期日。

此示例的原始数据包括开始日期和结束日期。我们要计算这些日期之间的工作日数。

ArrowMain

我们在“假期”表的A列中指定了假期日期。

ArrowHolidayList

Excel具有内置功能NETWORKDAYS来计算间隔之间的工作天数。

NETWORKDAYS函数NETWORKDAYS(StartDate,EndDate,[Holidays])的语法

此功能将排除“假期”列表中指定的日期,同时计算工作日数。

此功能默认情况下将周六和周日视为休假,因此,如果我们只有一周的休假,则我们无法计算工作日的数量。

我们创建了“ CountWorkingDays”自定义函数来计算间隔之间的工作日数。此自定义函数处理NETWORKDAYS函数的问题。在此功能中,即使周六或周日仅休息一周,我们也可以计算工作日数。

自定义函数

的语法CountWorkingDays(开始日期,结束日期,InclSaturdays,InclSundays)

InclSaturdays和InclSundays是可选参数。默认情况下,两者都为TRUE值。要将周六和周日更改为工作日,请将相应参数的值更改为FALSE。

Microsoft在Excel 2010中引入了NETWORKDAYS.INTL函数。此函数处理NETWORKDAYS函数的问题。在此功能中,我们可以指定周休日。我们可以指定1天或2天作为“休假”。

NETWORKDAYS.INTL函数的语法

NETWORKDAYS.INTL(StartDate,EndDate,[Weekend],[Holidays])

在Weekend参数中,我们可以指定“休息日”。

在此示例中,我们将使用以上所有三个功能来计算工作日数。

ArrowOutput

逻辑解释

在“ CountWorkingDays”功能中,首先我们检查参数中给定的日期是否在指定的假日列表中。如果该日期在假期列表中,则该天不计入工作日数。如果假日列表中不存在该日期,则检查给定的日期是星期六还是星期日。根据提供的输入参数,检查是否将星期六或星期日作为假期。

代码说明

设置RngFind = Worksheets(“假日”).Columns(1).Find(i)

上面的代码用于查找假日列表中指定日期的位置。

如果Not RngFind不存在,则使用GoTo ForLast End If Above代码检查假日列表中是否存在指定的日期。如果条件返回TRUE,则该天不计入工作日数。

请遵循以下代码

Option Explicit

Function CountWorkingDays(StartDate As Long, EndDate As Long, Optional InclSaturdays As Boolean = True, _

Optional InclSundays As Boolean = True)

'Declaring variables

Dim RngFind As Range

Dim i As Long

For i = StartDate To EndDate



On Error Resume Next



'Finding the location where the specified date exist in the Holidays sheet

Set RngFind = Worksheets("Holidays").Columns(1).Find(i)



On Error GoTo 0



'Checking whether it is holiday on the given date

If Not RngFind Is Nothing Then

GoTo ForLast

End If



'Checking whether it is Saturday on given date

If InclSaturdays Then

If Weekday(i, 2) = 6 Then

GoTo ForLast

End If

End If



'Checking whether it is Sunday on given date

If InclSundays Then

If Weekday(i, 2) = 7 Then

GoTo ForLast

End If

End If



CountWorkingDays = CountWorkingDays + 1



ForLast:

Next

End Function

如果您喜欢此博客,请在Facebook和Facebook上与您的朋友分享。

我们希望收到您的来信,请让我们知道如何改善我们的工作并为您做得更好。写信给我们[email protected]