在OFFSET函数或VBA中调用含UDF的命名区域报错如何解决?
问题根源
你写的UDF默认返回的是单元格区域的数值数组,而非Excel可识别的Range对象引用。直接在单元格输入=UnitIDs时Excel仅需要读取值数组做溢出展示,所以可以正常运行;但OFFSET函数、VBA调用命名区域时都要求获取Range引用,因此触发错误。
修复方案
修改UDF代码,显式声明返回Range类型并使用Set关键字完成对象赋值,同时补充工作表限定避免跨表调用异常:
Public Function RETURN_NON_EMPTY_CELLS_DOWN(Target As Range) As Range Dim ws As Worksheet Dim i As Long Set ws = Target.Worksheet If IsEmpty(Target.Value) Then Set RETURN_NON_EMPTY_CELLS_DOWN = Target Else For i = Target.Row To ws.Rows.Count If IsEmpty(ws.Cells(i, Target.Column).Value) Then Exit For End If Next i Set RETURN_NON_EMPTY_CELLS_DOWN = ws.Range(Target, ws.Cells(i - 1, Target.Column)) End If End Function
修改说明
- 增加返回值类型声明
As Range,明确函数返回单元格引用对象 - 所有对象赋值前添加
Set关键字,这是VBA返回对象引用的必要规则 - 所有单元格、区域操作都绑定到Target所属工作表,避免活动工作表切换导致的指向错误
- 使用
IsEmpty判断空值,比直接对比空字符串更严谨,可兼容单元格公式返回空值的场景
验证步骤
修改代码后保存为xlsm格式启用宏的工作簿,重新确认命名区域UnitIDs的定义无误,即可正常在OFFSET函数、VBA中调用该命名区域:
- 公式
=OFFSET(UnitIDs,0,0,1,1)可正常返回区域首个单元格内容 - VBA中通过
ThisWorkbook.Names("UnitIDs").RefersToRange即可获取对应区域对象,不会触发1004错误
内容的提问来源于stack exchange,提问作者SeanFromNL
相关产品推荐
相关产品推荐

