Создание ссылок на места в этом документе работает в vba

#vba #ms-word

#vba #ms-word

Вопрос:

Я пытаюсь создать скрипт VBA, который возьмет все заголовки в документе и создаст из них оглавление с гиперссылками на каждый из заголовков. Все заголовки найдены, проанализированы, и все гиперссылки созданы, однако они неправильно достигают места назначения, которое является местом в документе. Код по умолчанию «создать гиперссылку на место в этом документе» выглядит следующим образом:

 Selection.Range.Hyperlinks(1).Range.Fields(1).Result.Select
Selection.Range.Hyperlinks(1).Delete
ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:="", _
    SubAddress:="_Test_Heading"
Selection.Collapse Direction:=wdCollapseEnd
  

Это код, который вы получили бы, если бы записали макрос при использовании окна «Редактировать гиперссылку».

Окно редактирования гиперссылки

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

Я думаю, проблема в том, что Word по умолчанию использует «Существующий файл или веб-страницу», а не «Разместить в этом документе», даже если «Место в этом документе» было указано ранее. Если я переключу режим ссылки на «Разместить в этом документе» без изменения подадреса или чего-либо еще, это сработает, но необходимость идти и делать это для каждой ссылки сводит на нет цель скрипта. Я искал способ выразить «Место в этом документе» в VBA, но ничего не нашел. Попробовал закладки в качестве альтернативы, и это тоже не сработало. Любая помощь будет оценена.

Комментарии:

1. Вы используете Word? Он делает это за вас: support.microsoft.com/en-us/office /…

2. Word имеет очень надежную функцию оглавления, которая делает именно это. Почему вы это не используете? Вы изобретаете велосипед заново. В Word это поле TOC.

3. @Charles Kenyon Как указано в исходном сообщении, целью было использование VBA. Встроенная функциональность Word вставляет отдельный объект и неправильно связывает его с целевыми объектами. Но спасибо за ваш вклад после игнорирования моего вопроса и решения, которое я предоставил.

4. Вы также можете вставить TOC с помощью vba. Опять же, вы изобретаете велосипед. Вы, конечно, можете это сделать. Спасибо, что поделились своей изобретательностью.

5. Опять же, я уже знаю о функции TOC Word. Он работает не так, как я хочу, и он также не может быть расширен с помощью других макросов VBA, которые я запускаю, поэтому я и хотел его в VBA. Приветствую решение, которое я предоставил.

Ответ №1:

Я нашел обходной путь, используя перекрестные ссылки. На случай, если это кому-нибудь поможет в будущем:

 Private Function GetLevel(strItem As String) As Integer

    Dim strTemp As String
    Dim strOriginal As String
    Dim longDiff As Integer

    strOriginal = RTrim$(strItem)
    strTemp = LTrim$(strOriginal)
    longDiff = Len(strOriginal) - Len(strTemp)
    GetLevel = (longDiff / 2)   1
    
End Function

Sub TableofContents()

Dim i As Integer
Dim AllHeadings As Variant

AllHeadings = ActiveDocument.GetCrossReferenceItems(wdRefTypeHeading)

Selection.HomeKey Unit:=wdStory
Selection.HomeKey Unit:=wdLine

For i = LBound(AllHeadings) To UBound(AllHeadings)
    strtext = Trim$(AllHeadings(i))
    Level = GetLevel(CStr(AllHeadings(i)))

    If Level = 2 Then            
        Selection.InsertCrossReference ReferenceType:="Heading", ReferenceKind:= _
        wdContentText, ReferenceItem:=i, InsertAsHyperlink:=True, _
        IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "
        Selection.TypeParagraph
    End If

Next

End sub
  

Первая функция получает уровень заголовка.

Вторая часть перемещается в начало документа и начинает вставлять перекрестные ссылки на нужные мне заголовки (в данном случае я хочу, чтобы это было = 2).

Комментарии:

1. @Timothy Как указано в исходном сообщении, целью было использование VBA. Встроенная функциональность Word вставляет отдельный объект и неправильно связывает его с целевыми объектами. Но спасибо за ваш вклад после игнорирования моего вопроса и решения, которое я предоставил.

2. Я предлагаю вам потратить некоторое время на то, чтобы лучше понять встроенную функциональность. Вы обнаружите, что приложения намного проще автоматизировать, когда у вас есть полное представление о том, как их использовать, и вы будете тратить меньше времени на создание творческих исправлений для вещей, которые не сломаны.

3. Опять же, я уже знаю о функции TOC Word. Он работает не так, как я хочу, и он также не может быть расширен с помощью других макросов VBA, которые я запускаю, поэтому я и хотел его в VBA. Приветствую решение, которое я предоставил.

4. Опять же, ваш комментарий показывает, что вы не понимаете функцию TOC так хорошо, как думаете. Поле TOC { TOC o «2-2» h n } делает именно то, что вы хотите. Вы можете узнать о различных переключателях TOC здесь