Excel VBA中rng.RefersToRange.Parent.Name与rng.Parent.Name的区别
核心属性区别
Name.Parent:指代命名区域本身的所属父对象,完全由命名区域的作用域决定,和命名区域实际引用的内容无关:- 工作簿级命名的父对象是当前工作簿
Workbook - 工作表级命名的父对象是它归属的对应
Worksheet
- 工作簿级命名的父对象是当前工作簿
Name.RefersToRange.Parent:指代命名区域引用的单元格所在的工作表,只和RefersTo公式指向的单元格位置有关,和命名区域本身的作用域无关。
你遇到的问题正是这个逻辑导致的:新增的工作表级命名虽然归属新工作表,但它的引用指向了你原来的somews区域,所以RefersToRange.Parent返回的是somews的名称,而Name.Parent返回的是它实际归属的新工作表名称。
适用场景
- 当你需要判断命名区域本身的作用域归属时,使用
Name.Parent:比如筛选所有归属于指定工作表的工作表级命名,不管它引用的内容是什么位置。 - 当你需要判断命名区域实际引用的单元格所在位置时,使用
Name.RefersToRange.Parent:比如筛选所有指向指定工作表单元格的命名,不管它是工作簿级还是工作表级。
更稳妥的实现方式
首先优化判断逻辑:不要仅对比工作表名称,直接用Is对比对象本身,避免工作表重名导致的误判。同时针对两种需求分别给出容错实现:
需求1:筛选归属于指定工作表的所有命名(即你当前需要的场景)
Dim targetWs As Worksheet, nm As Name Set targetWs = somews '替换为你的指定工作表 For Each nm In ThisWorkbook.Names '先判断父对象是工作表,排除工作簿级命名 If TypeName(nm.Parent) = "Worksheet" Then '直接对比对象,比对比名称更稳妥 If nm.Parent Is targetWs Then ' 执行你的操作 End If End If Next nm
需求2:筛选引用位置在指定工作表的所有命名
注意部分命名可能指向常量、公式而非单元格,直接调用RefersToRange会报错,需加错误处理:
Dim targetWs As Worksheet, nm As Name, refRng As Range Set targetWs = somews For Each nm In ThisWorkbook.Names On Error Resume Next Set refRng = nm.RefersToRange On Error GoTo 0 ' 确认是指向单元格的有效命名 If Not refRng Is Nothing Then If refRng.Parent Is targetWs Then ' 执行你的操作 End If End If Set refRng = Nothing '重置变量避免残留 Next nm
内容的提问来源于stack exchange,提问作者Ale
相关产品推荐
相关产品推荐

