求助:如何在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
相关产品推荐
相关产品推荐

