0

我正在尝试更改命名范围所指的地址。工作簿中有两个同名范围,一个范围为工作簿,另一个范围为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

但是在 sub 运行之后,本地范围版本的地址已更改为的地址,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 回答