Автозамена гиперссылок в Excel?

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

e-aleks
Сообщения: 8
Зарегистрирован: 22 дек 2004, 11:06

22 дек 2004, 11:09

Товарисчи кто сталкивался с подобной проблемой и/или знает как ее решить.

Есть некий реестр в Excel содержащий гиперссылки на другие файлы (на сам файл, т.е. кликаешь по ссылке и тебе открывается этот файл).

Но вот случилась проблема, путь к файлам изменился. Править каждую ссылку вручную утомительно, автозамена в данном случае не работает,
правка->связи неактивна.

Кто знает как решить эту проблему?

Заранее благодарен.
Kostik
Сообщения: 12
Зарегистрирован: 03 дек 2004, 12:31

22 дек 2004, 16:37

у меня тоже есть такая проблема! как ее решить не знаю!
единственно до чего додумался это копировать такие ячейки, бросать в блокнот, а потом бросать тот же список обратно в эксель, но в тот же столбик нельзя, гиперссылки снова будут, а в другой столбик. Метод подходит, если данных не много и они все в одном столбике, но в идеале эту проблему надо решать по другому.
Да будет так! :)
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

22 дек 2004, 17:33

Стартуем запись макроса, кликаем на гиперссылке правой кнопкой мыши, выполняем пункт "Гиперссылка/Изменить гиперссылку..." - в окне меняем значение на нужное, жмём ОК. Останавливаем запись макроса. Открываем VB - Alt-F11, открываем наш модуль и видим макрос вида:

Код: Выделить всё

Selection.Hyperlinks(1).Address = "c:\readme.txt"
Далее адаптируем к нашим требованиям... Если непонятно, попозже напишу подробнее
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

22 дек 2004, 17:39

Во! Даже лучше: открываем хелп по Hyperlinks и видим в примере то, что надо:

Код: Выделить всё

For Each h in Worksheets(1).Hyperlinks
    If Instr(h.Name, "Microsoft") <> 0 Then h.Follow
Next
только в цикле пишем нужные преобразования
Изображение
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

22 дек 2004, 17:49

Да, пакетная правка ссылок станартными функциями интерфейса не предусмотрена. Прийдется писать макрос.

Код: Выделить всё

Sub qwe()
Dim lnk As Hyperlink
  For Each lnk In ActiveSheet.Hyperlinks
    MsgBox lnk.Address
  Next
End Sub
Этот макрос пролистывает все гиперссылки на текущем листе. Соответственно надо
lnk.Address = новый_адрес
где новый адрес вычисляется путем выкусывания и вставки части строки. Это уж сами напете, я надеюсь.
Kostik
Сообщения: 12
Зарегистрирован: 03 дек 2004, 12:31

22 дек 2004, 17:52

Игорь Акопян писал(а):Стартуем запись макроса...
макросы это ай-яй-яй! :)
а попроще нельзя ли?
Да будет так! :)
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

22 дек 2004, 18:19

Нет
e-aleks
Сообщения: 8
Зарегистрирован: 22 дек 2004, 11:06

22 дек 2004, 18:36

Naeel Maqsudov писал(а): lnk.Address = новый_адрес
где новый адрес вычисляется путем выкусывания и вставки части строки. Это уж сами напете, я надеюсь.
Спасибо большое, только я вот с VBA дело на имел, только в свои времена с Qbasic.
Т.е., могли вы бы объяснить подробнее:
1. Лучше всего как эту ссылку вытянуть в столбец рядом, там бы я ее поменял на функцию "гиперссылка" и в дальнейшем не мучался.
или
2. Как изменить путь
путь был вида \\папка 1\папка2\n_file.xls
а нужно изменить на \\папка 1\папка2\подпапка_n\n_file.xls, где n куча разных имен.
В жизни это выглядит так, была сетевая директорий в которой скопом хранились документы вида "название контрагента дата документа".
потом в этой директории создали директории с именем контрагента, и туда переместили все файлы относящиеся к данному контрагенту.
Фу надеюсь понятно объяснил.
Если нет, пойду искать пособие по VBA :)
e-aleks
Сообщения: 8
Зарегистрирован: 22 дек 2004, 11:06

23 дек 2004, 09:24

Игорь Акопян писал(а):Стартуем запись макроса, кликаем на гиперссылке правой кнопкой мыши, выполняем пункт "Гиперссылка/Изменить гиперссылку..." - в окне меняем значение на нужное, жмём ОК. Останавливаем запись макроса. Открываем VB - Alt-F11, открываем наш модуль и видим макрос вида:

Код: Выделить всё

Selection.Hyperlinks&#40]

Далее адаптируем к нашим требованиям... Если непонятно, попозже напишу подробнее[/quote]
Непонятно,  как взять две части старого имени, и между ними вставить нужный кусок пути.
Т.е. 
1. Оператор который содержит текущее имя гиперссылки какой?
2. Дальше, что то вроде substr()?
3. Как все это вместе сцеплять, через &?

Спасибо за помошь.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

23 дек 2004, 11:09

Спасибо большое, только я вот с VBA дело на имел, только в свои времена с Qbasic.
Отлично! Используем функции Mid$, Left$, Right$, Len, InStr, ну и сцепление строк, разумеется ("йцук" & "енг")
1. Лучше всего как эту ссылку вытянуть в столбец рядом, там бы я ее поменял на функцию "гиперссылка" и в дальнейшем не мучался.

О! классная идея, как это мне самому в голову не пришло! :)

Код: Выделить всё

Sub qwe()
Dim lnk As Hyperlink
  For Each lnk In ActiveSheet.Hyperlinks
    lnk.Range.Next.Value = lnk.Address
  Next
End Sub

Sub unqwe()
Dim lnk As Hyperlink
  For Each lnk In ActiveSheet.Hyperlinks
    lnk.Address = lnk.Range.Next.Value
  Next
End Sub

Осторожно, если в ячейкках справа от гтперссылок что-то есть, то значения пострадают.
Можно также использовать отдельный лист для правки адресов. Тогда вместо lnk.Range.Next.Value надо писать WorkSheets("Отдельный лист").Cells(i,1)
переменную i до цикла установить в 1 и увеличивать перед Next.

Но в этом случае между вызовами qwe и unqwe НЕЛЬЗЯ править ссылки на листе, иначе они перемешаются!
Ответить