有许多的方法可以使用将数据写入到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
插入点是未知的,请参阅原始代码,使用查找/替换 – andrewb
我不认为你可以使用查找/替换选项卡切换到下一个单元格。 – gtwebb
使用.Find.Execute依次查找(而不是替换)每个模板标签应该是相当简单的,用适当的替换它,然后将选择移动到下一列并在该列中插入更多的文本(假设这是OP想要的,因为它不完全清楚)。你不能做的就是一次性调用.Find.Execute。 –