2013-02-15 75 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