Power Query自定义NetWorkDays函数报循环引用错误
自定义NetWorkDays函数跨用户使用触发循环引用报错修复
问题现象
通过空白查询创建的自定义NetWorkDays函数,用于计算剔除周末、节假日后的工作日天数,在本地文件中可正常运行,团队其他成员打开同一份文件时触发固定报错:
Expression.Error: 评估过程中遇到循环引用。
错误触发位置始终指向该自定义函数。
原始函数代码
Query1 = (StartDate as date, EndDate as date) as number => let DateList = List.Dates(StartDate, Number.From(EndDate - StartDate) , #duration(1, 0, 0, 0)), RemoveWeekends = List.Select(DateList, each Date.DayOfWeek(_, Day.Monday) < 5), RemoveHolidays = List.RemoveItems(RemoveWeekends, Holidays), CountDays = List.Count(RemoveHolidays) in CountDays, Custom1 = Query1 in Custom1
根因分析
- 代码外层存在冗余嵌套结构:先把函数赋值给
Query1,再把Query1赋值给Custom1,最终返回Custom1,属于无意义的自引用包裹,本地环境因为有求值缓存不会触发校验,其他用户打开文件重建查询依赖链时,会把这种结构识别为循环依赖 - 原始代码存在逻辑bug:
List.Dates的日期计数参数没有加1,生成的日期列表不包含结束日期当天,计算结果会少1天
修复步骤
- 注意:替换代码前请确认文件中已存在名为
Holidays的节假日日期列表查询,否则会触发引用缺失报错
- 打开Power Query编辑器,定位到该自定义函数查询
- 清空原有代码,替换为修复后的版本:
(StartDate as date, EndDate as date, optional HolidayList as list) as number => let ValidHolidays = if HolidayList = null then Holidays else HolidayList, DateList = List.Dates(StartDate, Number.From(EndDate - StartDate) + 1, #duration(1, 0, 0, 0)), RemoveWeekends = List.Select(DateList, each Date.DayOfWeek(_, Day.Monday) < 5), RemoveHolidays = List.RemoveItems(RemoveWeekends, ValidHolidays), CountDays = List.Count(RemoveHolidays) in CountDays
- 保存修改后的文件,分发给团队成员即可正常使用,不会再触发循环引用报错,同时修正了原函数漏算结束日期的问题。
内容的提问来源于stack exchange,提问作者MaydayMayday
相关产品推荐
相关产品推荐

