VBA - 宏msword - 在csv转换后插入表头

时间:2016-04-26 16:17:01

标签: vba ms-word row word-vba

我正在使用MSword 2007中的现有脚本宏(我自己没有制作它,不要因为一个不太好的代码设计而责备我!)。

此脚本从ADODB连接获取SQL结果,并使用CSV转换在给定书签处填充(准确删除和替换)一系列表格。

任务是保留现有标头并将所有结果动态地放入下一行。 Catch是......标题可以由合并的单元格组成

我不会改变很多代码,而且我不是VBA的专家,但我认为这应该是工作流程:

  • 保存标题(这是基表的“第一”行)
  • 删除整个表格
  • 从结果中插入CSV转换后的表格
  • 将标头插入新生成的表格

当存在一些合并的单元格时,复制行抛出错误。而且似乎VBA只能添加空行......所以我可能无法“插入”标题。我怎么能把这个标题放在桌子的顶部?

帮助!

Private Sub setRangeTable(bookmark As String, sqlCmd As String)
    Dim rs As ADODB.Recordset
    Dim r As Range
    Dim t As table
    Dim c As Column
    Dim row As row
    Dim i As Integer
    'this variable should copy header
    Dim oldHeader As Range
    Set r = ActiveDocument.Bookmarks(bookmark).Range
    With r.Tables(1)
        ' try to memorize the header (?)
        oldHeader = .Range(Start:=.Rows(1).Range.Start, _
            End:=.Rows(1).Range.End)
    End With
    r.Tables(1).Delete
    r.InsertAfter (getTableData(sqlCmd))
    r.Select
        r.ConvertToTable Separator:=wdSeparateByTabs, AutoFitBehavior:=wdAutoFitContent
        r.Tables(1).Rows(1).Select
        Selection.InsertRowsAbove
End Sub

现有表格的示例

----------------------
|      |      |     ....    | << cell of real row 1 \
| .... | .... |-------------|                       | << header
|      |      | .... | .... | << cell of real row 2 /
-----------------------------
|      |      |      |      | << all results...
-----------------------------
|      |      |      |      | << all results...
-----------------------------
|      |      |      |      | << all results...
-----------------------------

1 个答案:

答案 0 :(得分:1)

是的,这是一个棘手的情况。您提供的代码的一个问题是您要删除包含带标题的范围的表格;将表头分配给变量并不能保护它不被删除...另一个因素是你实际上需要第1行和第2行,而不仅仅是1.最后,Word不会让你解决行(索引) )合并细胞。

以下内容适合我,快速测试。关键是可以使用键盘拾取合并单元格的行,类似于用户的操作方式。

不是删除原始表(对应于我的示例中的tblOriginal),首先,代码使用第二个表,并且仅在复制标题后删除原始表。从理论上讲,您可以使用Range.CutRange.Copy以及之后的Range.Paste,这样可以让您先删除原始表格,但通常最好不要使用剪贴板方法是可能的。

这意味着您应该在第一个表之后插入一个或两个空段落,在那里插入csv并将其转换为表格,然后将其分配给变量(在我的代码中对应tblTarget样品)。

Dim tblOriginal As word.Table
Dim tblTarget As word.Table
Dim rngTblHeader As word.Range
Dim rngTarget As word.Range

Set tblOriginal = ActiveDocument.Tables(1)
Set rngTblHeader = tblOriginal.Range
'Range at the beginning of first cell, then extend
rngTblHeader.Collapse wdCollapseStart
rngTblHeader.MoveEnd wdRow, 2
'rngTblHeader.Select 'debug/testing

Set tblTarget = ActiveDocument.Tables(2) 'You use r.ConvertToTable
Set rngTarget = tblTarget.Range
rngTarget.Collapse wdCollapseStart
rngTarget.FormattedText = rngTblHeader.FormattedText

tblOriginal.Delete