7

詳しく説明すると、ワークブックに 2 つの名前付き範囲があるとします。両方の名前付き範囲の名前は同じですが (「myName」としましょう)、一方はシート 1 にスコープされ、もう一方はワークブックにスコープされます。

名前付き範囲の名前 (文字列) を指定して、ワークブック レベルの名前付き範囲を取得します。

ネイティブ コール: を使用するとwb.Names.Item("myName")、シート スコープの名前付き範囲が返されます。

代わりに: を実行するwb.Names.Item("Sheet1!myName")と、明らかにシート スコープの名前範囲が返されます。これを使用してシート固有のものを指定できることがわかりましたが、ワークブックのものは指定できません。

とにかく、ワークブックの範囲を指定できるものはありますか?

私の回避策は現在、すべての名前のリストを反復処理し、.Name プロパティを比較してワークブック スコープの名前付き範囲を取得することです。これが機能するのは、.Name プロパティが「Sheet1!」を追加するためです。シート スコープの名前付き範囲に。ただし、これは非常にコストがかかるため、避けたいと思います。

4

1 に答える 1

1

私たち(JKPと私)がName Managerを作成していたとき、重複するグローバル/ローカル名のフィルターと警告メッセージを具体的に追加しました。これは、この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
于 2012-10-10T08:14:54.953 に答える