Excel COUNT работает медленно при перестроении листа данных

Excel COUNT работает медленно при перестроении листа данных

Я работаю с надстройкой Excel, которая удаляет и заново создает таблицу данных при обновлении с использованием данных из активной базы данных таким образом, что ссылки на таблицу данных не нарушаются. Я использую формулу COUNT('DataSheet'!A:A) для подсчета количества строк данных за вычетом строки заголовка столбца. Если данные не обновляются, пересчет будет произведен почти мгновенно, но когда данные обновляются с использованием добавления, счетчик медленно увеличивается, пока формула не завершит расчет. Мне нужно использовать другие похожие формулы, которые значительно замедляют работу рабочей книги.

Я могу придумать обходные пути, но мне нужно знать, что вызывает разницу в поведении, когда COUNT пересчитывается нормально и пересчитывается при обновлении данных. На данный момент данные содержат одинаковое количество строк до и после обновления, а отформатированный диапазон не длиннее данных.

Редактировать: Мне интересно, связано ли это с тем, как Excel обрабатывает, какие ячейки активны/заполнены в памяти?

решение1

Добро пожаловать @TheGreatO96.

Попробуйте использовать COUNTA() вместо COUNT(), но я почти сомневаюсь, что это поможет слишком сильно. Я подозреваю, что вам нужно оптимизировать несколько вещей в вашей надстройке. Обновление базы данных — это изменчивое действие, и оно вызовет перерасчеты, которые обычно не запускаются без обновления. Если вы используете какие-либо изменчивые функции, такие как OFFSET, INDIRECT, NOW или дажеусловное форматирование, в большой рабочей книге все будет ползти к остановке. Тот факт, что вы видите значение COUNT(...) update в одной ячейке, может указывать на значительные задержки в вашем макросе. Вы можете попробовать настроить несколько вещей в вашем коде:

  • Запустите макрос с отключением пересчета. Запустите остальной код. Включите пересчет обратно.

  • Начните свой макрос с отключения обновлений экрана. Запустите остальной код. Включите обновления экрана.

  • Начните свой макрос с отключения событий. Запустите остальной код. Включите события обратно.

P.S. Однажды я увеличил скорость выполнения макроса почти на 2 порядка, просто избавившись от функций OFFSET в пользу относительных именованных диапазонов.

Связанный контент