Предыдущие ответы дали вам «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 происходит из этого самого процесса?