Поиск и замена в верхнем и нижнем колонтитулах 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 должен быть довольно простым.