Выделить блок

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Shas
Сообщения: 8
Зарегистрирован: 05 июл 2009, 10:43

Посоветуйте, пожалуйста, как лучше реализовать следующее.
В вордовском документе есть строка "#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)
Аватара пользователя
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
Если не надо размножать перевод строки после #1#, то

Код: Выделить всё

...
.Text = "(#1#^11)(*)(#2#)"
...
Андрей Энтелис,
aentelis.livejournal.com
Shas
Сообщения: 8
Зарегистрирован: 05 июл 2009, 10:43

Aent писал(а):

Код: Выделить всё

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
Если не надо размножать перевод строки после #1#, то

Код: Выделить всё

...
.Text = "(#1#^11)(*)(#2#)"
...
Спасибо!
Классно отрабатывает!
Маленькая поправочка: "(#1#^13)(*)(#2#)"
Честно говоря, не ожидал от ворда такого понимания РВ, поэтому немного упростил свой вопрос.

Как бы все-таки найденный текст запомнить в переменной, а потом вставлять при некотором условии?
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

^11 или ^l это принудительный разрыв строки.
^13 перевод строки
;)
Что собственно вы хотите получить? Возможно ваша задача решается через поля..
Какого типа условия?
Нужно ли запоминать форматирование или достаточно только текст?
Андрей Энтелис,
aentelis.livejournal.com
Shas
Сообщения: 8
Зарегистрирован: 05 июл 2009, 10:43

Aent писал(а):^11 или ^l это принудительный разрыв строки.
^13 перевод строки
;)
Что собственно вы хотите получить? Возможно ваша задача решается через поля..
Какого типа условия?
Нужно ли запоминать форматирование или достаточно только текст?
Блок текста, тот который между #1# и #2#, надо повторять в случае появления новой информации в некоторой таблице access' и вставлять в поля вновь повторенного блока значения полей записи таблицы.
Вот я и предполагал следующее:
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 вставляете
данные из таблицы на основании содержания поля (или заменяете поле данными)
Андрей Энтелис,
aentelis.livejournal.com
Shas
Сообщения: 8
Зарегистрирован: 05 июл 2009, 10:43

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

Однако не дает покоя мысль, что есть решение "по-красивше"
Ответить