Добавление оглавления в word Doc из Excel VBA

#excel #vba #ms-word

#excel #vba #ms-word

Вопрос:

Я пытаюсь манипулировать word form Excel, мне трудно установить диапазон слов в Excel. Затем, как только я установлю этот диапазон, я хотел бы вставить оглавление в этот диапазон.

Вот фрагмент моего кода:

 Dim wordApp As Object
Set wordApp = CreateObject("word.application")
Set wDoc = wordApp.Documents.Open(fileName:=templateLocation, ReadOnly:=False)

Dim TOCRange As Word.Range                'establishing my word range
Set TOCRange = wDoc.Paragraphs(3).Range
    TOCRange.SetRange Start:=TOCRange.Start, End:=wDoc.Paragraphs(3).Range.End

'inserting the table of contents ERROR

wDoc.tableOfContents.Add Range:=TOCRange, RightAlignPageNumbers:=True, _
 UseHeadingStyles:=True, IncludePageNumbers:=True, UseHyperlinks:=False, _
 HidePageNumbersInWeb:=True, UseOutlineLevels:=False
  

В результате я получаю ошибку времени выполнения ‘438’
-«Объект не поддерживает это свойство или метод.

Я могу нормально использовать этот макрос при вызове макроса word из Excel, но, похоже, в этом случае я не могу идентифицировать объект document. Это должно быть сделано полностью из формы Excel, поскольку в моих документах шаблонов не может быть никакого кода vba.

Мы были бы весьма признательны за любую информацию или ресурсы по этой теме. Пытаюсь становиться лучше с каждым днем!

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

1. TablesOfContents.Add верно? Я думаю, вам не хватает s .

2. вау, большое вам спасибо. Не могу поверить, что все это время я писал это неправильно, хахахахахаха. вы — легенда.

Ответ №1:

Вам нужно различать документ и шаблон в Word. Это жаргон. В Word шаблон — это очень специфический вид файла. Обычно вы не открываете шаблоны, а скорее добавляете документы на основе шаблона, используя документы.Добавить метод. Вот ссылка на этот метод. https://learn.microsoft.com/en-us/office/vba/api/word.documents.add?f1url=https://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=en-US&k=k(vbawd10.chm158072846);k(TargetFrameworkMoniker-Office.Версия=v16)&rd=true&f=255&MSPPError=-2147217396

У меня действительно есть вопрос в связи с этим. Почему бы просто не поместить поле TOC в свой шаблон для начала, а не использовать код для его добавления?

Я немного поиграл с вашим кодом, чтобы просто создать оглавление в новом документе, который затем сохраняю как Deleteme.docx . Я надеюсь, что это поможет. Для этого требуется ссылка на объектную модель Word.

 
    Sub AddTOC()
        Dim wordApp As Word.Application
        Dim TOCRange As Word.Range                'establishing my word range
        Dim wdoc As Word.Document
        '
        Set wordApp = GetObject(Class:="Word.Application")
        'Set wordApp = CreateObject("word.application")
        Set wdoc = wordApp.Documents.Add 'Open(Filename:=templateLocation, ReadOnly:=False)
        Set TOCRange = wdoc.Range
        TOCRange.Paragraphs.Add
        TOCRange.Paragraphs.Add
        TOCRange.Paragraphs.Add
        Set TOCRange = wdoc.Paragraphs(3).Range
        wdoc.TablesOfContents.Add Range:=TOCRange ' This does the same as your code
        wdoc.SaveAs2 Filename:="Deleteme.docx"
        wdoc.Close
        Set TOCRange = nothing
        Set wdoc = nothing
        Set wordApp = nothing
    '    Debug.Print wdoc.Name
    '    Set TOCRange = wdoc.Paragraphs(3).Range
    '        TOCRange.SetRange Start:=TOCRange.Start, End:=wdoc.Paragraphs(3).Range.End
    '
    '    'inserting the table of contents ERROR
    '
    '    wdoc.tableOfContents.Add Range:=TOCRange, RightAlignPageNumbers:=True, _
    '     UseHeadingStyles:=True, IncludePageNumbers:=True, UseHyperlinks:=False, _
    '     HidePageNumbersInWeb:=True, UseOutlineLevels:=False
    End Sub

  

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

1. Спасибо за помощь и пример кода. Чтобы ответить на ваш вопрос, я размещаю оглавление после того, как я сгенерировал форму, потому что у меня есть изображения и информация, размещаемые под определенными именами тегов и тому подобное. При выполнении моего макроса find and replace он захватывает имена тегов, которые есть в оглавлении, и помещает всю связанную информацию в оглавление. Это оставляет предназначенные места для информации пустыми, и впоследствии приходится убирать много беспорядка. текущий подход захватывает диапазон имен тегов и помещает TOC в этот диапазон. пока не знаю, как это сделать, но, надеюсь, скоро! Спасибо

2. Оглавление определяется в зависимости от используемых стилей, уровней структуры или полей TC. Оглавление в вашем исходном коде основано на уровнях заголовков. Это ничего не сделает с тегами. Возможно, вы захотите ознакомиться с объяснением Сюзанны Барнхилл основных принципов построения оглавления в этом поле. — wordfaqs.ssbarnhill.com/TOCTips.htm