我需要遍历工作簿的命名区域,检查它们是否在特定的工作表中,然后对其执行某些操作。我找到了一个建议,可以使用下面这样的方法:
Dim ws As Worksheet, rng As Name
Set ws = somews
For Each rng In ThisWorkbook.Names
If rng.RefersToRange.Parent.Name = somews.Name Then
'do stuff
End If
Next rng 在一开始,它运行得很好。现在我有个问题了。其他人也在使用这个工作簿,我不知道他们做了什么。工作簿有一个带有命名区域的新工作表,这些区域与我在somews中的一些区域相同,但它们引用了一些外部源。我猜他们是在处理工作簿之间的事情。“我的范围”的作用域是整个工作簿,而那些新范围的作用域仅适用于该新工作表。我知道这会发生,这就是为什么我需要这个代码。
这段代码现在崩溃了。因为如果rng是form,那么rng.RefersToRange.Parent.Name仍然返回我的工作表的名称,而不是新工作表的名称。因此,If语句被执行,但范围错误。但是,如果我使用rng.Parent.Name,我会得到正确的名称。
这里的区别是什么?我应该什么时候使用一个,什么时候使用另一个?有没有更好的方法?
发布于 2021-09-07 13:50:32
.RefersToRange不是Range对象的成员。它是Name对象的成员。
.RefersToRange对象是访问与Name对象关联的Range对象的方式。拥有Range对象后,.Parent属性将返回该范围所属的Worksheet对象。.Name属性将返回工作表的名称。
因此,如果rng是一个Name对象,rng.RefersToRange.Parent.Name将返回包含与该名称关联的区域的工作表的名称。
另一方面,rng.Parent.Name不会遍历范围,因此不太明确它返回的是哪个名称。.Parent属性应用于Name对象,该对象可以引用工作表或工作簿。因此,根据创建Name对象时定义作用域的方式,.Parent.Name将返回单个工作表或工作簿的名称。
https://stackoverflow.com/questions/69089038
复制相似问题