
У меня есть сравнительно небольшая (~100 КБ) электронная таблица Excel 2010, которая (через VBA) при открытии закрывает все рабочие листы, кроме начальной страницы, проверяет имя пользователя и сверяет его с таблицей SQL, возвращая запись пользователя для проверки его прав доступа.
Обновляются несколько ячеек rangeUserName, rangeCurrentUser, rangeSystemAccess и т. д.
Если я открываю эту книгу, когда есть другие большие электронные таблицы (также содержащие VBA), то на ее открытие уходит около 30–60 секунд, а если не открыто ни одной другой книги, то на ее открытие уходит менее 5 секунд.
Почему это?
решение1
По умолчанию Excel открывает каждый файл в одном процессе EXCEL.EXE — это можно увидеть на вкладке «Процессы» диспетчера задач Windows.
Поэтому продолжение открытия файлов может вызвать конфликт внутри этого процесса — в конечном итоге он исчерпает память и замедлится или произойдет сбой.
Чтобы избежать этого, вы можете запустить последующие окна Excel как отдельный процесс EXCEL.EXE. Вы делаете это, удерживая клавишу Shift, когда выбираете Excel в меню «Пуск» или щелкаете его на панели задач. После того, как они были запущены как отдельные процессы, Windows, похоже, лучше управляет ресурсами — я считаю, что она выгружает неактивные процессы в виртуальную память.
В Excel 2013 эту игру немного усложнили — вам придется удерживать клавиши Shift + Alt, пока не появится окно подтверждения.
Я стараюсь открывать каждое окно Excel таким образом, особенно если работаю с большими файлами, кодом VBA, сводными таблицами, внешними данными или надстройками. Помимо того, что это позволяет избежать проблем с ресурсами в первую очередь, это означает, что вы теряете свою работу только в одном окне в случае сбоя или зависания, а не теряете все сразу.