Я работаю с надстройкой Excel, которая удаляет и заново создает таблицу данных при обновлении с использованием данных из активной базы данных таким образом, что ссылки на таблицу данных не нарушаются. Я использую формулу COUNT('DataSheet'!A:A) для подсчета количества строк данных за вычетом строки заголовка столбца. Если данные не обновляются, пересчет будет произведен почти мгновенно, но когда данные обновляются с использованием добавления, счетчик медленно увеличивается, пока формула не завершит расчет. Мне нужно использовать другие похожие формулы, которые значительно замедляют работу рабочей книги.
Я могу придумать обходные пути, но мне нужно знать, что вызывает разницу в поведении, когда COUNT пересчитывается нормально и пересчитывается при обновлении данных. На данный момент данные содержат одинаковое количество строк до и после обновления, а отформатированный диапазон не длиннее данных.
Редактировать: Мне интересно, связано ли это с тем, как Excel обрабатывает, какие ячейки активны/заполнены в памяти?
решение1
Добро пожаловать @TheGreatO96.
Попробуйте использовать COUNTA() вместо COUNT(), но я почти сомневаюсь, что это поможет слишком сильно. Я подозреваю, что вам нужно оптимизировать несколько вещей в вашей надстройке. Обновление базы данных — это изменчивое действие, и оно вызовет перерасчеты, которые обычно не запускаются без обновления. Если вы используете какие-либо изменчивые функции, такие как OFFSET, INDIRECT, NOW или дажеусловное форматирование, в большой рабочей книге все будет ползти к остановке. Тот факт, что вы видите значение COUNT(...) update в одной ячейке, может указывать на значительные задержки в вашем макросе. Вы можете попробовать настроить несколько вещей в вашем коде:
Запустите макрос с отключением пересчета. Запустите остальной код. Включите пересчет обратно.
Начните свой макрос с отключения обновлений экрана. Запустите остальной код. Включите обновления экрана.
Начните свой макрос с отключения событий. Запустите остальной код. Включите события обратно.
P.S. Однажды я увеличил скорость выполнения макроса почти на 2 порядка, просто избавившись от функций OFFSET в пользу относительных именованных диапазонов.