将制表符插入VBA中的Word文档

时间:2016-04-22 20:43:04

标签: excel vba excel-vba

我有一个带有表结构,5行,2列的Word模板文件。每行中的第一列具有标识符,模板标签,例如< PID>。每个标签都不同,所以5个唯一。

我打开模板文件,根据Excel工作表中的数据,根据模板创建一个新的word文档,模板标签替换为实际值。

我想" tab"到表中的第二列而不是第一列中的所有文本。

以下是我输出从Excel工作表中提取的值的当前代码。

    With wrdDoc
        .Content.Find.Execute FindText:="<PNAME>", ReplaceWith:="<Project Name> " & strProjectName
        .Content.Find.Execute FindText:="<PID>", ReplaceWith:="<Project ID>=" & strProjectID
        .Content.Find.Execute FindText:="<DNAME>", ReplaceWith:="<Department Name>=" & strDepartmentName
        .Content.Find.Execute FindText:="<A>", ReplaceWith:="<Active>=" & strActive
        .Content.Find.Execute FindText:="<HO>", ReplaceWith:="<Head Office>=" & strHeadoffice
    End With

我尝试过使用chr(9)和vbTab,但他们只是在第一列中创建了一个标签。

2 个答案:

答案 0 :(得分:0)

如果插入点位于表格单元格中,您可以使用以下内容移动到下一个表格单元格:

Selection.MoveRight Unit:=wdCell

这会将光标移动到下一个单元格。

答案 1 :(得分:0)

您可以使用多种方法将数据写入Word中的表格,其中一种方法建立在您已有的基础之上:

<强> 1。使用Find.Execute

如果您必须坚持使用预定义标记的模板中的表格,那么您应该使用Range对象进行查找,而不是使用Document.Content。这使您可以操作文档中的“目标位置”,类似于使用Ranges而不是从工作簿级别定位工作簿中的单元格。

Dim rngSearch as Word.Range
Set rngSearch = wrdDoc.Content
rngSearch.Find.Execute FindText:="<PNAME>", ReplaceWith:="<Project Name> " & strProjectName
'Move to next cell
rngSearch.Collapse wdCollapseEnd
rngSearch.Text = "text for the second column"
rngSearch.Find.Execute FindText:="<PID>", ReplaceWith:="<Project ID>=" & strProjectID
'and repeat collapsing, assign text and Find.Execute

代码结构考虑:将查找/折叠/文本步骤放在单独的过程(Sub)中可能是有意义的。这将为每个“标签”重复三个步骤:

  'code in main procedure
  Dim rngFind as Word.Range
  Set rngFind = wrdDoc.Content
  WriteToTagsInWordTable "<PNAME>", "<Project Name> " & strProjectName, 
                       "text in column two", rngFind
  WriteToTagsInWordTable "<PID>", "<Project Name>=" & strProjectID, 
                       "other text in column two", rngFind
  'and so on...

Sub WriteToTagsInWordTable(sFind as String, sReplace as String, _
                           sColTwo as String, ByRef rngSearch as Word.Range)

  rngSearch.Find.Execute FindText:=sFind, ReplaceWith:=sReplace
  'Move to next cell
  rngSearch.Collapse wdCollapseEnd
  rngSearch.Text = sColTwo
End Sub

<强> 2。使用书签

不要在Word文档中的字符串标记上使用Find,而是使用书签替换标记,并直接在代码中定位书签。这应该更快。您可以为第二列插入其他书签,也可以使用上述技术切换到下一个单元格。

With wrdDoc
  .Bookmarks("PName").Range.Text = "<Project Name> " & strProjectName
  .Bookmarks("PNameInfo").Range.Text = "text for the second column"
End With

第3。在代码中创建表

生成VBA代码通常最有效,因为字符分隔的字符串随后被分配给目标Range(通常用Bookmark表示),并转换为表格。这在我的MSDN文章https://msdn.microsoft.com/en-us/library/aa537149%28v=office.11%29.aspx?f=255&MSPPError=-2147217396,“使用数据填充Word表”一节中有详细描述。

这是该文章的相关代码。它显示了如何从数组为多行,多列表构建字符串,将字符串传递给Word Range并将其转换为表。

Sub CreateTableFromString(ByRef rng As Word.Range, _
    ByRef adata() As Variant)
    Dim tbl As Word.Table

    rng.Text = BuildDataString(adata)
    Set tbl = rng.ConvertToTable(vbTab, _
        AutoFitBehavior:=wdAutoFitFixed, _
            DefaultTableBehavior:=wdWord8TableBehavior)
End Sub

Function BuildDataString(aData() As Variant) As String
    Dim dataString As String
    Dim nrRow As Long, nrCol As Long

    For nrRow = 0 To UBound(aData, 1)
        For nrCol = 0 To UBound(aData, 2)
            dataString = dataString & aData(nrRow, nrCol)
            If nrCol < UBound(aData, 2) _
                Then dataString = dataString & vbTab
        Next nrCol
        If nrRow < UBound(aData, 1) _
            Then dataString = dataString & vbCr
    Next nrRow
    BuildDataString = dataString
End Function