【发布时间】:2012-10-09 22:44:18
【问题描述】:
为了详细说明,假设我的工作簿中有两个命名范围。两个命名范围具有相同的名称(比如说“myName”),但一个范围限定为 Sheet1,另一个范围限定为工作簿。
给定命名范围的名称(字符串),我想获取工作簿级别的命名范围。
如果我使用本机调用:wb.Names.Item("myName"),它会返回工作表范围命名范围。
如果我这样做:wb.Names.Item("Sheet1!myName"),那显然会返回工作表范围的名称范围。我发现我可以使用它来指定特定工作表,但不能指定工作簿。
无论如何我可以指定我想要工作簿范围吗?
我的解决方法目前正在遍历所有名称的列表,并比较 .Name 属性以获取工作簿范围命名范围。这是因为 .Name 属性附加了一个“Sheet1!”。到工作表范围命名范围。然而,这样做成本很高,我想避免它。
【问题讨论】:
-
我不是 100% 清楚你是如何使用这个范围的。如果您尝试将范围对象设置为名称字符串,那么
Set rng1 = Range("myName")将在 sheet1 处于活动状态时返回本地工作表名称的范围,否则它将返回工作簿名称的范围。我认为这是最干净的解决方法 - 即在将名称用作工作簿范围之前测试活动工作表与托管本地名称的工作表不同。有道理? :) -
您还可以将 parent.name 与工作簿名称进行比较,但您仍需要遍历名称以提取该集合。
-
回复:@brettdj 的评论。根据您要实现的目标,最简单的方法可能是在宏的开头添加一个临时表,然后在代码末尾删除。
-
不,不管你在哪张纸上。它首先返回工作表级别(如果存在多个工作表范围,则根据工作表排序进行排序)。如果不存在工作表范围的,则返回 wb 范围的。而且我不想设置范围。我只是想获得 COM 对象,这样我就可以对它做任何我需要做的事情。
-
@Shark,您能否一次性分析工作簿中的所有名称,然后将工作簿范围内的命名范围保存在字典中?这种类型的缓存似乎可以缓解任何性能问题。
标签: c# excel named-ranges