Excel, VBA
Необходимо программное создание ссылки на лист, имя листа заранее не известно. ActiveSheet.Hyperlinks.Add не позволяет передавать имя листа в качестве переменной, т. е. требует постоянное имя листа... Буду очень признателен, с уважением, Олег!
По-моему, в Excel листы имеют не только имена, но и номера. Ими воспользоваться не удается?
Сам я ими никогда не пользовался и готовых решений пока нет.
По-моему, в Excel листы имеют не только имена, но и номера. Ими воспользоваться не удается?
Сам я ими никогда не пользовался и готовых решений пока нет.
Однако пробовал я с номерами листов, но просто формат ActiveSheet.Hyperlinks.Add SubAddress:="Имя_Листа!Имя_Ячейки" сам по себе предусматривает использование имя листа, а используя номер он добавлять-то ее добавляет, но при клике на нее грит: "Неверная ссылка" :((( Может можно добавить какой-нить другой командой?!
Однако пробовал я с номерами листов, но просто формат ActiveSheet.Hyperlinks.Add SubAddress:="Имя_Листа!Имя_Ячейки" сам по себе предусматривает использование имя листа, а используя номер он добавлять-то ее добавляет, но при клике на нее грит: "Неверная ссылка" :((( Может можно добавить какой-нить другой командой?!
Я так понял, что вся проблема в том, чтобы получить в программе имя листа. Как это сделать, зависит от того, как именно ты определяешь тот лист, на который ссылка. Если по номеру в книге (от левого края), то Worksheets(2).Name, например, возвращает имя второго листа. Если у тебя есть ссылка на ячейку с этого листа (объектная переменная, например, d), то имя содержащего ее листа надо получать при помощи d.Parent.Name
Если у тебя есть в книге конкретный лист, но юзер может его переименовать или переставить в другое место, то делай так: у каждого листа помимо Excel-имени (.Name) есть еще VisualBasic-имя (.CodeName)
Его можно менять только в окне VBA. Выбираешь для него какое-нибудь имя, например, "MyList", называешь соответственно в окне VBA, и потом при помощи MyList.Name получаешь то имя, которое он носит в данный момент в Excel.
Если ничего из вышесказанного тебе не подходит, объясни на какой лист ты хочешь сделать ссылку (в смысле, как определить что это за лист)
Я так понял, что вся проблема в том, чтобы получить в программе имя листа. Как это сделать, зависит от того, как именно ты определяешь тот лист, на который ссылка. Если по номеру в книге (от левого края), то Worksheets(2).Name, например, возвращает имя второго листа. Если у тебя есть ссылка на ячейку с этого листа (объектная переменная, например, d), то имя содержащего ее листа надо получать при помощи d.Parent.Name
Если у тебя есть в книге конкретный лист, но юзер может его переименовать или переставить в другое место, то делай так: у каждого листа помимо Excel-имени (.Name) есть еще VisualBasic-имя (.CodeName)
Его можно менять только в окне VBA. Выбираешь для него какое-нибудь имя, например, "MyList", называешь соответственно в окне VBA, и потом при помощи MyList.Name получаешь то имя, которое он носит в данный момент в Excel.
Если ничего из вышесказанного тебе не подходит, объясни на какой лист ты хочешь сделать ссылку (в смысле, как определить что это за лист)
В общем, задача поставлена так:
Есть книга, в которой отдельный лист - это контракт, который добавляется только по нажатию моей кнопки - шаблон будущего контракта (иначе добавить нельзя, т.к. книга защищена);
Затем в шаблон вводится наименование компании и контракта, нажимается кнопка "Переименовать лист" - имени листа присваивается имя контракта;
Имя компании и имя контракта выносится на лист "Содержание" (для удобства навигации по базе)
И САМОЕ СТРАШНОЕ (шутка конечно ;): При появлении нового контракта я ручками прописываю ссылку на лист в "Содержании".
ВЫВОД (к чему я вообще веду): ActiveSheet.Hyperlinks.Add SubAddress позволяет обращаться к листу ТОЛЬКО по константе - имени; испоьзование переменной или номера листа вызывает ошибку типа: "Неверная ссылка"...
Пожалуйста, подскажи мне идею как это сделать иначе, в смысле добавление гиперссылки
Заранее благодарен!
Имя компании и имя контракта выносится на лист "Содержание" (для удобства навигации по базе)
И САМОЕ СТРАШНОЕ (шутка конечно ;): При появлении нового контракта я ручками прописываю ссылку на лист в "Содержании".
А можно ли продублировать уникальную информацию (имя компании, контракта) не только в имени листа, но и в одной из его ячеек.
Затем перебирать все листы (я не знаю как, но точно знаю, что в VBA это возможно) на предмет нахождения интересующей записи (в известной ячейке, например).
А затем можно делать что угодно: либо сразу ссылаться на найденную ячейку, либо по ее свойствам выяснить имя листа и ссылаться уже на него.
Подобная идея приходила мне в голову раньше (привязанная к моим задачам), но до окончательной ее реализации я так и не созред.
Как вы считаете - она жизнеспособна, или это мертворожденное недоразумение?
Но дело в том, что опять же имя листа будет задаваться НЕ явно, а через переменную, а оно мне и так известно! Так же и с ячейкой... ВОт бы мне процедуру, которая использует переменную в качестве имени листа, чтобы передать ей это имя в процессе выполнения макроса!
Вот есть ActiveSheet.Hyperlinks.Add - может я чего-то не допонимаю, но в качестве аргумента SubAddress можно использовать "имя_иста!имя_ячейки" либо диапазон ячеек -например, "А3:С10". А может быть, кстати, и такое, что я просто не знаю, но как-то можно здесь неявно указать, типа просто без кавычек или еще как-нить ;) Если это так, не обессутьте!
И еще раз повторюсь: Идея - не "мертворожденное недоразумение", просто она не приминима к данной ситуации!
В уважением,
ActiveSheet.Hyperlinks.Add Anchor:=Range("C2"), Address:="", SubAddress:=SheetName & "!A10:C10"
Ты, наверное, просто забыл один из параметров метода Add указать...
Ну вы тут намудрили... :) Если имя листа известно, то проблем никаких нет:
ActiveSheet.Hyperlinks.Add Anchor:=Range("C2"), Address:="", SubAddress:=SheetName & "!A10:C10"
Ты, наверное, просто забыл один из параметров метода Add указать...
ДОГАДАЛСЯ! У тебя имя листа наверняка содержит пробелы или другие небуквы (имя контракта все-таки). Такие имена надо в апострофы заключать. То есть SubAddress:= "'" & SheetName & "'!A10:C10", чтобы получилось 'Контракт №2'!A10:C10 вместо Контракт №2!A10:C10
Ну вы тут намудрили... :) Если имя листа известно, то проблем никаких нет:
ActiveSheet.Hyperlinks.Add Anchor:=Range("C2"), Address:="", SubAddress:=SheetName & "!A10:C10"
Ты, наверное, просто забыл один из параметров метода Add указать...
Спасибо, друг!!!
Что и требовалось доказать! ;) Я просто не знал как разделить имя листа и ячейку. Оказывается &, а я и запятую, и точку с запятой, и просто через пробел пробовал, а вот про & - не знал, честно...
Спасибо всем, кто принимал участие в данной теме!!!
Тема ЗАКРЫТА!!! :-)))
Имя листа-ячейки здесь не причем. & - это обычная операция склеивания строк в Visual Basic.
Вот чего не знал, того не знал... я начинающий в прогриммировании на ВБА ;) так что пасибо! надеюсь Вашими усилиями и моими стараниями у меня чего-нибудь выйдет! 8) еще раз пасибо!!! Я уже доделал, все отрабатывает - классно!