Как мне уступить насосу сообщений в Excel VBA 2010? - PullRequest
1 голос
/ 03 ноября 2010

У меня есть макрос Excel, который занимает очень много времени. Кажется, что происходит сбой Excel (я получаю сообщение «Не отвечает» на панели задач), когда я оставляю его без присмотра, но если я ставлю точку останова, которая срабатывает каждые пять или десять секунд, это нормально. Проблема в том, что мне нужно наступить с точки останова примерно четверть миллиона раз (нам нужно около 200 часов, чтобы казнить этого зверя)

Я предполагаю, что отсутствие активности помпы сообщений приводит в замешательство ядро, так как я могу очистить очередь сообщений? Или я полностью лаю не на том дереве?

Кстати, я очень новичок в этом, поэтому ссылки на документацию будут очень кстати.

Ура, Guy

Ответы [ 4 ]

7 голосов
/ 03 ноября 2010

Заключение о том, что 200h немного беспокоит, однако вы можете попробовать оператор DoEvents, который " отменяет выполнение макроса, чтобы операционная система могла обрабатывать другие события ». (Обратите внимание, что при вызове DoEvents дополнительно взимается штраф за время)

1 голос
/ 03 ноября 2010

Я должен согласиться с 0xA3, если у вас есть подпрограмма Excel, которая должна занять более 200 часов, то вы либо настраиваете ее очень неэффективно, либо используетенеправильный инструмент для этой работы.

В любом случае, есть несколько вещей, которые вы можете сделать, чтобы оптимизировать процедуру.Это будет особенно полезно, если вы постоянно записываете значения в отдельные ячейки.

Sub MarathonCalc

    Application.EnableEvents = False
    Application.ScreenUpdating = False

    ' Code to decode human genome goes here

    Application.EnableEvents = True
    Application.ScreenUpdating = True

End Sub

Опять же, если вы публикуете часть своего кода, возможно, мы можем помочь отследить, почему это занимает так много времени.

0 голосов
/ 03 ноября 2010

Предыдущие ответы дали вам «DoEvents», и это первое исправление вашей проблемы.

Однако ... Более внимательный взгляд на происходящее поднимает некоторые тревожные вопросы.Во-первых, модель потоков в Excel довольно примитивна: есть один процесс (согласно документации), и никакие новые потоки не создаются внутренне или внешне генерируемыми событиями, обратными вызовами и сообщениями.Один процесс и ТОЛЬКО один процесс, а все остальное должно ждать завершения текущего макроса VBA или вычисления в электронной таблице.

На самом деле, некоторые вещи могут прервать это: {esc} и {ctrl-break} (хотя их можно временно отключить), поэтому в Excel все время работает по крайней мере еще один поток, и вы ОЖИДАЕТЕ, что операционной системе будет разрешено вмешиваться в процесс ... Не так ли?

Ужасная реальность такова, что приложение Excel не позволяет внешним событиям и сообщениям запускаться в «приемник событий» во время выполнения макроса или вычисления, если только вы не вызываете «DoEvents» и некоторые сообщения Windows (обратите внимание нас заглавными буквами) все равно не будет рассматриваться.

Если недокументированное количество сообщений и внешних событий останется без ответа, приложение будет аварийно завершено.Основываясь на моих собственных тестах, я думаю, что число составляет 50;там есть документация по настройке реестра, но я не делаю ссылки на материал, который считаю ненадежным - я попробовал данную настройку и обнаружил, что она неэффективна.

Так что же вас оставит?

Во-первых, посмотрите на ваш код еще раз.Application.EnableEvents = False и Application.ScreenUpdating = False являются полезными настройками: ваш следующий шаг - найти все операции чтения или записи для отдельных ячеек на листе и просто захватить массивы ячеек - гораздо быстрее захватить массив с помощьюmyVBAarray = Range.Value, выполните вычисления в VBA и запишите вариант массива VBA обратно в Range.Value.

Во-вторых ... Вы также видели, что состояние ожидания, наложенное точкой останова, позволяетнекоторые вещи, чтобы разобраться в себе.Это звучит как внешний процесс (запрос к базе данных?), Работающий асинхронно: может ли быть сообщение, что сбой Excel происходит из этого самого процесса?

0 голосов
/ 03 ноября 2010

«Не отвечает» не означает, что Excel вылетает, это просто означает, что он фактически не отвечает на оконные сообщения.

Если это не проблема, вам не о чем волноватьсяЯ довольно обеспокоен вашим комментарием, что вы ожидаете, что задание займет 200 часов (что больше недели!).Мне кажется, что вы не используете правильный инструмент для этой работы.Постарайтесь выяснить, что занимает так много времени, и объяснить, что вы на самом деле делаете.Тогда мы увидим, как лучше решить эту задачу.

...