You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何在VBA的NetworkDays函数中使用数组作为节假日参数

求助:如何在VBA的NetworkDays函数中使用数组作为节假日参数

兄弟,我之前也碰到过一模一样的问题!其实核心原因是WorksheetFunction.NetworkDays对节假日参数的格式要求比较严格,你用Array()创建的是一维数组,但它只认单元格区域或者二维数组(因为工作表里的单元格区域本质都是二维的)。另外你尝试的字符串拼接方法肯定行不通,因为这个函数需要的是实实在在的日期值,不是字符串格式的日期。

给你两个实用的解决方案,选哪个看你需求:

方案1:用Application.NetworkDays代替(最简单)

Application.NetworkDays是WorksheetFunction.NetworkDays的“宽松版”,它对参数的兼容性更好,直接支持一维数组作为节假日参数,不用做额外转换。代码示例:

Sub CheckWorkday()
    ' 定义一维节假日数组,直接用DateSerial生成日期值
    Dim holidayDates As Variant
    holidayDates = Array( _
        DateSerial(2023, 1, 1), _
        DateSerial(2023, 12, 25), _
        DateSerial(2023, 12, 26) _
    )
    
    ' 获取要检查的日期(不用管单元格格式,VBA会自动转成Date类型)
    Dim checkDate As Date
    checkDate = ThisWorkbook.Sheets("你的工作表名").Cells(3, 3).Value
    
    ' 调用NetworkDays,起止日期用同一个值来检查单天
    Dim isWorkday As Long
    isWorkday = Application.NetworkDays(checkDate, checkDate, holidayDates)
    
    ' 返回0说明是周末或节假日,返回1是工作日
    If isWorkday = 0 Then
        MsgBox checkDate & " 是周末或公共节假日"
    Else
        MsgBox checkDate & " 是工作日"
    End If
End Sub

方案2:把一维数组转成二维数组(适配WorksheetFunction)

如果你一定要用WorksheetFunction.NetworkDays,那可以把一维数组转成单列的二维数组,这样函数就能识别了。代码示例:

Sub CheckWorkdayWithWSFunc()
    Dim holidayDates As Variant
    holidayDates = Array( _
        DateSerial(2023, 1, 1), _
        DateSerial(2023, 12, 25) _
    )
    
    ' 把一维数组转成二维数组(行数=节假日数量,列数=1)
    Dim holiday2D As Variant
    ReDim holiday2D(1 To UBound(holidayDates) + 1, 1 To 1)
    Dim i As Integer
    For i = 0 To UBound(holidayDates)
        holiday2D(i + 1, 1) = holidayDates(i)
    Next i
    
    Dim checkDate As Date
    checkDate = ThisWorkbook.Sheets("你的工作表名").Cells(3, 3).Value
    
    ' 现在可以正常用WorksheetFunction了
    Dim isWorkday As Long
    isWorkday = WorksheetFunction.NetworkDays(checkDate, checkDate, holiday2D)
    
    If isWorkday = 0 Then
        MsgBox checkDate & " 是周末或公共节假日"
    Else
        MsgBox checkDate & " 是工作日"
    End If
End Sub

另外补充一句:你不用太担心单元格里的日期格式,只要单元格里的内容是有效的日期,VBA读取的时候会自动转换成Date类型,所以不用特意处理格式问题。

备注:内容来源于stack exchange,提问作者user25470378

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 11:05:26