2016-04-22 2 views
0

У меня есть файл шаблона Word со структурой таблицы, 5 строк, 2 столбца. Первый столбец в каждой строке имеет идентификатор, тег шаблона, такой как <PID>. Каждый тег отличается, поэтому 5 уникальных.Вставка символа табуляции в документ слова из VBA

Я открываю файл шаблона и на основе данных в листе 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 

код структура соображение: Это может иметь смысл поставить шаги Поиска/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