Документ Word - замена текста в таблице заголовков на поля слияния - PullRequest
0 голосов
/ 12 мая 2019

У меня есть набор документов (лотов), где в заголовке каждого есть таблица в заголовке с жестко закодированными адресными записями. Мне нужно обновить все эти документы, чтобы заменить эти жестко запрограммированные адреса на поля слияния. Код находится в электронной таблице Excel, где пользователь выбирает папку, содержащую документы для обновления. Ниже приведен фрагмент того, где выполняется обновление, например, пытается заменить жестко закодированное значение 1 Maple Road на {MERGEFIELD Address_Line1}. Не уверен, где я иду не так, но сообщение, как правило, неверное количество аргументов или не работает вообще Спасибо

    Dim doc As Word.Document
Dim hf As Word.HeaderFooter
Dim lr As ListRow
Dim updated As Boolean
Dim tableCount As Integer
Dim t As Integer
Dim c As Cell

Set wd = New Word.Application
Set doc = wd.Documents.Open(Filename:="c:/......./example.docx", ReadOnly:=False)


For Each hf In doc.Sections(1).Headers()

    tableCount = hf.Range.Tables.Count
    For t = 1 To tableCount
        For Each c In hf.Range.Tables(t).Range.Cells
            If InStr(1, c.Range.Text, "1 Maple Road") > 0 Then
                c.Range.Text = ""
                c.Range.Select
                doc.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, PreserveFormatting:=True, Text:="MERGEFIELD Address_line1"
            End If
        Next c
    Next t
Next hf


doc.Close False
wd.Quit False

Или попробовал

Dim doc As Word.Document
Dim hf As Word.HeaderFooter
Dim lr As ListRow
Dim updated As Boolean
Dim tableCount As Integer
Dim t As Integer
Dim c As Cell

Set wd = New Word.Application
Set doc = wd.Documents.Open(Filename:="c:/......./example.docx", ReadOnly:=False)


For Each hf In doc.Sections(1).Headers()

    tableCount = hf.Range.Tables.Count
    For t = 1 To tableCount
        For Each c In hf.Range.Tables(t).Range.Cells
            If InStr(1, c.Range.Text, "1 Maple Road") > 0 Then
                c.Range.Text = ""
                c.Range.Select
                Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, PreserveFormatting:=True
                Selection.TypeText Text:="MERGEFIELD Address_Line1"
            End If
        Next c
    Next t
Next hf


doc.Close False
wd.Quit False

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Извинения проясняют ситуацию. В заголовке документа есть таблица (справа) с 3 ячейками. Второй адрес имеет жестко закодированные адреса, например 1 Maple Road SomeTown SomeCity SomePostCode Мне нужно заменить содержимое этой ячейки полями слияния, например,
MERGEFIELD Address_Line1
MERGEFIELD Address_Line2
MERGEFIELD Address_City MERGEFIELD Address_PostCode
(при условии, что жестко закодированные записи соответствуют указанным Road, Town, City и PostCode) Это пакетное задание, выполненное в Excel VBA, которое предназначено для одной папки за раз, содержащей несколько документов для обновления. Форматирование также необходимо сохранить Спасибо

0 голосов
/ 13 мая 2019

Instr ненадежен, когда задействованы таблицы, поля и т. Д. Кроме того, в вашем коде Selection.Range ссылается на Excel выделение! Для ссылки на выбор Word вам понадобится wd.Selection.Range. В любом случае нет необходимости выбирать что-либо. Попробуйте:

For Each hf In doc.Sections(1).Headers
  With hf.Range
    With .Find
      .ClearFormatting
      .Replacement.ClearFormatting
      .Text = "1 Maple Road"
      .Replacement.Text = ""
      .Forward = True
      .Wrap = wdFindStop
      .Format = False
      .MatchWildcards = True
      .Execute
    End With
    If .Find.Found = True Then
      .Fields.Add .Range, wdFieldEmpty, "MERGEFIELD Address_line1", False
    End If
  End With
Next
...