0

名前付き範囲が参照するアドレスを変更しようとしています。ワークブックには同じ名前の 2 つの範囲があり、1 つはワークブックをスコープとし、もう 1 つは をスコープとしていSheetAます。私はこのコードを使用しています:

Sub changeNamedRangeAddress(bk As Workbook, rangeName As String, newRange As Range)
    bk.Names(rangeName).RefersTo = newRange
End Sub

イミディエイト ウィンドウで の値を見ると、bk.Names(rangeName)その名前のグローバル バージョンを参照しているように見えます。これは、以下が true を返すためです。

?typeof bk.Names(rangeName).Parent is Workbook

しかし、サブルーチンの実行後、ローカル スコープ バージョンのアドレスは のアドレスに変更されnewRange.address、グローバル バージョンは同じままです。

グローバルな名前付き範囲を確実に.RefersToターゲットにするために他にできることはありますか?

編集: ローカル スコープの名前付き範囲が参照するシートは、このスクリプトの実行時にアクティブになります。

4

2 に答える 2

0

別のワークシートをアクティブにすることでこれを解決しました。したがって、コードは次のようになります。

Sub changeNamedRangeAddress(bk As Workbook, rangeName As String, newRange As Range)
    bk.Sheets("SheetB").Activate
    bk.Names(rangeName).RefersTo = newRange
End Sub

何らかの理由で、これにより.RefersTo、 を指すものではなく、グローバル範囲を変更できますSheetA。ただし、これは問題を解決するための奇妙な方法のように思えるので、自分の答えを受け入れる前に、誰かがより良い方法を思いつくかどうかを確認するのを待ちます.

于 2013-02-15T20:46:01.967 に答える
0

これは、シート全体でこのようなケースがいくつかまたはいくつかある場合(私が見たものです)、より機能的なソリューションですが、より機能的なものを除いて、1または2と大きな違いはありませんあなたの図書館で手続き!:)

Option Explicit

Sub changeGlobalNamedRangeAddress(bk As Workbook, rangeName As String, newRange As Range)
'this sub only changes named range scoped to the workbook and ignores any ranges scoped to the worksheet with the same name.

Dim n As Name

For Each n In bk.Names

    If InStr(1, n.Name, rangeName) > 0 And InStr(1, n.NameLocal, "!") = 0 Then

        n.RefersTo = newRange
        Exit For

    End If

Next

End Sub
于 2013-02-15T21:49:10.867 に答える