在使用 Excel 宏生成的 Word 文档中插入目录

问题描述 投票:0回答:1

我正在尝试从 Excel 工作表中获取数据,并将其放入简单的英语句子中,单击一下即可生成报告,并进行一些具体情况的清理。

我这样做没有任何问题:

Sub formGeneration()
    Dim objWord
    Dim objDoc
    Dim sht1 As Worksheet
    
    Set objWord = CreateObject("Word.Application")
    Set objDoc = objWord.Documents.Add
    Set sht1 = Worksheets("Raw Data Sheet 1")

    With objWord

        .Visible = True
        .Activate

        With .Selection

            'pretend I define all my text and document formatting here
            .typetext("The first value is ")
            .typetext(.sht1.Range("A1").Text)
            .typetext(".")
            .typeparagraph

            'etc etc etc for other values from the sheet
        End With
    End With
End Sub

我尝试使用 microsoft.com 文档中的语法插入目录对象。

他们的示例应该“根据标题 1、标题 2 或标题 3 样式的所有段落构建目录。”。

我在顶部添加了一个范围变量,如示例所示。
我在

Sub
with objWord
with .Selection
块的内部和外部都尝试过。
我尝试在
Dim
语句中分配变量的值,并执行
Dim myRange
,然后执行
Set myRange = ActiveDocument.Range(0, 0)

Dim myRange = Range '(have also tried Word.Range)

Set myRange = ActiveDocument.Range(Start:=0, End:=100000000) '(by the way, how do I set the end of the range to the bottom of the document?)

'this is microsoft's example copied verbatim but it breaks when pasted anywhere in my code 
ActiveDocument.TablesOfContents.Add Range:=myRange, _ 
 UseFields:=False, UseHeadingStyles:=True, _ 
 LowerHeadingLevel:=3, _ 
 UpperHeadingLevel:=1

我的目标是在末尾使用

ActiveDocument.TablesOfContents(1).Update
来获取我放入的所有标题。标题本身的格式和插入都很好。 我收到诸如通用“语法错误”之类的错误(如果我尝试仅在
Range:=(some argument)
旁边使用
TablesOfContents.Add
,或者如果我尝试像 Microsoft 的示例中那样说
Range:=myRange
以及其他示例),则出现“需要对象”我已经有一段时间无法复制了。

我必须在错误的位置定义范围变量,并且 VBA 将其解析为 Excel 范围而不是 Word 范围。我收到“此对象不支持此方法”。

我正在引用 Word 对象库。

excel vba ms-word
1个回答
1
投票

注意: 由于 VBE 的 IntelliSense 自动完成功能,使用早期绑定时,使用可互操作的 Office 应用程序进行编程变得更加容易。

  • 在尝试利用 Excel VBA 代码操作 Word 时,了解后期绑定和早期绑定之间的区别至关重要。

微软文档:

早期和晚期绑定 (Visual Basic)

  • 您的第一个片段中使用了后期绑定。

    Dim myRange As Range
    不起作用。 Excel VBA 将其视为
    Dim myRange As Excel.Range
    。在代码中使用
    Dim myRange As Object

  • Word.Selection
    的父对象是
    Word.Application
    而不是
    Word.Document

  • ActiveDocument
    是Word的对象,Excel VBA不认识它。引用活动文档的正确方法是使用
    objWord.ActiveDocument

Option Explicit

Sub Demo()
    Dim objWord As Object ' Word.Application
    Dim objDoc As Object ' Word.Document
    Dim sht1 As Worksheet
    Dim myRange As Object ' Word.Range
    Set objWord = CreateObject("Word.Application")
    Set objDoc = objWord.Documents.Add
    With objWord
        .Visible = True
        ' your code to add contents with styles
        Call InsertSampleText(objWord)
     End With
     With objDoc
        Set myRange = .Range(Start:=0, End:=0)
        .TablesOfContents.Add Range:=myRange, _
            UseFields:=False, UseHeadingStyles:=True, _
            LowerHeadingLevel:=3, _
            UpperHeadingLevel:=1
    End With
End Sub

Sub InsertSampleText(objWord) ' for testing
    With objWord
        .Selection.TypeText Text:="Heading1"
        .Selection.Style = .ActiveDocument.Styles("Heading 1")
        .Selection.TypeParagraph
        .Selection.TypeText Text:="Heading2"
        .Selection.Style = .ActiveDocument.Styles("Heading 2")
        .Selection.TypeParagraph
        .Selection.TypeText Text:="Heading3"
        .Selection.Style = .ActiveDocument.Styles("Heading 3")
    End With
End Sub

© www.soinside.com 2019 - 2024. All rights reserved.