#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. большое вам спасибо! это делает именно то, что мне нужно, — действительно ценю помощь.