Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2010, 18:11   #1
Мультипликатор
Пользователь
 
Регистрация: 11.07.2009
Сообщений: 18
По умолчанию Как избежать Selection?

Стал использовать в Ворде макросы. Но в нём все действия (по записям макрорекордера и в справке) происходят с помощью Selection. В Экселе можно не использовать Selection, указывая на адрес ячейки с помощью Cells или Range.
Можно ли подобным образом, как в Экселе, избежать использования Selection в Ворде и как это сделать? Тогда бы сократилось время кода. Всё-таки Selection сильно тормозит программу.
Мультипликатор вне форума Ответить с цитированием
Старый 20.06.2010, 01:34   #2
bdfy
Форумчанин
 
Регистрация: 12.11.2009
Сообщений: 258
По умолчанию

совершенно верно. можно range использовать.
дайте пример кода с селекшен - переиначим
bdfy вне форума Ответить с цитированием
Старый 20.06.2010, 18:46   #3
Мультипликатор
Пользователь
 
Регистрация: 11.07.2009
Сообщений: 18
По умолчанию

Цитата:
Сообщение от bdfy Посмотреть сообщение
совершенно верно. можно range использовать.
дайте пример кода с селекшен - переиначим
Вот код. Он в файле Экселя. Но предназначен для работы в Ворде.
Вложения
Тип файла: rar ПробаПеревода.rar (44.8 Кб, 18 просмотров)
Мультипликатор вне форума Ответить с цитированием
Старый 20.06.2010, 22:15   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Не думаю, что в данном случае отход от Selection поможет увеличить быстродействие, т.к. на каждом шаге поиска выполняются дополнительные действия.
Выделение снимается процедурой Collapse: 1 — свернуть выделение к началу, 0 — к концу:
Код:
Selection.Collapse 0 'Снять выделение и переместить курсор в конец
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 21.06.2010, 14:32   #5
Мультипликатор
Пользователь
 
Регистрация: 11.07.2009
Сообщений: 18
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
Не думаю, что в данном случае отход от Selection поможет увеличить быстродействие, т.к. на каждом шаге поиска выполняются дополнительные действия.
Выделение снимается процедурой Collapse: 1 — свернуть выделение к началу, 0 — к концу:
Код:
Selection.Collapse 0 'Снять выделение и переместить курсор в конец
Тогда возникает резонный вопрос: а как сделать так, чтобы увеличить быстродействие? Какие еще есть варианты? Может у меня в принципе неправильный подход?
Ведь Collapse, он ведь тоже Selection!!! И снимется ли выделение или нет - время на это будет потеряно. Я ведь правильно понимаю?
Кстати, Ждал именно вашего ответа, viter.alex. По рекомендации....
Мультипликатор вне форума Ответить с цитированием
Старый 21.06.2010, 15:02   #6
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Я же говорю, в твоём макросе быстродействие определяется не тем, что работаешь через Selection, а тем, что после поиска, ты работаешь с каждым найденным фрагментом. Кстати, если в данном случае использовать Range, то получится не так удобно. Я вот думаю, а может стоит нужные фрагменты помещать в закладки, а потом читать данные из закладок? Но вряд ли это увеличит быстродействие.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 21.06.2010, 16:08   #7
Мультипликатор
Пользователь
 
Регистрация: 11.07.2009
Сообщений: 18
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
Я вот думаю, а может стоит нужные фрагменты помещать в закладки, а потом читать данные из закладок? Но вряд ли это увеличит быстродействие.
Если ты заметил, я использую закладки после. Когда открываю другой документ (Программу) и пробегая по столбцам Экселя вставляю в этот документ с помощью закладок. Может быть, Эксель здесь вообще лишний? Но на экране, при работе макроса, видно только мельтешение в Ворде, как он находит, выделяет, пробегает по столбцам таблиц и т.д., а изменений в Экселе не видно, потому что без Select.
Мультипликатор вне форума Ответить с цитированием
Старый 21.06.2010, 16:22   #8
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

так отключи обновление экрана, или вообще скрой приложение на время работы
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 21.06.2010, 16:27   #9
Мультипликатор
Пользователь
 
Регистрация: 11.07.2009
Сообщений: 18
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
так отключи обновление экрана, или вообще скрой приложение на время работы
Я так и делал, но на разных компах почему-то, если .Visible = False - выдавало ошибки, в которых разбираться у меня не было сил, точнее было выше моих сил. Поэтому на тех компах, где ошибки возникали - .Visible = True.
Вобщем, спасибо за помощь.
Хоть я и не понял, как же можно избавиться от селекшн.
Мультипликатор вне форума Ответить с цитированием
Старый 21.06.2010, 16:54   #10
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

У объекта Selection есть свойство Range, вот от него и нужно плясать, если начинать работать с активным документом. А вообще Selection и Range почти одно и то же, только Selection — это то, что мы видим на экране, а Range, так сказать, внутреннее представление. Хотя есть и отличия в методах, скажем разрыв стиля можно вставить только для Selection.
Пример, как можно было бы вести поиск в твоём случае с использованием Range:
Код:
Dim oRng As Range
With wdDoc.Range.Find
  .Text = "СОГЛАСОВАНО" 'Что ищем
  .Wrap = 1 '(wdFindContinue) Это чтобы продожать искать
  .Execute 'Выполняем поиск
  Set oRng = .Parent 'Запоминаем найденный диапазон
  'Дальше смещаемся по ячейкам? Т.е. выделяем две ячейки? Но при переходе по ячейкам Extend 
  'может быть только 0, т.е. wdMove. А вообще, такого метода нет у объекта Range
  oRng.MoveRight Unit:=12, Count:=2, Extend:=1
  'Допустим сместились на две ячейки и берём текст
  ДолжРукЗак = oRng.Cells(1).Next.Next.Range.Text
и т.д.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бот - как избежать слежки? boris-blade Win Api 9 28.12.2009 09:11
Как избежать бана со стороны сервера за запросы AndrzejX Работа с сетью в Delphi 2 07.12.2009 17:03
как избежать кэширования в Опере rolling PHP 3 01.12.2009 18:34
Selection - как объеденить??? Sensygirl Microsoft Office Excel 8 05.10.2009 18:03
Как перейти selection-ом в конец документа? Diego__ Microsoft Office Word 4 26.08.2009 18:16