Поиск и замена в верхнем и нижнем колонтитулах MSWord с использованием delphi xe3

Я хотел бы найти в верхнем и нижнем колонтитулах слова определенные слова, а затем заменить их словами из моей базы данных.

В настоящее время я могу искать и заменять слова в любом месте слова документа, за исключением верхнего и нижнего колонтитула.

Кто-нибудь может мне помочь с этим?

Код для обычного поиска (который работает):

Procedure FindAndReplace(Find,Replace:String);
Begin
      //Initialize parameters
  WrdApp.Selection.Find.ClearFormatting;
  WrdApp.Selection.Find.Text := Find;
  WrdApp.Selection.Find.Replacement.Text := Replace;
  WrdApp.Selection.Find.Forward := True;
  WrdApp.Selection.Find.Wrap := wdFindContinue;
  WrdApp.Selection.Find.Format := False;
  WrdApp.Selection.Find.MatchCase :=  False;
  WrdApp.Selection.Find.MatchWholeWord := wrfMatchCase in Flags;
  WrdApp.Selection.Find.MatchWildcards :=wrfMatchWildcards in Flags;
  WrdApp.Selection.Find.MatchSoundsLike := False;
  WrdApp.Selection.Find.MatchAllWordForms := False;
     { Perform the search}
  if wrfReplaceAll in Flags then
   WrdApp.Selection.Find.Execute(Replace := wdReplaceAll)
  else
   WrdApp.Selection.Find.Execute(Replace := wdReplaceOne);
End;

Код для поиска верхнего и нижнего колонтитула (не работает):

WrdApp.Selection.Find.ClearFormatting;
      WrdApp.Selection.Find.Text := 'Class';
      WrdApp.Selection.Find.Replacement.Text := grade;
      WrdApp.Selection.Find.Forward := True;
      WrdApp.Selection.Find.Wrap := wdFindContinue;
      WrdApp.Selection.Find.Format := False;
      WrdApp.Selection.Find.MatchCase :=  False;
      WrdApp.Selection.Find.MatchWholeWord := wrfMatchCase in Flags;
      WrdApp.Selection.Find.MatchWildcards :=wrfMatchWildcards in Flags;
      WrdApp.Selection.Find.MatchSoundsLike := False;
      WrdApp.Selection.Find.MatchAllWordForms := False;
     { Perform the search}
  if wrfReplaceAll in Flags then
    WrdApp.ActiveDocument.Sections.Item(1).Headers.Item(wdHeaderFooterPrimary).Range.Find.Execute(Replace := wdReplaceAll)
  else
    WrdApp.ActiveDocument.Sections.Item(1).Headers.Item(wdHeaderFooterPrimary).Range.Find.Execute(Replace := wdReplaceOne);

2 ответа

Я нашел ответ, мне просто нужно было добавить эту строку, чтобы установить фокус на заголовок:

WrdApp.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;

и затем снова запустите команду поиска.

Спасибо вам, ребята.

Это не сработает, потому что вы настраиваете объект "Найти" в выделении, а затем используете объект "Найти" в диапазоне заголовка. Это разные вещи.

Если вы измените эти строки

WrdApp.ActiveDocument.Sections.Item(1).Headers.Item(wdHeaderFooterPrimary).Range.Find.Execute(Replace := wdReplaceAll);

что-то вроде следующего (вам нужно получить правильный синтаксис Delphi)

WrdApp.ActiveDocument.Sections.Item(1).Headers.Item(wdHeaderFooterPrimary).Range.Select;
WrdApp.Selection.Find.Execute(Replace := wdReplaceAll);

Вы должны увидеть улучшение, но я думаю, (а) это предпочтительнее, если вы можете избежать использования объекта Selection, и (б) если вам нужно иметь дело с более общей ситуацией с различными верхними и нижними колонтитулами, все может стать немного сложнее, Поэтому я хотел бы предложить вам перейти к

"Использование макроса для замены текста там, где он появляется в документе" на веб-сайте Word MVP и изучения кода, который у них есть. Перевод с VBA->Delphi должен быть довольно простым.

Другие вопросы по тегам