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
.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
End Sub
Казалось бы — очень простая задача, но почему-то Word не позволяет решить её стандартными средствами…
Дополнительные проверки на вид и содержание кода перекрёстных ссылок необходимы, т.к. часто бывает, что документ составлен из кусков других документов, в которых эти ссылки могут быть в разных состояниях.
Пользуйтесь))) Удачи!