Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Excel, VBA

1.9K
11 марта 2003 года
DKef
44 / / 11.03.2003
Необходимо программное создание ссылки на лист, имя листа заранее не известно. ActiveSheet.Hyperlinks.Add не позволяет передавать имя листа в качестве переменной, т. е. требует постоянное имя листа... Буду очень признателен, с уважением, Олег!
1.3K
11 марта 2003 года
IKor
116 / / 04.12.2002
Цитата:
Originally posted by DKef
Необходимо программное создание ссылки на лист, имя листа заранее не известно. ActiveSheet.Hyperlinks.Add не позволяет передавать имя листа в качестве переменной, т. е. требует постоянное имя листа... Буду очень признателен, с уважением, Олег!



По-моему, в Excel листы имеют не только имена, но и номера. Ими воспользоваться не удается?

Сам я ими никогда не пользовался и готовых решений пока нет.

1.9K
11 марта 2003 года
DKef
44 / / 11.03.2003
Цитата:
Originally posted by IKor


По-моему, в Excel листы имеют не только имена, но и номера. Ими воспользоваться не удается?

Сам я ими никогда не пользовался и готовых решений пока нет.



Однако пробовал я с номерами листов, но просто формат ActiveSheet.Hyperlinks.Add SubAddress:="Имя_Листа!Имя_Ячейки" сам по себе предусматривает использование имя листа, а используя номер он добавлять-то ее добавляет, но при клике на нее грит: "Неверная ссылка" :((( Может можно добавить какой-нить другой командой?!

267
11 марта 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by DKef


Однако пробовал я с номерами листов, но просто формат ActiveSheet.Hyperlinks.Add SubAddress:="Имя_Листа!Имя_Ячейки" сам по себе предусматривает использование имя листа, а используя номер он добавлять-то ее добавляет, но при клике на нее грит: "Неверная ссылка" :((( Может можно добавить какой-нить другой командой?!



Я так понял, что вся проблема в том, чтобы получить в программе имя листа. Как это сделать, зависит от того, как именно ты определяешь тот лист, на который ссылка. Если по номеру в книге (от левого края), то Worksheets(2).Name, например, возвращает имя второго листа. Если у тебя есть ссылка на ячейку с этого листа (объектная переменная, например, d), то имя содержащего ее листа надо получать при помощи d.Parent.Name
Если у тебя есть в книге конкретный лист, но юзер может его переименовать или переставить в другое место, то делай так: у каждого листа помимо Excel-имени (.Name) есть еще VisualBasic-имя (.CodeName)
Его можно менять только в окне VBA. Выбираешь для него какое-нибудь имя, например, "MyList", называешь соответственно в окне VBA, и потом при помощи MyList.Name получаешь то имя, которое он носит в данный момент в Excel.

Если ничего из вышесказанного тебе не подходит, объясни на какой лист ты хочешь сделать ссылку (в смысле, как определить что это за лист)

1.9K
12 марта 2003 года
DKef
44 / / 11.03.2003
Цитата:
Originally posted by Cutty Sark


Я так понял, что вся проблема в том, чтобы получить в программе имя листа. Как это сделать, зависит от того, как именно ты определяешь тот лист, на который ссылка. Если по номеру в книге (от левого края), то Worksheets(2).Name, например, возвращает имя второго листа. Если у тебя есть ссылка на ячейку с этого листа (объектная переменная, например, d), то имя содержащего ее листа надо получать при помощи d.Parent.Name
Если у тебя есть в книге конкретный лист, но юзер может его переименовать или переставить в другое место, то делай так: у каждого листа помимо Excel-имени (.Name) есть еще VisualBasic-имя (.CodeName)
Его можно менять только в окне VBA. Выбираешь для него какое-нибудь имя, например, "MyList", называешь соответственно в окне VBA, и потом при помощи MyList.Name получаешь то имя, которое он носит в данный момент в Excel.

Если ничего из вышесказанного тебе не подходит, объясни на какой лист ты хочешь сделать ссылку (в смысле, как определить что это за лист)



В общем, задача поставлена так:
Есть книга, в которой отдельный лист - это контракт, который добавляется только по нажатию моей кнопки - шаблон будущего контракта (иначе добавить нельзя, т.к. книга защищена);
Затем в шаблон вводится наименование компании и контракта, нажимается кнопка "Переименовать лист" - имени листа присваивается имя контракта;
Имя компании и имя контракта выносится на лист "Содержание" (для удобства навигации по базе)
И САМОЕ СТРАШНОЕ (шутка конечно ;): При появлении нового контракта я ручками прописываю ссылку на лист в "Содержании".

ВЫВОД (к чему я вообще веду): ActiveSheet.Hyperlinks.Add SubAddress позволяет обращаться к листу ТОЛЬКО по константе - имени; испоьзование переменной или номера листа вызывает ошибку типа: "Неверная ссылка"...
Пожалуйста, подскажи мне идею как это сделать иначе, в смысле добавление гиперссылки
Заранее благодарен!

1.3K
12 марта 2003 года
IKor
116 / / 04.12.2002
Цитата:
Originally posted by DKef

Имя компании и имя контракта выносится на лист "Содержание" (для удобства навигации по базе)
И САМОЕ СТРАШНОЕ (шутка конечно ;): При появлении нового контракта я ручками прописываю ссылку на лист в "Содержании".


А можно ли продублировать уникальную информацию (имя компании, контракта) не только в имени листа, но и в одной из его ячеек.
Затем перебирать все листы (я не знаю как, но точно знаю, что в VBA это возможно) на предмет нахождения интересующей записи (в известной ячейке, например).
А затем можно делать что угодно: либо сразу ссылаться на найденную ячейку, либо по ее свойствам выяснить имя листа и ссылаться уже на него.

Подобная идея приходила мне в голову раньше (привязанная к моим задачам), но до окончательной ее реализации я так и не созред.
Как вы считаете - она жизнеспособна, или это мертворожденное недоразумение?

1.9K
12 марта 2003 года
DKef
44 / / 11.03.2003
Идея - не "мертворожденное недоразумение", это точно!
Но дело в том, что опять же имя листа будет задаваться НЕ явно, а через переменную, а оно мне и так известно! Так же и с ячейкой... ВОт бы мне процедуру, которая использует переменную в качестве имени листа, чтобы передать ей это имя в процессе выполнения макроса!
Вот есть ActiveSheet.Hyperlinks.Add - может я чего-то не допонимаю, но в качестве аргумента SubAddress можно использовать "имя_иста!имя_ячейки" либо диапазон ячеек -например, "А3:С10". А может быть, кстати, и такое, что я просто не знаю, но как-то можно здесь неявно указать, типа просто без кавычек или еще как-нить ;) Если это так, не обессутьте!

И еще раз повторюсь: Идея - не "мертворожденное недоразумение", просто она не приминима к данной ситуации!
В уважением,
267
12 марта 2003 года
Cutty Sark
1.2K / / 17.10.2002
Ну вы тут намудрили... :) Если имя листа известно, то проблем никаких нет:

ActiveSheet.Hyperlinks.Add Anchor:=Range("C2"), Address:="", SubAddress:=SheetName & "!A10:C10"

Ты, наверное, просто забыл один из параметров метода Add указать...
267
12 марта 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by Cutty Sark
Ну вы тут намудрили... :) Если имя листа известно, то проблем никаких нет:

ActiveSheet.Hyperlinks.Add Anchor:=Range("C2"), Address:="", SubAddress:=SheetName & "!A10:C10"

Ты, наверное, просто забыл один из параметров метода Add указать...




ДОГАДАЛСЯ! У тебя имя листа наверняка содержит пробелы или другие небуквы (имя контракта все-таки). Такие имена надо в апострофы заключать. То есть SubAddress:= "'" & SheetName & "'!A10:C10", чтобы получилось 'Контракт №2'!A10:C10 вместо Контракт №2!A10:C10

1.9K
12 марта 2003 года
DKef
44 / / 11.03.2003
Цитата:
Originally posted by Cutty Sark
Ну вы тут намудрили... :) Если имя листа известно, то проблем никаких нет:

ActiveSheet.Hyperlinks.Add Anchor:=Range("C2"), Address:="", SubAddress:=SheetName & "!A10:C10"

Ты, наверное, просто забыл один из параметров метода Add указать...



Спасибо, друг!!!
Что и требовалось доказать! ;) Я просто не знал как разделить имя листа и ячейку. Оказывается &, а я и запятую, и точку с запятой, и просто через пробел пробовал, а вот про & - не знал, честно...
Спасибо всем, кто принимал участие в данной теме!!!
Тема ЗАКРЫТА!!! :-)))

267
12 марта 2003 года
Cutty Sark
1.2K / / 17.10.2002
Имя листа-ячейки здесь не причем. & - это обычная операция склеивания строк в Visual Basic.
1.9K
12 марта 2003 года
DKef
44 / / 11.03.2003
Цитата:
Originally posted by Cutty Sark
Имя листа-ячейки здесь не причем. & - это обычная операция склеивания строк в Visual Basic.


Вот чего не знал, того не знал... я начинающий в прогриммировании на ВБА ;) так что пасибо! надеюсь Вашими усилиями и моими стараниями у меня чего-нибудь выйдет! 8) еще раз пасибо!!! Я уже доделал, все отрабатывает - классно!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог