Макрос для исправление повреждённых гиперссылок во всей книге:
Sub ЗаменаИспорченныхГиперссылок() On Error Resume Next Dim hl As Hyperlink, oldString As String, newString As String, sh As Worksheet ' часть гиперссылки, подлежащая замене oldString = "C:\Documents and settings\Бухгалтер\Application data" ' на что заменяем newString = "\\адрес_сервера" For Each sh In ActiveWorkbook.Worksheets ' перебираем все листы в активной книге For Each hl In sh.Hyperlinks ' перебираем все гиперссылки на листе If hl.Address Like oldString & "*" Then hl.Address = Replace(hl.Address, oldString, newString) End If Next Next sh End Sub
Если нужно заменить несколько вариантов неверных ссылок, код будет таким:
Sub ЗаменаИспорченныхГиперссылок_2() On Error Resume Next Dim hl As Hyperlink, newString$, sh As Worksheet ' часть гиперссылки, подлежащая замене oldString1 = "C:\Documents and settings\Бухгалтер\1" oldString2 = "C:\Documents and settings\Бухгалтер\2" ' на что заменяем newString = "\\адрес_сервера" For Each sh In ActiveWorkbook.Worksheets ' перебираем все листы в активной книге For Each hl In sh.Hyperlinks ' перебираем все гиперссылки на листе If hl.Address Like oldString1 & "*" Then hl.Address = Replace(hl.Address, oldString1, newString) If hl.Address Like oldString2 & "*" Then hl.Address = Replace(hl.Address, oldString2, newString) Next Next sh End Sub
Расширенная версия этого макроса учитывает, что слеш в ссылках может быть как прямым, так и обратным, а также выводит информацию о количестве произведённых замен, и список ссылок из файла, которые не были обработаны (к которым замены не были применены)
Sub ЗаменаИспорченныхГиперссылок2() On Error Resume Next Dim hl As Hyperlink, oldString$, newString$, sh As Worksheet, n&, msg$, coll As New Collection, Item ' часть гиперссылки, подлежащая замене oldString = "../../AppData/Roaming/Microsoft/Excel/" ' на что заменяем newString = "C:\Users\Admin\Desktop\ОТЧЁТЫ ВСЕ\" For Each sh In ActiveWorkbook.Worksheets ' перебираем все листы в активной книге For Each hl In sh.Hyperlinks ' перебираем все гиперссылки на листе ' Debug.Print hl.Address If (hl.Address Like oldString & "*") Or (hl.Address Like Replace(oldString, "/", "\") & "*") Then hl.Address = Replace(hl.Address, oldString, newString, , , vbTextCompare) hl.Address = Replace(hl.Address, Replace(oldString, "/", "\"), newString, , , vbTextCompare) n = n + 1 Else If InStr(1, hl.Address, "mailto", vbTextCompare) = 0 Then coll.Add hl.Address, UCase(hl.Address) End If Next Next sh For Each Item In coll msg$ = msg$ & Item & vbNewLine Next MsgBox "Заменено гиперссылок: " & n & IIf(Len(msg$), vbNewLine & vbNewLine & _ "Также в файле найдены ссылки на:" & vbNewLine & msg$, ""), vbInformation End Sub