Изменение размера именованного диапазона удаляет структуру имени диапазона - PullRequest
0 голосов
/ 12 марта 2019

Всякий раз, когда я пытаюсь изменить размер или иным образом изменить местоположение ячейки для диапазона, например, «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". Опять же, диапазон расположения не сместился

Диспетчер имен указывает, что ячейки изменились в правильное местоположение в обоих случаях

1 Ответ

0 голосов
/ 12 марта 2019

На ваш вопрос трудно ответить, но я не вижу проблем:

Sub Tester()

    Dim theName As Name

    Set theName = ActiveSheet.Names.Add(Name:="myName", RefersTo:=ActiveSheet.Range("A1"))

    showIt theName  '>> Name:Sheet1!myName          Address:$A$1

    theName.RefersTo = ActiveSheet.Range("B1:B3")

    showIt theName  '>> Name:Sheet1!myName          Address:$B$1:$B$3

    theName.RefersTo = theName.RefersToRange.Resize(6, 4)

    showIt theName  '>> Name:Sheet1!myName          Address:$B$1:$E$6

End Sub

Sub showIt(nm As Name)
    Debug.Print "Name:" & nm.Name, "Address:" & nm.RefersToRange.Address
End Sub

Кстати, это выглядит как опечатка:

.RefersTo = .RefersToRange.Offset(-1).Resize(2).Select

Select не принадлежит там

EDIT Вы делаете это:

 Set rResize = Range(scResizeRange)

сейчас rResize указывает на диапазон, определенный в scResizeRange, но нет никакой связи между rResize и вашим именованным диапазоном - они независимы. Поэтому, если вы измените именованный диапазон, а затем сделаете следующее:

 rResize(iRow) = scFreda

... тогда ожидается, что вы напишите в исходное местоположение именованного диапазона

...