1

Тема: Небольшой вопрос

С VBA совсем незнаком и опыта работы с макросами практически нет. Подвернулась задача, очень простая сама по себе, но сложная из-за огромного размера документа (свыше восьми тысяч страниц). Макрос на уровне "копировать-вставить", но обработать нужно более 250 тысяч строк. Отсюда вопрос: есть ли смысл ждать выполнения задачи (пусть даже на это потребуется много времени, десятки часов работы компьютера), или же ожидание в силу каких-либо причин ничего не даст и ворд просто никогда не развиснет и не решит задачу?

2

Re: Небольшой вопрос

С большими  документами, очень актуален вывод статуса макроса. Если статус хороший, то видно, и сколько сделано и сколько осталось. Самый простой способ - выводить информацию в строку статуса Word. Пример:

Sub A()
Dim N As Long, T As Single
    Do
        ' ваш рабочий код
        ' ...
        ' статус раз в секунду
        If T < Timer Then
            T = Timer + 1
            N = N + 1 ' какой-то счетчик
            StatusBar = "Чтобы прервать, нажмите Ctrl + Break, потом End. Счетчик: " & N
            DoEvents
        End If
        ' ваш рабочий код
        ' ...
    Loop
End Sub

Если просто хотите узнать, висит ли Word или занят выполнением макроса, нажмите Ctrl+Break. Если выскочит окно, нажмите в нем кнопку Continue, чтобы продолжит работу макроса, End - чтобы прервать. Чуть подождите, и если ничего не произойдет, значит Word висит.

Макросы под заказ и готовый пакет - mtdmacro.ru

3

Re: Небольшой вопрос

Feowen пишет:

Макрос на уровне "копировать-вставить", но обработать нужно более 250 тысяч строк.

надо конечно сначала опробовать макрос на 10-15 страницах
и конечно важно ---а что же надо сделать

львиную долю времени в ворде занимает разбивка на страницы
------
нельзя решить задачу, если не понимаешь, что надо сделать

4

Re: Небольшой вопрос

А ещё есть всякие прогресс бары. Если обрабатываете строки, то возьмите за 100% кол-во строк или кол-во символов, а каждую строку за 100 разделить на общее число строк (или общее число символов в документе). Я делал такой с покраской поля ввода текстбокса(кажется) в Юзер Форме (можете поискать в интернете). Вроде не сильно тормозил работу. Ну и видно, что грузится. Ну и сам статус бар ворда, как уже выше написали нормально отображает. Если файл большой и изменений много, то работа макросов может прилично времени занять.

Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

5

Re: Небольшой вопрос

shanemac51 пишет:

. . .
львиную долю времени в ворде занимает разбивка на страницы
. . .

Чтобы макрос меньше тратил времени на разбивку страниц, обработку отрисовки экрана, не останавливался на ненужных сообщениях, я сначала

6

Re: Небольшой вопрос

shanemac51 пишет:

. . .
львиную долю времени в ворде занимает разбивка на страницы
. . .

Чтобы макрос меньше тратил времени на разбивку страниц, обработку отрисовки экрана, не останавливался на ненужных сообщениях, я сначала "запоминаю" текущие опции, назначаю нужные, а после обработки - восстанавливаю прежние опции, напр.:

'Storing current settings
app_screenupdating = Application.screenupdating
disp_alerts = Application.DisplayAlerts
view_mode = ActiveWindow.View.Type
opt_pag = Options.Pagination

'Setting runtime settings
Application.screenupdating = False
Application.DisplayAlerts = False
ActiveWindow.View.Type = wdNormalView
Options.Pagination = False

'Processing . . .

'Restoring previous settings
Application.DisplayAlerts = disp_alerts
ActiveWindow.View.Type = view_mode
Application.screenupdating = app_screenupdating
Options.Pagination = opt_pag
'If necessary, repaginate the document
Activedocument.Repaginate


Можно также подключать и другие режимы, напр., отображаемость кодов полей.

7

Re: Небольшой вопрос

yshindin пишет:

. . .
Можно также подключать и другие режимы
. . .

Еще один совет: если в процессе выполнения макроса вы проводите много изменений в тексте, а история изменений для вас не важна (а важен только конечный результат), то в цикл обработки стоит включать оператор

ActiveDocument.UndoClear

Такой подход может сократить общее время исполнения макроса, т.к. Word будет тратить меньше памяти / времени на обработку.
Также стоит отменить автосохранение документа, если макрос работает долго:

Options.SaveInterval = 0

Но это все - оптимизация. Главное для времени исполнения макроса - это продумать алгоритм и реже использовать "тяжеловесные" объекты и методы, напр., метод Select.