2013-02-15 117 views
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 

但子运行后,本地范围的版本地址已更改为newRange.address的地址,全局范围保持不变。

还有什么我可以做的,以确保.RefersTo目标的全球命名范围?

编辑:当脚本运行时,本地作用域命名范围引用的表单处于活动状态。

回答

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之一。然而,这似乎是解决问题的一种奇怪的方式,所以我会等待看看是否有人在接受我自己的答案之前提出更好的建议。

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