如何通过工作表CodeName在Excel函数中引用区域?解决SUMIFS调用报错
问题分析
自定义函数SNAME能根据CodeName返回工作表名称,但直接嵌入SUMIFS的区域引用时出错,核心原因是Excel无法直接将自定义函数返回的字符串解析为工作表引用,必须通过INDIRECT函数将拼接后的引用字符串转换为实际单元格区域。
解决方案
1. 优化VBA自定义函数(增强鲁棒性)
原函数未处理找不到对应CodeName的情况,且变量未完整声明,优化后:
Function SNAME(number As String) As String Dim WORD As String Dim i As Integer WORD = "Sheet" & number ' 用&拼接字符串更稳妥 For i = 1 To ThisWorkbook.Worksheets.Count If Worksheets(i).CodeName = WORD Then SNAME = Worksheets(i).Name Exit For ' 找到目标工作表后直接退出循环,提升效率 End If Next i ' 处理找不到对应CodeName的场景,避免返回空值引发公式错误 If SNAME = "" Then SNAME = "NotFound" End If End Function
2. 修改Excel公式(核心解决方法)
使用INDIRECT函数将SNAME返回的工作表名与目标区域拼接成完整引用字符串,再转换为Excel可识别的单元格区域:
=SUMIFS(INDIRECT("'"&SNAME(19)&"'!$T$2:$T$9962"),INDIRECT("'"&SNAME(19)&"'!$A$2:$A$9962"),"=31",INDIRECT("'"&SNAME(19)&"'!$C$2:$C$9962"),"<="&EDATE(TODAY(),-12))
公式说明:
'"&SNAME(19)&"'!$T$2:$T$9962:拼接成完整的工作表区域引用字符串(添加单引号是为了兼容带空格、特殊字符的工作表名称)INDIRECT():将拼接后的字符串转换为Excel可直接识别的单元格区域引用
补充说明
- 用CodeName绑定工作表的思路完全正确,能彻底避免因他人修改工作表名称导致的公式失效问题
- 如果确定工作表名称不含特殊字符或空格,公式中的单引号可以省略,但建议保留以兼容所有场景
内容的提问来源于stack exchange,提问作者Christian Prieto
相关产品推荐
相关产品推荐

