我正在尝试从 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 对象库。
注意: 由于 VBE 的 IntelliSense 自动完成功能,使用早期绑定时,使用可互操作的 Office 应用程序进行编程变得更加容易。
微软文档:
您的第一个片段中使用了后期绑定。
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