当名称重复时,在Excel工作簿中按字符串获取命名范围

Sha*_*ark 7 c# excel named-ranges

详细说来,假设我的工作簿中有两个命名范围.两个命名范围都具有相同的名称(比如说"myName"),但是一个范围限定为Sheet1,另一个范围限定为工作簿.

给定命名范围的名称(字符串),我想获取工作簿级别命名范围.

如果我使用本机调用:wb.Names.Item("myName"),则返回工作表作用域命名范围.

如果我改为:wb.Names.Item("Sheet1!myName"),那显然会返回工作表范围的名称范围.我发现我可以使用它来指定特定于工作表的工作表,但不能指定工作簿.

无论如何我可以指定我想要工作簿作用域吗?

我的解决方法是迭代所有Name的列表,并比较.Name属性以获取工作簿范围命名范围.这是有效的,因为.Name属性附加了"Sheet1!" 到工作表范围命名范围.然而,这是非常昂贵的,我想避免它.

Cha*_*ams 1

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

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

我们使用代码来检测名称是否在全局/本地重复,并且本地名称的父级处于活动状态,然后在必要时切换工作表。我们用来查找全局名称的本地版本的优化 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
Run Code Online (Sandbox Code Playgroud)