名称重复时,在Excel工作簿中按string获取命名范围

详细说一下,假设我的工作簿中有两个命名的范围。 两个命名范围都具有相同的名称(比方说“myName”),但其中一个范围为Sheet1,另一个范围为Workbook。

给定命名范围的名称(string),我想抓取工作簿级命名范围。

如果我使用本地调用: wb.Names.Item("myName") ,它将返回工作表作用域的命名范围。

如果相反,我做: wb.Names.Item("Sheet1!myName") ,显然返回工作表范围的名称范围。 我发现我可以使用这个来指定特定的表格,但不是工作簿。

有反正我可以指定我想工作簿作用域?

我的解决方法是遍历所有名称的列表,并比较.Name属性以获取工作簿范围命名范围。 这是因为.Name属性追加了“Sheet1!” 到表范围的命名范围。 然而这样做非常昂贵,我想避免它。

当我们(JKP和我自己)编写名称pipe理器时,我们专门为重复的全局/本地名称添加了filter和警告消息,因为您提到的这个Excel对象模型行为导致难以检测到错误。

所以我的build议是永远不要使用重复的全球/本地名称。

我们使用代码来检测名称是否与本地名称的父级活动的全局/本地重复,然后在必要时切换表单。 我们使用优化的VBA代码来查找全局名称的本地版本是这样的:除非你有几万个名字,否则它的速度相当快 –

  Function FindNameLocal(oSheet As Worksheet, sName As String) As Name Dim oName As Name Dim strLocalName As String Dim strLocalNameNoQuote Dim strName As String Set FindNameLocal = Nothing If Len(sName) > 0 And Not oSheet Is Nothing And oSheet.Names.Count > 0 Then On Error Resume Next strLocalName = "'" & oSheet.Name & "'!" & sName strLocalNameNoQuote = oSheet.Name & "!" & sName Set FindNameLocal = oSheet.Names(strLocalName) If Err <> 0 Or (FindNameLocal.NameLocal <> strLocalName And FindNameLocal.NameLocal <> strLocalNameNoQuote) Then On Error GoTo 0 Set FindNameLocal = Nothing For Each oName In oSheet.Names strName = oName.Name If Len(strLocalName) = Len(strName) Or Len(strLocalNameNoQuote) = Len(strName) Then If strName = strLocalName Or strName = strLocalNameNoQuote Then Set FindNameLocal = oName GoTo GoExit End If End If Next End If End If GoExit: End Function