Office2016中VBA循环调用Networkdays函数报错如何解决
问题原因及修复方案
原代码存在的问题
- 循环语法错误:
For循环定义的迭代变量为i,但终止语句写为Next N,直接触发编译报错 - 工作表未绑定:所有单元格调用未明确指定
Dump工作表,当活动工作表不是目标表时,取值逻辑完全错位 - 属性赋值错误:直接把函数计算结果赋值给单元格的
Formula属性,逻辑不匹配,应该赋值给Value属性 - 无错误兼容逻辑:如果待计算的起始日期列(C列)为空、不是合法日期格式,
WorksheetFunction.NetworkDays会直接抛出运行时错误
修正后可运行代码
Sub 计算工作日天数() Dim N As Long Dim i As Long Dim wf As WorksheetFunction Dim sht As Worksheet Set wf = Application.WorksheetFunction ' 明确绑定目标工作表,避免活动表错位问题 Set sht = Sheets("Dump") With sht N = .Range("A" & .Rows.Count).End(xlUp).Row ' 写入当日日期到E1作为最晚计算日期 .Range("E1") = Date For i = 2 To N ' 先判断C列是否为合法日期,避免运行时错误 If IsDate(.Cells(i, 3).Value) Then .Cells(i, 4).Value = wf.NetworkDays(.Cells(i, 3).Value, .Cells(1, 5).Value) Else ' 非法日期时D列填写提示,可按需修改为留空 .Cells(i, 4).Value = "无效起始日期" End If Next i End With End Sub
更高效率的优化方案
如果不需要VBA逐行计算,也可以直接给D列批量写入公式,运行速度更快:
Sub 批量公式计算工作日() Dim N As Long Dim sht As Worksheet Set sht = Sheets("Dump") With sht N = .Range("A" & .Rows.Count).End(xlUp).Row .Range("E1") = Date ' 直接写入公式,绝对引用E1,批量填充 .Range("D2:D" & N).Formula = "=NETWORKDAYS(C2,$E$1)" End With End Sub
内容的提问来源于stack exchange,提问作者Ajit Kumar
相关产品推荐
相关产品推荐

