Как стать автором
Обновить

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

Уровень сложностиПростой
Время на прочтение2 мин
Количество просмотров8.4K

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

Теги:
Хабы:
Всего голосов 8: ↑7 и ↓1+9
Комментарии35

Публикации

Истории

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
11 сентября
Митап по BigData от Честного ЗНАКа
Санкт-ПетербургОнлайн
14 сентября
Конференция Practical ML Conf
МоскваОнлайн
19 сентября
CDI Conf 2024
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн