Попросили меня доработать старый модуль, который генерирует клиентам компании письма в формате MS Word. Пользователи создают шаблоны, в которых расставляют названия полей, заключенные в служебные символы (например, #CONTRACT_NUM#, #FIO#, #ADDRESS#…). Программа по заданным критериям выбирает информацию о клиентах из базы и генерирует письма, находя в тексте шаблонов названия полей и заменяя их фактическими значениями.
Если опустить все детали и различную логику, то упрощенно это выглядит так:
Var
MSWord: OleVariant;
i: Integer;
q: TSDQuery;
…
begin
…
MSWord := CreateOleObject(‘Word.Application’);
MSWord.Documents.Add(‘какой то шаблон.dot’);
For i := 0 to q.FieldCount-1 do
MSWord.Selection.Find.Execute(FindText := ‘#’ + q.Fields[i].FieldName + ‘#’, ReplaceWith := q.Fields[i].AsString);
…
MSWord.ActiveDocument.SaveAs(‘письмо любимому клиенту.doc’);
…
Первое, с чем я столкнулся, это то, что длина значения параметра ReplaceWith не должна превышать 255 символов. Но это я обошел легко, заменив «поиск и замену текста» на «поиск и вывод текста»:
If MSWord.Selection.Find.Execute(FindText := ‘#’ + q.Fields[i].FieldName + ‘#’) then
MSWord.Selection.TypeText(q.Fields[i].AsString);
Вторая задачка оказалась сложнее. Внизу листа в фиксированное место необходимо было вывести фамилию и адрес получателя. Сначала я думал поместить его в нижний колонтитул, но оказалось, что письмо может быть на двух листах. Тогда ничего не оставалось, как использовать объект «заметка». Вставил «заметку». Красота! Документ генерируется, текст сдвигается, заметка остается на месте… Но радость была недолгой, т.к. поля #FIO# и #ADDRESS#, помещенные в заметку, так и остались незамененными
Оказалось, что MSWord.Selection.Find.Execute ищет текст только в основной части документа, а в документе, состоящем из разных структурных элементов (заметок, колонтитулов, сносок и т.д.), поиск необходимо производить отдельно в каждом из этих элементов. Все эти структурные элементы документа являются элементами коллекции StoryRanges. Т.к. дело было к ночи, а модуль должен был быть готов к утру, я не стал разбираться, как работать со StoryRanges через OLE из Delphi, и просто добавил в тестовый шаблон письма макрос на VBA, в котором перебираются все структурные элементы активного документа, в которых ведется поиск:
Sub ReplaceText(sFindText As String, sReplaceText As String)
Dim rngStory As Range
For Each rngStory In ActiveDocument.StoryRanges
With rngStory.Find
.Text = sFindText
.Replacement.Text = sReplaceText
.Wrap = wdFindContinue
.Execute Replace:=wdReplaceAll
End With
Next rngStory
End Sub
А в программе я только написал вызов макроса:
MSWord.Application.Run(‘ReplaceText’, ‘#FIO#’, ‘Иванов Иван Иванович’);
Работает как часы
P.S. После окончания генерации документа, если MS Word вам больше не нужен, то не забывайте закрывать его и высвобождать память
MSWord.Quit;
MSWord := UnAssigned;
P.P.S. Для подобной задачи генерации писем в формат MS Word больше подходит не поиск и замена текста, использование полей с переменными (DocVariable) и закладок (Bookmark). А как это сделать, я расскажу в следующий раз.
Slalom 4 / 4 / 0 Регистрация: 28.09.2012 Сообщений: 178 |
||||
1 |
||||
Поиск текста по документу и замена его на свой текст28.09.2012, 09:38. Показов 12457. Ответов 13 Метки нет (Все метки)
Пытаюсь сделать поиск с заменой текста в документе. Все работает но дело в том что он меняет лишь 1ну часть. Делаю след образом ищу текст типа такого $$ и меняю на свой текст. Он производит поиск только одного такого объекта $$ и дальше идти не хочет.. Может тема уже существует но решения тут я не нашел. Кто поможет заранее Благодарю.
1 |
volvo Супер-модератор 32516 / 20997 / 8120 Регистрация: 22.10.2011 Сообщений: 36,264 Записей в блоге: 7 |
||||
28.09.2012, 10:37 |
2 |
|||
2 |
4 / 4 / 0 Регистрация: 28.09.2012 Сообщений: 178 |
|
28.09.2012, 11:21 [ТС] |
3 |
Спасибо. Почти. Но Почему то если объект в шаблоне указан выше первого объекта то его замену он не производит. А если наоборот или допустим один в 2х местах выше первого и ниже первого то 2ой меняется а тот который выше нет. Возможно есть другой метод реализации??? Или что то еще посоветуете?
0 |
Супер-модератор 32516 / 20997 / 8120 Регистрация: 22.10.2011 Сообщений: 36,264 Записей в блоге: 7 |
|
28.09.2012, 11:25 |
4 |
Я же написал, если надо искать с начала текста (а если второй объект находится выше первого — то надо именно с начала, иначе текст не будет найден), то нужно сбросить start/end в нули.
2 |
4 / 4 / 0 Регистрация: 28.09.2012 Сообщений: 178 |
|
28.09.2012, 11:38 [ТС] |
5 |
Оп) Простите! Да поставил нулики. работает, но почему то замена производится только один раз, т. е. первое найденное $$ меняется а второе такое же нет.(( Почему? пжлст) Добавлено через 2 минуты
0 |
volvo Супер-модератор 32516 / 20997 / 8120 Регистрация: 22.10.2011 Сообщений: 36,264 Записей в блоге: 7 |
||||
28.09.2012, 11:41 |
6 |
|||
«Второе такое же» надо заменить на тот же текст? Тогда меняй не с wdReplaceOne, а с wdReplaceAll:
0 |
4 / 4 / 0 Регистрация: 28.09.2012 Сообщений: 178 |
|
28.09.2012, 11:50 [ТС] |
7 |
wdReplaceOne, а wdReplaceAll Где это такое писать? Добавлено через 6 минут
0 |
volvo Супер-модератор 32516 / 20997 / 8120 Регистрация: 22.10.2011 Сообщений: 36,264 Записей в блоге: 7 |
||||
28.09.2012, 11:59 |
8 |
|||
Модуль WordXP (или какой там у тебя Word установлен) подключен в Uses? Можно определить константами, если не хочется подключать:
2 |
4 / 4 / 0 Регистрация: 28.09.2012 Сообщений: 178 |
|
28.09.2012, 12:14 [ТС] |
9 |
Огромное спасибо!!! Работает как надо))) А как же на счет бд ? можно присобачить? Добавлено через 2 минуты
0 |
0 / 0 / 0 Регистрация: 22.05.2013 Сообщений: 5 |
|
22.05.2013, 12:36 |
10 |
Здраствуй. Воспользовался данной темы для написания своей программки, однако не открывает Word-файл с измененными данными.
0 |
Супер-модератор 32516 / 20997 / 8120 Регистрация: 22.10.2011 Сообщений: 36,264 Записей в блоге: 7 |
|
22.05.2013, 12:46 |
11 |
Может, лучше присоединить тестовый проект? «Вот исходный файл, вот программа, жмем кнопку, значения меняются, после этого открываем измененный DOC — не открывается», чтобы можно было откомпилировать, запустить, и увидеть проблему, а не гадать, что же там такое понаделано, что оно не работает?
1 |
0 / 0 / 0 Регистрация: 22.05.2013 Сообщений: 5 |
|
22.05.2013, 12:55 |
12 |
Может, лучше присоединить тестовый проект? «Вот исходный файл, вот программа, жмем кнопку, значения меняются, после этого открываем измененный DOC — не открывается», чтобы можно было откомпилировать, запустить, и увидеть проблему, а не гадать, что же там такое понаделано, что оно не работает? Вот мой тестовый вариант
0 |
volvo Супер-модератор 32516 / 20997 / 8120 Регистрация: 22.10.2011 Сообщений: 36,264 Записей в блоге: 7 |
||||
22.05.2013, 13:12 |
13 |
|||
Я с docx дела не имею, мой Word их не понимает (использую OfficeXP, а не новомодные, обсыпанные мишурой ненужной), с DOC-ом все нормально работает, если сохранить файл и закрыть Word, как положено, а не оставлять его висеть в процессах:
после замены текста.
2 |
0 / 0 / 0 Регистрация: 22.05.2013 Сообщений: 5 |
|
22.05.2013, 14:23 |
14 |
Спасибо за помощь!!!
0 |
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Сегодня, в последний рабочий день недели, практически весь день провозился над передачей данных из Delphi в Word. Так как подозрение есть, что работа продолжится то решил кое-какие моменты по работе с Microsoft Word в Delphi запечатлеть и у себя в блоге. Написать такую мини-шпаргалку (тем более, что по Excel уже кое что есть).
Для начала, немного общих моментов по работе с MS Office в Delphi. И первое, что мы сделаем — это создадим объект Word.Application. Создается этот объект абсолютно также, как и объект Excel.Application:
uses ComObj; var Word: variant; [...] procedure CreateWord(const Visible: boolean); begin Word:=CreateOleObject('Word.Application'); Word.Visible:=Visible; end;
Всё достаточно просто. Далее мы можем работать с объектом следующим образом:
- Создавать документ Word с нуля
- Открыть уже существующий документ и изменить в нем текст для получения необходимой формы документа.
Рассмотрим оба варианта, т.к. оба они имеют как свои плюсы, так и недостатки.
Чтобы создать новый документ необходимо выполнить метод Add у коллекции Documents, т.е.:
[...] Word.Documents.Add [...]
и после этой операции уже начинать работать с документам обращаясь к нему по индексу или имени в коллекции. Также, можно создать новый документ по шаблону (*.dot). Для этого необходимо выполнить тот же метод Add, но с одним входным параметром — путем к файлу-шаблону:
[...] Word.Documents.Add(TamplatePath:string); [...]
Чтобы получить список всех открытых в данный момент документов Word можно воспользоваться следующим листингом:
[...] var List: TStringList; i: integer; begin List:=TStringList.Create; for i:=1 to Word.Documents.Count do List.Add(Word.Documents.Item(i).Name); end; [...]
Обратите внимание, что нумерация начинается с 1, а не с нуля. Чтобы активировать любой документ из коллекции для работы, необходимо выполнить метод Activate:
Word.Documents.Item(index).Activate
где index — номер документа в коллекции.
Теперь можно приступать к записи и чтению документа. Для работы с текстов в документе Word, как и в Excel для работы с ячейками таблицы, определен объект Range. Именно методы этого объекта и дают нам возможность работы с текстом. Для начала рассмотрим работу двух основных методов: InsertBefore и InsertAfter.
Как следует из название — первый метод вставляет текст в начало содержимого Range, а второй — в конец. При этом сам объект Range может содержать как весть документ (Document) так и какую-либо его часть. Например, в следующем листинге я вставлю строку в начало документа и затем методом InsertAfter буду добавлять несколько строк текста в конец документа:
[...] Word.ActiveDocument.Range.InsertBefore('Hello World'); Word.ActiveDocument.Range.InsertAfter('текст после Hello World'); Word.ActiveDocument.Range.InsertAfter('окончание строки в документа'); [...]
При выполнении этих трех операции Range содержал весь документ.
Если работать со всем документом неудобно, а необходимо, например выделить фрагмент с 50 по 100 символ и работать с ним, то можно воспользоваться функцией Range, которая вернет нам необходимый объект Range:
var MyRange: variant; begin MyRange:=WordActiveDocument.Range(50,100); MyRange.InsertBefore('Привет');//всё, что было после 50-го символа сдвинулось вправо end;
Это что касается записи текста. Решение обратной задачи — чтения текста из документа ещё проще. Достаточно воспользоваться свойством Text у объекта Range:
[...] ShowMessage(Word.ActiveDocument.Range.Text) //весь текст в документе [...]
Также для чтения документа можно воспользоваться коллекцией документа Words (слова). За слово принимается непрерывный набор символов — цифр и букв, который оканчивается пробелом.
Перечисляются слова документа точно также как и при работе с коллекцией документов, т.е. первое слово имеет индекс 1 последнее — Word.Count.
[...] ShowMessage(Word.ActiveDocument.Words.Item(Word.ActiveDocument.Words.Count).Text) [...]
В данном случае я вывел на экран последнее слово в документе.
Очевидно, что приведенный выше способ работы с документам хорош в случае, когда требуется создать относительно простой документ Word и не требуется лишний раз рассчитывать фрагменты текста, правильно вставлять таблицы и т.д. Если же необходимо работать с документами, которые имеют сложное содержание, например текст в перемежку с рисунками, таблицами, а сам текст выводится различными шрифтами, то, на мой взгляд наиболее удобно использовать второй способ работы с Word в Delphi — просто заменить текст в уже заранее заготовленном документа.
2. Работа с документами Word в Delphi. Открытие готового документа и замена текста.
Чтобы открыть заранее заготовленный документ Word в Delphi достаточно воспользоваться методом Open у коллекции Documents, например так:
var FilePath: string; [...] Word.Documents.Open(FilePath) [...]
Метод Open можно вызывать с несколькими аргументами:
- FileName: string — путь и имя файла;
- ConfirmConversions: boolean — False — не открывать диалоговое окно «Преобразование файла» при открытии файла, формат которого не соответствует формату Word (doc или docx)
- ReadOnly:boolean — True — открыть документ в режиме «Только для чтения»
- AddToRecentFiles: boolean — True, чтобы добавить документ в список недавно открытых документов.
- PasswordDocument: string — пароль для открытия документа
- PasswordTemplate: string — пароль для открытия шаблона
- Revert : boolean — True, чтобы вернуться к сохраненному документу, если этот документ открывается повторно.
- WritePasswordDocument: string — пароль для сохранения измененного документа в файле
- WritePasswordTemplate:string — пароль для сохранения изменений в шаблоне
- Format:integer — формат открываемого документа.
Обязательным параметром метода Open является только FileName, остальные — могут отсутствовать. Если же Вам необходимо воспользоваться несколькими параметрами, то их необходимо явно указывать при вызове метода, например:
[...] Word.Documents.Open(FileName:=FilePath, ReadOnly:=true) [...]
В этом случае документ открывается в режиме «Только для чтения». При таком способе вызова (с явным указанием аргументов) положение аргументов может быть произвольным.
Что касается последнего аргумента — Format, то он может принимать целочисленные значения (применительно к версиям Microsoft Word 2007 и выше) от 0 до 13. При этом, для того, чтобы открыть «родные» вордовские документы (doc) достаточно использовать значения 0 или 6.
Теперь, когда документ открыт его необходимо преобразовать. Обычно я делаю следующим образом: в тех местах документа, в которые необходимо вставить текст я расставляю либо закладки, либо простые строки текста, например, обрамленные символом $ или #. И затем просто выполняю поиск и замену подстрок следующим образом:
function FindAndReplace(const FindText,ReplaceText:string):boolean; const wdReplaceAll = 2; begin Word.Selection.Find.MatchSoundsLike := False; Word.Selection.Find.MatchAllWordForms := False; Word.Selection.Find.MatchWholeWord := False; Word.Selection.Find.Format := False; Word.Selection.Find.Forward := True; Word.Selection.Find.ClearFormatting; Word.Selection.Find.Text:=FindText; Word.Selection.Find.Replacement.Text:=ReplaceText; FindAndReplace:=Word.Selection.Find.Execute(Replace:=wdReplaceAll); end;
Приведенная выше функция позволяет провести поиск и замену текстового фрагмента во всём документе. Для того, чтобы ограничить возможности пользователя при работе с шаблоном документа я обычно ставлю на необработанный файл пароль, а после обработки — пароль снимаю и сохраняю документ с другим названием в необходимую директорию.
Вот, наверное, самые-самые простые методы работы с Word в Delphi. Кстати, пишу пост и, думаю, что у кого-то из читателей может возникнуть вопрос: причём тут Delphi в Internet и Word в Delphi? Честно говоря, приведенный выше фрагменты кода можно использовать для нужд в Internet с натяжкой, например, при автосоставлении небольших отчётов по чему-либо. А вообще, в недалеком будущем, есть в планах поразбираться с Тезаурусом Word и попробовать составить небольшой синонимайзер для собственных нужд — он-то и пригодится нам в Internet
3.1
8
голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Доброго времени суток!
Сделал простенький компонент для замены текста в документах Word (docx) и OpenDocument (odt). Особенностью данного компонента является отсутствие необходимости какого-либо дополнительного ПО типа MS Office или OpenOffice и использует только встроенные библиотеки. В связи с чем он может работать на различных платформах (но ещё не проверял ).
DocumentProcessing.zip
Как использовать:
uses
DocumentProcessing;
...
procedure TForm2.Button1Click(Sender: TObject);
var
Document: TDocumentProcessor;
begin
Document:= TDocumentProcessor.Create(Self);
Document.FilePath:= 'D:test.docx';
Document.Open(TDocumentKind.dkDocx);
Document.ReplaceText('Familiya', 'Cat');
Document.Save;
Document.Open('D:test.odt', TDocumentKind.dkOdt);
Document.ReplaceText('Familiya', 'Cat', [rfReplaceAll]);
Document.Save;
end;
Немного о принципе работы:
Спойлер
Думаю стоит немного объяснить принцип работы компонента.
Дело в том, что в документах одно слово может храниться частями. Часто это бывает, если использовать использовать стили на части слова, например:
Firemonkey
В документе данное слово будет разделено на «Fire» и «monkey». Данному компоненту это не помеха, но стоит знать, что при замене вставленное слово будет иметь стиль левой части, т.е. если мы заменим «Firemonkey» на «Delphi», то отображаться он будет следующим образом:
Delphi
Проблемы:
Спойлер
1. Не знаю как реализовать чувствительность к регистру (связано с использованием функции IndexOf)
Изменено 28 августа, 2019 пользователем Шамсуддин
Улучшена производительность
Замена текста в Word!
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Full Member Рейтинг (т): -1 |
У меня есть едит. И ворд. В ворде есть текст: @edit1@. Как мне |
volvo877 |
|
BIG-VL |
|
Full Member Рейтинг (т): -1 |
Читал!!! Не могу понять!!! |
dron-s |
|
BIG-VL
unit MyWord; interface //*******************создаём объект ворд**************************************** function CreateWord:boolean; //*******************делаем видимым********************************************* function VisibleWord(Visible:boolean):boolean; //*******************Поиск и замена********************************************* function FindAndReplace(FindText, ReplacementText:string):boolean; //*******************Проверяем, установлен ли ворд****************************** function IsWordInstalled: Boolean; //*******************Открытие документа***************************************** function OpenDocFile(FileWord, Pass:string):boolean; implementation //*******************необходимые модули***************************************** uses ComObj,Registry,Windows; //*******************переменная для работы с объектом*************************** var Word:variant; //*******************создаём объект ворд**************************************** function CreateWord:boolean; begin CreateWord := true; try Word := CreateOleObject(‘Word.Application’); except CreateWord := False; end; end; //*******************делаем видимым********************************************* function VisibleWord(Visible:boolean):boolean; begin VisibleWord := True; try Word.Visible := Visible; except VisibleWord := False; end; end; //*******************Поиск и замена********************************************* function FindAndReplace(FindText, ReplacementText:string):boolean; const wdReplaceAll=2; begin Word.Selection.Find.Text := FindText; Word.Selection.Find.Replecement.Text := ReplacementText; FindAndInsert := Word.Selection.Find.Execute(Replace := wdReplaceAll); end; //*******************Проверяем, установлен ли ворд****************************** function IsWordInstalled: Boolean; var Reg: TRegistry; s: string; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_CLASSES_ROOT; Result := Reg.KeyExists(‘Word.Application’); finally Reg.Free; end; end; //*******************Открытие документа***************************************** function OpenDocFile(FileWord, Pass:string):boolean; const wdOpenFormatTemplate=2; begin Word.Documents.Open(FileName:=FileWord,Format:=wdOpenFormatTemplate, PasswordDocument:= Pass); end; //*******************Конец модуля*********************************************** end.
полностью рабочий, писал для собственных нужд… |
volvo877 |
|
Цитата BIG-VL @ 05.09.06, 08:10 Не могу понять!!! Что именно не понятно? |
dron-s |
|
хе, так это же мой модуль |
BIG-VL |
|
Full Member Рейтинг (т): -1 |
Блин не могу понять, а что именно не могу сказать потому чо всё! Этот модклю подключаю а дальше? |
dron-s |
|
подключаешь модуль, а дальше используешь его функции
CreateWord; OpenDocFile(‘путь к файлу’,»); FindAndReplace(‘что нужно заменить’,’на что нужно заменить’); VisibleWord; |
volvo877 |
|
Цитата BIG-VL @ 05.09.06, 08:32 что именно не могу сказать потому чо всё!
procedure TForm1.Button1Click(Sender: TObject); begin Word_StringReplace(‘C:Test.doc’,’@edit1@’,Edit1.Text, [wrfReplaceAll]); // Замени test.doc на имя своего файла end; |
BIG-VL |
|
Full Member Рейтинг (т): -1 |
Цитата dron-s @ 05.09.06, 08:42 подключаешь модуль, а дальше используешь его функции
CreateWord; OpenDocFile(‘путь к файлу’,»); FindAndReplace(‘что нужно заменить’,’на что нужно заменить’); VisibleWord; Во это уже лучше!!! Добавлено 05.09.06, 08:47 Цитата volvo877 @ 05.09.06, 08:45 Если пользуешься процедурой tIce — то: Это я не понял!!! |
dron-s |
|
Цитата volvo877 @ 05.09.06, 08:45 что именно не могу сказать потому чо всё! такое чувство, что BIG-VL не имеет не малейшего представления что к чему |
volvo877 |
|
BIG-VL Что, трудно на ник пользователя посмотреть, по той ссылке, которую я тебе дал? Или все время делать тебе Copy+Paste ??? |
dron-s |
|
Цитата BIG-VL @ 05.09.06, 08:47 Во это уже лучше!!! и что, это тоже не работает? |
BIG-VL |
|
Full Member Рейтинг (т): -1 |
Цитата volvo877 @ 05.09.06, 08:49 BIG-VL Что, трудно на ник пользователя посмотреть, по той ссылке, которую я тебе дал? Или все время делать тебе Copy+Paste ??? Я смотрел… Цитата dron-s @ 05.09.06, 08:48 такое чувство, что BIG-VL не имеет не малейшего представления что к чему Если честно то да не пойму что к чему!!! Добавлено 05.09.06, 08:53 Цитата dron-s @ 05.09.06, 08:49 и что, это тоже не работает? Не могу сказать, не проверил ещё!!! Ща проверю и скажу!!! Добавлено 05.09.06, 08:55 [Ошибка] myword.pas(46): Undeclared identifier: ‘FindAndInsert’ в строке
FindAndInsert := Word.Selection.Find.Execute(Replace := wdReplaceAll); |
dron-s |
|
Цитата BIG-VL @ 05.09.06, 08:51 Когда подключил модуль то сказал он ошибка… [Ошибка] myword.pas(46): Undeclared identifier: ‘FindAndInsert’ в строке ну дык всё правильно… переправь модуль, а вернее функцию FindAndReplace
function FindAndReplace(FindText, ReplacementText:string):boolean; const wdReplaceAll=2; begin Word.Selection.Find.Text := FindText; Word.Selection.Find.Replecement.Text := ReplacementText; FindAndReplace := Word.Selection.Find.Execute(Replace := wdReplaceAll); end; |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Система, Windows API
- Следующая тема
[ Script execution time: 0,0406 ] [ 16 queries used ] [ Generated: 13.04.23, 22:37 GMT ]
I would like to search in a word header and footer for specific words, and then replace them with words from my database.
Currently i can search and replace words anywhere in the word document except for the header and footer.
Can anybody help me with this?
Code for normal search(that works):
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;
Code for header and footer search(doesnt work):
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);