Посоветуйте, пожалуйста, как лучше реализовать следующее.
В вордовском документе есть строка "#1#" и строка "#2#". Необходимо текст между этими строками размножить n раз.
Может есть метод по-красивее, но пока вижу только так:
1.найти номер символа, первого после #1#;
2.найти номер символа непосредственно перед #2#;
3.определить Range с началом и концом в этих позициях;
4.ну и сделать с ним что-нибудь (вырезать/копировать)
Если лучше варианта нет, то подскажите, как реализовать пункты 1 и 2.
В случае ниже выдаются номера первого и последнего символа документа
(т.е. курсор не переходит на позицию найденного текста):
wrd_doc.Range.Find.Execute FindText:="#1#"
MsgBox (wrd_doc.Range.Start & " " & wrd_doc.Range.End)
Выделить блок
Модератор: Naeel Maqsudov
- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
Код: Выделить всё
Dim n as long
n = 10 ' количество повторений блока
With ActiveDocument.Content.Find
.ClearFormatting
.Text = "(#1#)(*)(#2#)"
.Replacement.Text = "\1" & Replace(String(n,"."),".","\2") & "\3"
.Forward = True
.Wrap = wdFindContinue
.MatchWildcards = True
.Execute Replace:=wdReplaceAll
End With
Код: Выделить всё
...
.Text = "(#1#^11)(*)(#2#)"
...
Андрей Энтелис,
aentelis.livejournal.com
aentelis.livejournal.com
Спасибо!Aent писал(а):Если не надо размножать перевод строки после #1#, тоКод: Выделить всё
Dim n as long n = 10 ' количество повторений блока With ActiveDocument.Content.Find .ClearFormatting .Text = "(#1#)(*)(#2#)" .Replacement.Text = "\1" & Replace(String(n,"."),".","\2") & "\3" .Forward = True .Wrap = wdFindContinue .MatchWildcards = True .Execute Replace:=wdReplaceAll End With
Код: Выделить всё
... .Text = "(#1#^11)(*)(#2#)" ...
Классно отрабатывает!
Маленькая поправочка: "(#1#^13)(*)(#2#)"
Честно говоря, не ожидал от ворда такого понимания РВ, поэтому немного упростил свой вопрос.
Как бы все-таки найденный текст запомнить в переменной, а потом вставлять при некотором условии?
- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
^11 или ^l это принудительный разрыв строки.
^13 перевод строки

Что собственно вы хотите получить? Возможно ваша задача решается через поля..
Какого типа условия?
Нужно ли запоминать форматирование или достаточно только текст?
^13 перевод строки

Что собственно вы хотите получить? Возможно ваша задача решается через поля..
Какого типа условия?
Нужно ли запоминать форматирование или достаточно только текст?
Андрей Энтелис,
aentelis.livejournal.com
aentelis.livejournal.com
Блок текста, тот который между #1# и #2#, надо повторять в случае появления новой информации в некоторой таблице access' и вставлять в поля вновь повторенного блока значения полей записи таблицы.Aent писал(а):^11 или ^l это принудительный разрыв строки.
^13 перевод строки
Что собственно вы хотите получить? Возможно ваша задача решается через поля..
Какого типа условия?
Нужно ли запоминать форматирование или достаточно только текст?
Вот я и предполагал следующее:
1. блок между #1# и #2# с незаполненными полями вырезаем
2. читаем таблицу access'
3. встретил нужную запись
4. вставил вырезанный блок
5. заменил поля блока значениями из таблицы
6. к пункту 2
Вот и хотел узнать, как в тексте word'ого документа отыскать блок между #1# и #2#, вырезать его, а затем периодически вставлять?
С остальными пунктами плана проблем вроде не возникало.
- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
Sash, ну нечто похожее я и предполагал.
Есть в MS WORD такой механизм СЛИЯНИЕ (см., например: http://office.microsoft.com/ru-ru/word/ ... 01049.aspx)
Подобные задачи легко решаются с его помощью.
А шаблон для слияния можно создать с помощью поиска и замены как было показано выше.
Альтернативный механизм - размножаете шаблон со своими полями типа ADDIN
Затем, сами обходите коллекцию FIELDS и после каждого поля ADDIN вставляете
данные из таблицы на основании содержания поля (или заменяете поле данными)
Есть в MS WORD такой механизм СЛИЯНИЕ (см., например: http://office.microsoft.com/ru-ru/word/ ... 01049.aspx)
Подобные задачи легко решаются с его помощью.
А шаблон для слияния можно создать с помощью поиска и замены как было показано выше.
Альтернативный механизм - размножаете шаблон со своими полями типа ADDIN
Затем, сами обходите коллекцию FIELDS и после каждого поля ADDIN вставляете
данные из таблицы на основании содержания поля (или заменяете поле данными)
Андрей Энтелис,
aentelis.livejournal.com
aentelis.livejournal.com
Все таки это не то.Aent писал(а):Sash, ну нечто похожее я и предполагал.
Есть в MS WORD такой механизм СЛИЯНИЕ (см., например: http://office.microsoft.com/ru-ru/word/ ... 01049.aspx)
Подобные задачи легко решаются с его помощью.
А шаблон для слияния можно создать с помощью поиска и замены как было показано выше.
Альтернативный механизм - размножаете шаблон со своими полями типа ADDIN
Затем, сами обходите коллекцию FIELDS и после каждого поля ADDIN вставляете
данные из таблицы на основании содержания поля (или заменяете поле данными)
В этом механизме слияния, предварительные действия производятся непосредственно с вордовским документом.
Моя же задача добавить к некоторой форме access'a вызов процедуры, которая открывает вордовский файл и вставляет по описанному ранее методу данные. Файлов таких может быть несколько разных, но одинаковое в них то, что есть блок, ограниченный #1# и #2#.
Это файлы отчетов, присылаемые из другой организации. Если придумают новый отчет, надо будет добавить только новое имя файла и все.
И все таки: Как сохранить интересующий меня блок в переменную, для последующей вставки?
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Кое что получилось и даже работает. Раз никаких вариантов больше не поступило, делал как написал в первом посте, тобиш:Shas писал(а):Все таки это не то.
В этом механизме слияния, предварительные действия производятся непосредственно с вордовским документом.
Моя же задача добавить к некоторой форме access'a вызов процедуры, которая открывает вордовский файл и вставляет по описанному ранее методу данные. Файлов таких может быть несколько разных, но одинаковое в них то, что есть блок, ограниченный #1# и #2#.
Это файлы отчетов, присылаемые из другой организации. Если придумают новый отчет, надо будет добавить только новое имя файла и все.
И все таки: Как сохранить интересующий меня блок в переменную, для последующей вставки?
1.найти номер символа, первого после #1#;
2.найти номер символа непосредственно перед #2#;
3.определить Range с началом и концом в этих позициях;
4.ну и сделать с ним что-нибудь (вырезать/копировать)
Однако не дает покоя мысль, что есть решение "по-красивше"