Excel VBA从工作表公式创建命名范围报错问题求助
为什么复杂公式无法创建命名范围?
嘿,我之前碰到过一模一样的问题!核心原因其实很简单:你用.Value读取单元格内容的方式,在处理真正的公式时会“跑偏”。
- 当单元格是纯文本时(比如你手动输入
=archief!$A$2,没让Excel当成公式计算),.Value返回的就是完整的公式字符串,刚好符合Names.Add要求的RefersTo参数格式,所以运行正常。 - 但当单元格是真正的公式时(就是你输入带等号的公式后,Excel会计算它的那种),
.Value返回的是公式算出来的结果,不是公式本身!比如你的=VERSCHUIVING(...)是个动态范围公式,它的计算结果是一片单元格区域,.Value会试图读取这片区域的内容(可能是单个值或者数组),把这个传给RefersTo,Excel自然懵了——这根本不是合法的引用表达式啊,不报错才怪!
怎么修复?
把读取单元格内容的.Value换成.FormulaLocal(适合荷兰语Excel,能保留本地函数名)或者.Formula(自动转成英文函数名),这样就能拿到完整的公式字符串,而不是计算结果。修改后的代码如下:
Source_1_Criteria = "Factuur" Source_1_Name = Range("MDM_MDM_Tool_List").Find(what:=Source_1_Criteria).Offset(0, 2).Value ' 改用FormulaLocal获取单元格里的原始公式字符串(保留荷兰语函数名) Source_1_Area = Range("MDM_MDM_Tool_List").Find(what:=Source_1_Criteria).Offset(0, 4).FormulaLocal ' 保险起见,检查公式是否以等号开头,防止单元格里的公式没写等号(虽然你这里应该有) If Left(Source_1_Area, 1) <> "=" Then Source_1_Area = "=" & Source_1_Area ActiveWorkbook.Names.Add Name:=Source_1_Name, RefersTo:=Source_1_Area
额外提几个注意点
- 如果你的Excel是英文版本,建议用
.Formula代替.FormulaLocal,这样函数名会自动转换成英文(比如VERSCHUIVING变OFFSET,AANTALARG变COUNTA),避免语言兼容问题。 - 要确保
Source_1_Name是合法的命名范围名称:不能有空格、不能以数字开头、不能和单元格地址重名,不然Names.Add也会报错。 - 如果你的动态范围需要基于当前工作表的相对引用,记得指定命名范围的作用域(默认是工作簿级,要工作表级的话可以加
Scope:=Worksheets("你的工作表名")参数)。
内容的提问来源于stack exchange,提问作者Michiel.D
相关产品推荐
相关产品推荐

