如何在VBA中访问不指向单元格的Excel命名区域内容?
解决Excel命名公式/常量在VBA中取值的问题
为啥之前的代码失效?
你创建的TestRange不是指向单元格区域的命名,而是直接绑定公式或常量的命名对象。Range("TestRange").Value只对指向单元格的命名有效,因为Range对象本质是操作工作表单元格,这类非单元格引用的命名自然读不到值。而RefersTo返回的是命名的定义文本(比如=Sheet1!G25*Sheet1!G26),不是计算后的结果,所以也拿不到你要的数值。
正确的取值方法
1. 通用解法(公式/常量都适用)
用Evaluate方法直接解析命名的结果,不管是公式还是常量都能直接拿到值:
Dim SomeValue As Variant SomeValue = ThisWorkbook.Evaluate("TestRange")
这个方法和你在工作表单元格里输入=TestRange的效果完全一致,会自动计算或返回常量值。
2. 针对常量命名的额外解法
如果你的命名是存储常量(比如=123或="测试文本"),也可以直接提取定义里的内容,去掉开头的等号:
Dim nameItem As Name Set nameItem = ThisWorkbook.Names("TestRange") ' 提取常量内容,数值型可以转成对应类型 Dim ConstValue As Variant ConstValue = Mid(nameItem.RefersTo, 2) ' 比如数值型转成整数:ConstValue = CLng(Mid(nameItem.RefersTo, 2))
关于隐藏需求的说明
你不需要把结果放到工作表单元格里——在工作表中直接用=TestRange就能调用这个命名的结果,计算逻辑藏在命名的引用位置里,不会暴露在单元格中,完全满足“隐藏但可访问”的要求。
注意事项
- 不要用
Range对象去访问这类非单元格命名,它只处理单元格区域。 - 如果是公式型命名,当引用的单元格值变化时,
Evaluate会自动返回最新的计算结果,和工作表公式同步。
内容的提问来源于stack exchange,提问作者Brian Mills
相关产品推荐
相关产品推荐

