表似乎被覆盖了

时间:2017-08-06 23:35:20

标签: excel-vba word-vba vba excel

我正在尝试使用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

1 个答案:

答案 0 :(得分:0)

Word对象模型具有Range的概念;您可以将其视为您希望在程序中使用的当前文本块。

这一行:

objDoc.Tables.Add objRange, intNoOfRows, intNoOfColumns

在给定范围(objRange)中添加一个新表。

查看documentation for the Add method中的参数列表,我们看到以下内容(重点已添加):

  

名称:范围

     

说明:您希望表格显示的范围。 如果范围未折叠,则表格会替换范围。

查看代码的上一行:

Set objRange = objDoc.Range

范围扩展到整个文档。这可能不是你想要的,因为它不仅会替换任何其他表,还会替换文档中的任何其他文本。

要折叠范围,请拨打Collapse method。范围可以通过两种方式折叠:范围的结尾应该移动到范围的开头,或者范围开始应该移动到范围的结尾。通过将wdCollapseStartwdCollapseEnd传递给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)