Поиск и замена текста в Word

. Леша (glip) 25.11.08 17:21
Очень нужна помощь.
Пытаюсь найти и заменить текст в вордовском документе... Но у меня находит ттолько первую замену.
Есть подозрение, что после первой замены, программа ищет следующие в первой же замене, а не просматривает весь документ...
Помогите, плиз....


Функция НайтиТекст(Ф,Текст,Замена)

Ф.Selection.Find.ClearFormatting();
Ф.Selection.Find.Text=Текст;
Ф.Selection.Find.Forward=1;
Если Ф.Selection.Find.Execute()=0 Тогда
Возврат(0);
Иначе
Возврат(1);
КонецЕсли;
КонецФункции
//*******************************************
Процедура Показать()
ФайлШаблона = ""+БД+"Samples\"+ШаблоныДоговоров.ПолучитьЗначение(ШаблоныДоговоров.ТекущаяСтрока());
Ф = СоздатьОбъект("Word.Application");
Ф.Documents.Add(ФайлШаблона);
Если НайтиТекст(Ф,"{НомерДоговора}")=1 Тогда
Ф.Selection.Find.Text = СокрЛП(НомерДоговора);
КонецЕсли;
Если НайтиТекст(Ф,"{Должность}")=1 Тогда
Ф.Selection.Find.Text = Должность.ПолучитьЗначение(Должность.ТекущаяСтрока());
КонецЕсли;
Если НайтиТекст(Ф,"{ДатаДоговора}")=1 Тогда
Ф.Selection.Find.Text = СокрЛП(ДатаДоговора);
КонецЕсли;
//заменяем переменные
Ф.Visible = 1
КонецПроцедуры //Показать()

Подписаться Добавить вознаграждение

Ответы

. Василий Демидов (Душелов) 25.11.08 17:23
А если снять выделение? Может он ищет в выделенном тексте?
. Леша (glip) 25.11.08 17:26
. Василий Демидов (Душелов) 25.11.08 17:27
. Леша (glip) 25.11.08 17:31
он тогда удаляет вообще все замены, т.е. выделенные текст = "";
. Леша (glip) 25.11.08 17:33
вот если бы установить курсор в начало документа....
. Василий Демидов (Душелов) 25.11.08 17:41
Ну в тут я советую посмотреть MSDN на предмет перевода курсора: http://msdn.microsoft.com/zh-tw/library/microsoft.office.interop.word.selection_members(VS.80).aspx
. Леша (glip) 25.11.08 21:38
ничего не могу подобного найти:( Может кто еще подскажет!!!
. Федор (tdr1225) 26.11.08 10:57
Код
   
ф.Selection.Find.Execute("{НомерДоговора}", 0,0,0,0,0, 1,1, 0,НомДог,2);
ф.Selection.Find.Execute("{Должность}",      0,0,0,0,0, 1,1, 0,Должн, 2);
Показать полностью

А также см. в ВижуалБейсике описание метода Execute():

Execute method as it applies to the Find object.

Runs the specified find operation. Returns True if the find operation is successful. Boolean.

expression.Execute(FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace, MatchKashida, MatchDiacritics, MatchAlefHamza, MatchControl)
...
обрати внимание на параметры Forward, Wrap и Replace
. Леша (glip) 27.11.08 20:59
спасибо всем...
проблему решил... были ошибки в коде и надо было добавить
wdFindContinue = 1;
Ф.Selection.Find.Wrap=wdFindContinue;
. Женя Попов (koloboc74) 28.11.08 06:33
Процедура Печать()


//Создание объекта Word документ
WordApp=СоздатьОбъект("Word.Application");
NewDoc=WordApp.Documents;
//Открітие файла

Док=NewDoc.Add(КаталогИБ()+"\График.doc");
//Заполнение текстового поля


Fnd = WordApp.ActiveDocument.Range().Find;
Fnd.ClearFormatting();
Fnd.Forward = -1;

// Заменяем ключевые поля на нужные значения

ТаблицаЗамен = СоздатьОбъект("ТаблицаЗначений");
Для x=1 По 3 Цикл
ТаблицаЗамен.НоваяСтрока();
КонецЦикла;

ТаблицаЗамен.НоваяКолонка("Найти" , ,,, "Найти слово");
ТаблицаЗамен.НоваяКолонка("Заменить", ,,, "Заменить на...");
// Что надо

ТаблицаЗамен.УстановитьЗначение(1,1,"{Номер}");
ТаблицаЗамен.УстановитьЗначение(2,1,"{Дата}");
ТаблицаЗамен.УстановитьЗначение(3,1,"{Сотр}");
// На что

ТаблицаЗамен.УстановитьЗначение(1,2, СокрЛП(НомерДок));
ТаблицаЗамен.УстановитьЗначение(2,2, СокрЛП(Нрег(Формат(ДатаДок,"Д(0)ДДММММГГГГ"))));
ТаблицаЗамен.УстановитьЗначение(3,2, СокрЛП(Сотрудник.Подразделение.Получить(ТекущаяДата())));


ТаблицаЗамен.ВыбратьСтроки();
Пока ТаблицаЗамен.ПолучитьСтроку() = 1 Цикл
Fnd.Execute(ТаблицаЗамен.Найти,,,,,,,,, ТаблицаЗамен.Заменить, 2);
КонецЦикла;

WordApp.ActiveWindow.View.Type = 4; // Режим только просмотра WordApp.Visible =1;

12. Александр Жерздев (Al777) 17.12.13 08:23
Использовал в своей обработке некоторые моменты из приведённых модулей кода. Спасибо!
13. Владимир Опарин (TTMouse) 18.12.13 11:35
Тут в стартовой теме изначально неправильно шаблон сделан, потому и решение такое сложное.
Точки входа в документе MS Word надо описать через коллекцию Fields с типами полей = wdFieldDocVariable. После этого можно будет извне применять такой программный ход, который проставит значения везде сразу:
Document.Variables("НомерДоговора").Value = "123456"
Document.Variables("Должность").Value = "Директор"
Document.Fields.Update
Более подробное описание Fields.