Создание смешанной ссылки с именем диапазона с помощью VBA

#excel #vba #named-ranges

Вопрос:

Я пытаюсь написать некоторый VBA, который может создать именованный диапазон, если он соответствует заголовку. Мне удалось добиться этого, но я столкнулся с проблемой, из-за которой, похоже, не могу приступить к работе.

Мне нужно, чтобы именованный диапазон был смешанной ссылкой только для блокировки в столбце. У меня тоже есть это для работы, но при попытке объединить все это не несет смешанной ссылки.

Примеры —

     Sub test()

i = 1
Do Until Cells(1, i) = "Created Date"
i = i   1
Loop

NR1 = Cells(1, i).Offset(1, 0).Address(False, True)


ActiveWorkbook.Names.Add Name:="Created_Date", RefersTo:=NR1
ActiveWorkbook.Names("Created_Date").Comment = ""


End Sub
 

Выше будет указан именованный диапазон с требуемой смешанной ссылкой, но, очевидно, без имени листа —
введите описание изображения здесь

поэтому моя мысль заключалась в том, чтобы просто использовать activesheet.range(NR1) вот так —

 Sub test()

i = 1
Do Until Cells(1, i) = "Created Date"
i = i   1
Loop

NR1 = Cells(1, i).Offset(1, 0).Address(False, True)

ActiveWorkbook.Names.Add Name:="Created_Date", RefersTo:=ActiveSheet.Range(NR1)
ActiveWorkbook.Names("Created_Date").Comment = ""

End Sub
 

Это действительно создает именованный диапазон на листе, но ссылки возвращаются к блокировке в одной ячейке!

введите описание изображения здесь

есть какие-нибудь идеи?

Комментарии:

1. Примечание для упрощения вашего кода: Имена. Метод Add возвращает новое имя в качестве объекта. Это означает, что вы можете сказать With ActiveWorkbook.Names.Add( ... ) : .Comment = "" : End With или вы можете просто напрямую соединить строки вместе, например ActiveWorkbook.Names.Add( ... ).Comment = ""

Ответ №1:

Вы можете использовать External аргумент в Range.Address свойстве, чтобы сделать имя книги и листа частью возвращаемого адреса.

Если вы введете адрес в RefersTo аргумент, он просто примет строку в качестве значения вместо перехода к ячейкам или диапазону, на которые указывает адрес. Чтобы исправить это взаимодействие, вы можете добавить = перед адресом, чтобы превратить строку в формулу, которую будет оценивать Excel.

Поэтому со следующими изменениями ваш код должен делать то, что вы хотите:

 NR1 = Cells(1, i).Offset(1, 0).Address(False, True, External:=True)


ActiveWorkbook.Names.Add Name:="Created_Date", RefersTo:="=" amp; NR1
 

Комментарии:

1. большое вам спасибо! это делает именно то, что мне нужно, — действительно ценю помощь.