Я позволил себе немного «сжать» ваш код, чтобы сделать его более эффективным и легким для чтения, объявив объекты для ActiveDocument
и Tables(1)
.
Так как также кажется, что вы хотите сделать простой поиск / замену, я изменил .Execute
, чтобы сделать замену. Но если ваш код на самом деле более сложный, то вы, конечно, должны сохранить If
, который есть у вас в исходном коде.
Я также добавил функцию, которую я использую, которая отсекает символы ANSI 13 и ANSI 7 от конца текста, возвращаемого ячейкой Range. Когда вы запустили свой код, вы могли заметить черную точку под надписью «Тест 1» или «Тест 2» в MsgBox
? Это ANSI 7, а вертикальный интервал между текстом и точкой является меткой абзаца (ANSI 13). Они исчезают при использовании функции, и в моем тесте замена прошла успешно.
Sub FindReplaceInTable()
Dim x As String
Dim y As String
Dim doc As word.Document
Dim tbl As word.Table
Set doc = ActiveDocument
Set tbl = doc.Tables(1)
x = TrimCellText(tbl.Rows(2).Cells(2).Range)
y = TrimCellText(tbl.Rows(2).Cells(3).Range)
'MsgBox x
'MsgBox y
With doc.content.Find
.Text = x
.ClearFormatting
.Forward = True
.Replacement.Text = y
.Execute Replace:=wdReplaceAll
End With
End Sub
Function TrimCellText(r As word.Range) As String
Dim sLastChar As String
Dim sCellText As String
sCellText = r.Text
sLastChar = Right(sCellText, 1)
Do While sLastChar = Chr(7) Or sLastChar = Chr(13)
sCellText = Left(sCellText, Len(sCellText) - 1)
sLastChar = Right(sCellText, 1)
Loop
TrimCellText = sCellText
End Function