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

Используйте OleVariant потому что Find.Execute немного глючит. Например:
var
 Rnge: OleVariant;
begin
 Rnge := Doc.Content;
 Rnge.Find.Execute('old', Wrap := wdFindContinue, ReplaceWith := 'new', Replace := wdReplaceAll);
end;
ID: 04429
----
{ 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 }
{ Как вариант: WordApp.Selection.Find.Execute(Replace := 1); для однократной замены }
WordApp.ActiveDocument.SaveAs(yourNewDocFile);
WordApp.Quit;
WordApp := Unassigned;
Source: Взято с Delphi Knowledge Base: http://www.baltsoft.com/
ID: 04430
----
{ **** 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;
Author: [NIKEL]
ID: 04431
Category:COM
Category:MS Office