VBA, Word: перекрёстные ссылки согласно ГОСТ (убираем из текста паразитные названия «Рисунок..», «Таблица..» и тп)

от автора

Меня попросили написать статью по поводу известной проблемы с паразитными названиями перекрёстных ссылок в тексте документа MS Word, а именно, когда вы вставляете в текст документа перекрёстную ссылку (меню ссылки/перекрёстная ссылка) Word позволяет вставить либо название типа «Рисунок …» либо название полностью, что приводит к текстам типа «…на рисунке (Рисунок 10) мы видим…» или ещё более нелепым конструкциям, тогда как согласно ГОСТ, необходимо оставлять только номер «…на рисунке 10 мы видим…».

Эту проблему просто решить с помощью небольшого скрипта VBA.

Код перекрёстной ссылки (его можно посмотреть, переключая режимы просмотра «shift + f9») выглядит примерно так { REF _Ref127884797 \h } Для того, чтобы убрать паразитные названия и оставить только номер необходимо добавить в код ключ «\#0«. При этом надо следить чтобы случайно не вставлялись лишние ключи (это приведёт к ошибкам) и корректно переключать отображение перекрёстной ссылки из вида «текст» в «код» и обратно.

Ниже приведён код, который это делает.

Sub PerSsylkiGost()  Dim I As Long, DlStroki As Long, LinkText$     'Перебираем все поля типа ссылки     For I = 1 To ActiveDocument.Fields.Count            'Выбираем из них перекрёстные ссылки и выделяем их         If ActiveDocument.Fields.Item(I).Type = wdFieldRef Then             ActiveDocument.Fields.Item(I).Select                          With Selection                                  LinkText = .Text '   MsgBox Mid(LinkText, 2, 4)                  'Проверка на корректность открытия кода ссылки, т.к. в тексте могут            'присутствовать п.ссылки в виде кода и текста            'приводим п.ссылку к виду "код"                 If Len(LinkText) < 4 Then                     .Fields.ToggleShowCodes                 Else                     If Mid(LinkText, 2, 4) = "Ref " Or Mid(LinkText, 2, 4) = " Ref" _                     Or Mid(LinkText, 2, 4) = "REF " Or Mid(LinkText, 2, 4) = " REF" Then                     Else                         .Fields.ToggleShowCodes                     End If                 End If                                  .Find.ClearFormatting                 .Find.Replacement.ClearFormatting                   'содержаение кода п.ссылки передаём переменной и обрезаем её с краёв                    LinkText = .Text                  DlStroki = Len(LinkText)                  LinkText = Mid(LinkText, 2, DlStroki - 2)                  'Проверяем, не содержит ли уже п.ссылка нужный нам код - во избежание ошибок                  If InStr(LinkText, "# 0") <> 0 Or InStr(LinkText, "#0") <> 0 Then                 Else                     With .Find                   'Если кода в п.ссылке нет, вставляем его                                .Text = LinkText                                                         DlStroki = InStr(LinkText, "\h")                             .Replacement.Text = Left(LinkText, DlStroki - 1) & "\#0 " & _               Mid(LinkText, DlStroki, Len(LinkText) - DlStroki + 1) 'LinkText & "\#0 " ' Теперь скрипт вставляет ключ "\#0 " перед ключом "\h" а не в конце строки               '              .Replacement.Text = LinkText & "\#0 "                              .Forward = True                             .Wrap = wdFindStop                             .Format = False                             .MatchCase = False                             .MatchWholeWord = False                             .MatchWildcards = False                             .MatchSoundsLike = False                             .MatchAllWordForms = False                             .Execute Replace:=wdReplaceAll                          End With                  'Обновляем п.ссылки - приводим их к нормальному виду         '                .Fields.Update                 End If               '           .Fields.Update             End With          End If          Next I                  'Обновляем п.ссылки - приводим их к нормальному виду      ActiveDocument.Fields.Update     msgbox "Готово" End Sub

Казалось бы — очень простая задача, но почему-то Word не позволяет решить её стандартными средствами…

Дополнительные проверки на вид и содержание кода перекрёстных ссылок необходимы, т.к. часто бывает, что документ составлен из кусков других документов, в которых эти ссылки могут быть в разных состояниях.

Пользуйтесь 🙂 Удачи!

P.S. Обнаружилось, что в некоторых случаях вставка кода «/# 0» в конец п.ссылки приводит к ошибкам. Поправил скрипт, чтобы он вставлял нужный код перед ключом «/h». Так вроде лучше.


ссылка на оригинал статьи https://habr.com/ru/articles/774752/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *