Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как сделать поиск/замену в документе?

01.01.2007

You should use a variant because the Find.Execute method is a bit buggy. Something like this, for example:

{ ... }
var
 
Rnge: OleVariant;
{ ... }
 
Rnge := Doc.Content;
Rnge.Find.Execute('old', Wrap := wdFindContinue, ReplaceWith := 'new', Replace :=
  wdReplaceAll
);
{ ... }

{ ... }
 
{ Create the OLE Object }
WordApp := CreateOLEObject('Word.Application');
WordApp.Documents.Open(yourDocFile);
WordApp.Selection.Find.ClearFormatting;
WordApp.Selection.Find.Text := yourOldStr;
WordApp.Selection.Find.Replacement.Text := yourNewStr;
WordApp.Selection.Find.Forward := True;
WordApp.Selection.Find.Wrap := 1; {wdFindContinue}
WordApp.Selection.Find.Format := False;
WordApp.Selection.Find.MatchCase := False;
WordApp.Selection.Find.MatchWholeWord := False;
WordApp.Selection.Find.MatchWildcards := True;
WordApp.Selection.Find.MatchSoundsLike := False;
WordApp.Selection.Find.MatchAllWordForms := False;
WordApp.Selection.Find.Execute(Replace := 2); {wdReplaceAll}
{Or as alternative:  WordApp.Selection.Find.Execute(Replace := 1); for one replace}
WordApp.ActiveDocument.SaveAs(yourNewDocFile);
WordApp.Quit;
WordApp := Unassigned;
{ ... }

Взято с Delphi Knowledge Base: https://www.baltsoft.com/


{ **** UBPFD *********** by kladovka.net.ru ****
>> Заменить строки в файле Word
 
Функция заменяет файлы в документе word с опциями поиска и замены
 
Зависимости: ComObj
Автор:       [NIKEL], nikel@pisem.net, Norilsk
Copyright:   Some help
Дата:        15 сентября 2002 г.
********************************************** }
 
uses
ComObj;
 
// Флаги замены
type
 
TWordReplaceFlags = set of (wrfReplaceAll, wrfMatchCase, wrfMatchWildcards);
 
function WordStringReplace(ADocument: TFileName; SearchString,
         
ReplaceString: string; Flags: TWordReplaceFlags): Boolean;
const
  wdFindContinue
= 1;
  wdReplaceOne
= 1;
  wdReplaceAll
= 2;
  wdDoNotSaveChanges
= 0;
var
 
WordApp: OLEVariant;
begin
 
Result := False;
 
 
{ Существует ли файл }
 
if not FileExists(ADocument) then
 
begin
   
ShowMessage('Файл не найден!');
   
Exit;
 
end;
 
 
{ Создаем OLE объект }
 
try
   
WordApp := CreateOLEObject('Word.Application');
 
except
    on E
: Exception do
   
begin
      E
.Message := 'Word недоступен';
     
raise;
   
end;
 
end;
 
 
try
   
{ Прячем Word }
   
WordApp.Visible := False;
   
{ Открываем документ }
   
WordApp.Documents.Open(ADocument);
   
{ Инициализируем параметры}
   
WordApp.Selection.Find.ClearFormatting;
   
WordApp.Selection.Find.Text := SearchString;
   
WordApp.Selection.Find.Replacement.Text := ReplaceString;
   
WordApp.Selection.Find.Forward := True;
   
WordApp.Selection.Find.Wrap := wdFindContinue;
   
WordApp.Selection.Find.Format := False;
   
WordApp.Selection.Find.MatchCase := wrfMatchCase in Flags;
   
WordApp.Selection.Find.MatchWholeWord := False;
   
WordApp.Selection.Find.MatchWildcards := wrfMatchWildcards in Flags;
   
WordApp.Selection.Find.MatchSoundsLike := False;
   
WordApp.Selection.Find.MatchAllWordForms := False;
   
{ Ищем}
   
if wrfReplaceAll in Flags then
     
WordApp.Selection.Find.Execute(Replace := wdReplaceAll)
   
else
     
WordApp.Selection.Find.Execute(Replace := wdReplaceOne);
   
{ Сохраняем word }
   
WordApp.ActiveDocument.SaveAs(ADocument);
   
{ Всё нормально }
   
Result := True;
   
{ Закрываем document }
   
WordApp.ActiveDocument.Close(wdDoNotSaveChanges);
 
finally
   
{ Закрываем Word }
   
WordApp.Quit;
   
WordApp := Unassigned;
 
end;
end;

Пример использования:

procedure TForm1.Button1Click(Sender: TObject); 
begin
 
WordStringReplace('C:\SomeStrangeDoc.doc','Маша ела кашу','Маша съела кашу :)',
                     
[wrfReplaceAll]);
end;