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

0445483fb884a8f3c40da4dc8045c6a4

Меня попросили написать статью по поводу известной проблемы с паразитными названиями перекрёстных ссылок в тексте документа 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 не позволяет решить её стандартными средствами…

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

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

© Habrahabr.ru