У меня проблема с производительностью в приложении Excel, которое использует объекты списка (также известные как таблицы Excel). Я подозреваю, что это может быть ошибка, но, несмотря на мой поиск в Google, я не смог найти никаких упоминаний об этом. Я уже разработал обходной путь для своего приложения, но меня интересует, может ли кто-нибудь объяснить, почему это происходит.
Примечание. Я использую Excel 2007 в Windows Vista. Настройка выглядит следующим образом: у меня есть электронная таблица, содержащая данные в объекте списка, с кодом VBA, который можно запустить с помощью командной кнопки; этот код может вносить несколько изменений в любое количество ячеек на листе, поэтому перед любыми изменениями для режима расчета Excel устанавливается значение «Вручную».
Проблема, с которой я столкнулся, заключается в том, что если текущая активная ячейка находится внутри объекта списка, то установка режима расчета на ручной, похоже, не имеет никакого эффекта. Поэтому, если у пользователя в том же экземпляре открыта тяжелая рабочая книга для вычислений, тогда код VBA работает очень медленно. Мне практически пришлось разобрать свое приложение, чтобы обнаружить, что это было вызвано активной ячейкой; и я создал новую книгу с простой версией этого сценария, чтобы убедиться, что в моем приложении не было каких-либо повреждений.
Я провел несколько тестов с этим, и ниже приведены результаты того, что я нашел:
Хотя это, как правило, связано с расчетом, все же существует разница во времени, когда режим расчета переключается между ручным и автоматическим...
- Manual = 7.64 secs
- Автоматически = 9,39 с
Ручной режим чуть менее чем на 20% быстрее, чем автоматический. Но я ожидал, что они будут более или менее одинаковыми, учитывая, что проблема, похоже, заключается в том, что расчет начинается даже в ручном режиме.
Сравните это с тем, когда активная ячейка не находится в объекте списка, и результаты сильно отличаются...
- Manual = 0.14 secs
- Автоматически = 3,23 с
Теперь ручной запуск выполняется в 50 раз быстрее, а автоматический запуск показывает, что расчет не должен был занимать более 3,2 секунды! Итак, теперь первый тест выглядит так, как будто он мог выполнить расчет дважды в ручном режиме и почти 3 раза в автоматическом режиме.
Повторяем этот тест еще раз, на этот раз в экземпляре без формулы расчета ни в одной ячейке, и внезапно он кажется не таким уж плохим,
- Active cell is List Object & Calc is Manual = 0.17 secs
- Активной ячейкой является объект списка, а расчет выполняется автоматически = 0,20 с.
- Активная ячейка пуста, а расчет ведется вручную = 0,14 с.
- Активная ячейка пуста, а расчет выполняется автоматически = 0,18 с.
Он по-прежнему медленнее, но уже только на 10-20%, что делает его незаметным. Но это показывает, что проблема должна быть каким-то образом связана с расчетом, иначе он занял бы столько же времени, сколько и первый тест.
Если кто-то хочет создать эти тесты, чтобы убедиться в этом, настройка выглядит следующим образом:
- Новая рабочая книга с добавленным объектом списка (не должна быть связана с какими-либо данными)
- Добавьте формулу, вычисление которой займет некоторое время (я только что повторил «=1*1» 30 000 раз)
- Напишите быстрый код VBA, который будет; (i) выполнить простое редактирование ячейки несколько сотен раз, (ii) и записать время, затраченное на это
- Затем просто запустите код, изменив активную ячейку между объектом списка и пустой ячейкой.
Мне было бы очень интересно услышать, может ли кто-нибудь объяснить, почему Excel ведет себя таким образом, и если это ошибка или какая-то функция, связанная с объектами списка, которая действительно имеет какое-то реальное применение?
Спасибо, Стюарт.