Есть целый ряд подходов можно использовать для записи данных в таблицу в 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
код структура соображение: Это может иметь смысл поставить шаги Поиска/Collapse/Текста в отдельной процедуре (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. Использование закладок
Вместо использования Find
на строковых тегах в документе Word, замените тег с Bookmarks и нацеливайте закладки непосредственно в коде. Это должно быть быстрее. Вы можете вставить дополнительные закладки для второго столбца или использовать описанную выше методику для перехода к следующей ячейке.
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 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. –