2013-02-15 4 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 
Смежные вопросы