2016-04-22 91 views
0

我有一个带有表格结构的5行2列的Word模板文件。每行的第一列有一个标识符,模板标签,如<PID>。每个标签都是不同的,所以5个独特。将制表符字符插入到VBA的Word文档中

我打开模板文件,并根据Excel表格中的数据创建一个基于模板的新文档文档,模板标签由实际值替换。

我想“选项卡”到表中的第二列,而不是第一列中的所有文本。

这是我当前的代码,用于输出从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,但他们只是在第一列创建一个选项卡。

回答

0

如果插入点在表格单元格,则可以使用这样的移动到下一个表格单元格:

Selection.MoveRight Unit:=wdCell 

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

+0

插入点是未知的,请参阅原始代码,使用查找/替换 – andrewb

+0

我不认为你可以使用查找/替换选项卡切换到下一个单元格。 – gtwebb

+0

使用.Find.Execute依次查找(而不是替换)每个模板标签应该是相当简单的,用适当的替换它,然后将选择移动到下一列并在该列中插入更多的文本(假设这是OP想要的,因为它不完全清楚)。你不能做的就是一次性调用.Find.Execute。 –

0

有许多的方法可以使用将数据写入到Word中的表格,其中一个建立在你已经拥有:

1.使用Find.Execute

如果您必须用模板中的表格粘贴预定义的标签,然后您应该使用Range对象进行查找,而不是使用Document.Content。这可让您操作文档中的“目标位置”,与您使用范围的方式类似,无需从工作簿级别定位工作簿中的单元格。

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 
相关问题