Всякий раз, когда я пытаюсь изменить размер или иным образом изменить местоположение ячейки для диапазона, например, «A1: B1» - «A1: B2» Структура имени, связанная с диапазоном, удаляется. запись наблюдения для range .Name будет отображаться в столбце значений как
Ошибка приложения или объекта
Кажется, не имеет значения, связано ли с ним имя или нет. Фактически, изменение имени с помощью RefersTo = автоматически удаляет структуру имени. Следующий код был получен из ответа на вопрос 11031891, Как переопределить именованный диапазон с помощью VBA?
Option Explicit
Enum eColumn
FIRSTCOLUMN = 1
SECONDCOLUMN = 2
End Enum
Enum eRow
FIRSTROW = 1
SECONDROW = 2
End Enum
Public Const scFred As String = "Fred"
Public Const scFreda As String = "Freda"
Public Const scAbsoluteValueRange As String = "AbsoluteValueRange"
Public Const scResizeRange As String = "ResizeRange"
Sub ResizeIt()
Dim iRow As Integer
Dim nAbsoluteValue As Name
Dim nResize As Name
Dim rAbsoluteValue As Range
Dim rResize As Range
Dim ws As Worksheet
Set ws = ActiveSheet
' **** Create Ranges ***
ws.Names.Add Name:=scAbsoluteValueRange, RefersTo:=Cells(FIRSTROW, FIRSTCOLUMN)
ws.Names.Add Name:=scResizeRange, RefersTo:=Cells(SECONDROW, SECONDCOLUMN)
Set rAbsoluteValue = Range(scAbsoluteValueRange)
Set rResize = Range(scResizeRange)
Set nAbsoluteValue = ws.Names.Item(scAbsoluteValueRange)
Set nResize = ws.Names.Item(scResizeRange)
' **** Change Ranges ***
' give an absolute reference:
With nAbsoluteValue
.RefersTo = ws.Cells(SECONDROW, FIRSTCOLUMN)
End With
iRow = FIRSTROW
rAbsoluteValue(iRow) = scFred
' or, resize relative to old reference:
With nResize
.RefersTo = .RefersToRange.Offset(-1).Resize(2).Select
End With
iRow = FIRSTROW
rResize(iRow) = scFreda
End Sub
Если запустить код до конца фазы «Создание диапазонов», я получу два диапазона:
Абсолютное значение, занимающее «А1»
Изменение размера занимающего "B2"
Окно часов подтверждает это
Часы: +: nAbsoluteValue: "= Sheet1! $ A $ 1": Имя / Имя: Module1.ResizeIt
Смотреть: +: rAbsoluteValue.Name: "= Sheet1! $ A $ 1": вариант / объект / имя: Module1.ResizeIt
Смотреть: +: nResize: "= Лист1! $ B $ 2": Имя / Имя: Module1.ResizeIt
Часы: +: rResize.Name: "= Sheet1! $ B $ 2": вариант / объект / имя: Module1.ResizeIt
Затем я изменяю местоположение, используя объект Name, AbsoluteValue на "A2"
В окне просмотра я получаю
Часы: +: nAbsoluteValue: "= Sheet1! $ A $ 2": Имя / Имя: Module1.ResizeIt
Смотреть:: rAbsoluteValue.Name:: Variant / Integer: Module1.ResizeIt
Однако, когда я пытаюсь записать в ячейку "A2" (что должно быть первой строкой в диапазоне), результат Fred попадает в "A1". Другими словами, местоположение диапазона не изменилось
издание
Для диапазона Resize я получаю аналогичный результат:
Смотреть: +: nResize: "= Лист1! $ B $ 1: $ B $ 2": Имя / Имя: Module1.ResizeIt
Смотреть:: rResize.Name:: Variant / Integer: Module1.ResizeIt
Однако, когда я пытаюсь записать в ячейку "B1" (что должно быть первой строкой в диапазоне), результат Freda попадает в "B2". Опять же, диапазон расположения не сместился
Диспетчер имен указывает, что ячейки изменились в правильное местоположение в обоих случаях