我正在尝试使用VBA从Excel中打开Word文档,并将一些表插入到文档中。表中填充了Excel中的信息。
每个表似乎都覆盖了前一个表。
这是一个更新,我需要确保表格不会在表格中形成。THis is an example of what Is going on
我该如何避免这种情况?
Dim intNoOfRows
Dim intNoOfColumns
Dim objWord
Dim objDoc
Dim objRange
Dim objTable
intNoOfRows = 5
intNoOfColumns = 3
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Add
Set objRange = objDoc.Range
objDoc.Tables.Add objRange, intNoOfRows, intNoOfColumns
Set objTable = objDoc.Tables(1)
objTable.Borders.Enable = True
For i = 1 To intNoOfRows
For j = 1 To intNoOfColumns
Next
Next
End Function
答案 0 :(得分:0)
Word对象模型具有Range的概念;您可以将其视为您希望在程序中使用的当前文本块。
这一行:
objDoc.Tables.Add objRange, intNoOfRows, intNoOfColumns
在给定范围(objRange
)中添加一个新表。
查看documentation for the Add
method中的参数列表,我们看到以下内容(重点已添加):
名称:范围
说明:您希望表格显示的范围。 如果范围未折叠,则表格会替换范围。
查看代码的上一行:
Set objRange = objDoc.Range
范围扩展到整个文档。这可能不是你想要的,因为它不仅会替换任何其他表,还会替换文档中的任何其他文本。
要折叠范围,请拨打Collapse
method。范围可以通过两种方式折叠:范围的结尾应该移动到范围的开头,或者范围开始应该移动到范围的结尾。通过将wdCollapseStart
或wdCollapseEnd
传递给Collapse
方法或其等效值来控制此行为:
'objRange.Collapse wdCollapseEnd
objRange.Collapse 1
一旦您折叠了该范围,您就可以添加新表格。
objDoc.Tables.Add objRange, intNoOfRows, intNoOfColumns
N.B。您的代码使用后期绑定,这意味着(除其他外)编辑器不知道您正在使用的各种对象的形状。
要向编辑提供此信息,请在 Microsoft Word对象模型工具 - > 引用... ) >(或类似的东西)。
然后,当您声明变量时,您可以指定其类型:
Dim objDoc As Word.Document
现在,当您编写oDoc.
时,编辑器可以告诉您哪些方法和属性可用于Word文档。
此代码存在另一个问题。插入表格后,表格上会进行几行处理。但是处理永远不会在文档中最近添加的表上完成,而是始终在文档的第一个表中完成:
objDoc.Tables.Add objRange, intNoOfRows, intNoOfColumns
Set objTable = objDoc.Tables(1) 'reference to the first table in the document
解决此问题的最简单方法是使用添加表格返回的引用:
'we need the parentheses now because we're using the returned value
Set objTable = objDoc.Tables.Add(objRange, intNoOfRows, intNoOfColumns)
最终代码可能如下所示:
Dim objWord As New Word.Application
'in production, keeping the application invisible is often more performant
'but while debugging, it's useful to see what's going on in the application
objWord.Visible = True
Dim objDoc As Word.Document
Set objDoc = wdApp.Documents.Add
Dim objRange As Word.Range
Set objRange = objDoc.Range
objRange.Collapse wdCollapseEnd
Dim intNoOfRows As Integer
intNoOfRows = 5
Dim intNoOfColumns As Integer
intNoOfColumns = 3
Dim objTable As Word.Table
Set objTable = objDoc.Tables.Add(objRange, intNoOfRows, intNoOfColumns)
'Fill the table here
'Collapse the range again (not sure this is needed)
objRange.Collapse wdCollapseEnd
'Now you can add a new table:
Set objTable = objDoc.Tables.Add(objRange, intNoOfRows, intNoOfColumns)