Персональный блог Игоря Антонова aka "spider_net"

Почему тормозят некоторые книги Excel


Рубрика: Программирование
Метки: | | | | | |
Просмотров: 9181
Почему тормозят некоторые книги Excel

Вроде давно работаю с офисным пакетом от Microsoft, а с подобной проблемой столкнулся впервые. Присылает мне коллега файл и просит разобраться с проблемой. В файле Excel всего 100 строк, но нормально работать с ним невозможно. Ячейки выделяются с ощутимой задержкой. При открытии файла процесс Excel съедает в районе 700 мегабайт оперативной памяти и ряд других симптомов, не позволяющих нормально работать с документом.

Первое, что меня насторожило - размер файла. Для 100 строк, размер в 29 мегабайт явно многовато. Первым делом я попробовал сохранить файл в режиме совместимости с Office 2003, но положительного результата это не принесло. Файл еще больше увеличился в размере и работать с ним стало еще трудней. Тогда мне ничего не оставалось как обратиться за помощью к Google. Через несколько попыток формирования разных запросов, поиск вывел меня на какой-то англоговорящий форум, где один из участников предложил свое решение подобных проблем.

Проблема тормозов в Excel крылась в присутствии на листе рабочей книги большего количества графических фигур. Посмотреть список этих фигур вы можете в меню "Главная" -> "Найти и выделить" -> "Область выделения".

Список графических фигур в документе Excel

В моем случае их оказалось почти 50 тысяч. Откуда они взялись - отдельный вопрос. Создатель файла разводит руками, но мне кажется, что подобные вещи возникают из-за постоянных вставок в файл данных из других книг. Во всяком случае пользователь составивший файл занимался именно копи пастом. Хорошо, проблема выяснена, а как ее теперь решить? Удалять графические фигуры через это окно слишком сложно (не забываем, Excel по прежнему тормозит).

Вот тут на помощь к нам приходит мощный механизм макросов. Создаем новый макрос ("Вид" -> "Макросы") и копируем в него следующий код:

Dim someShape As Shape
       
       For Each someShape In ActiveSheet.Shapes
           someShape.Delete
       Next someShape

Код копируем прямо в созданную процедуру, затем запускаем его. Excel сразу же задумается и приступит у удалению всех лишних объектов. Мои пятьдесят тысяч объектов были удалены за 4,5 минуты. После завершения процедуры исходный файл похудел аж до 29 килобайт (!!!).

Уверен, что эту заметку будут читать не только разработчики (моя целевая аудитория), но и обычные пользователи. В связи с этим, обращаю внимание на код. Он удаляет абсолютно все объекты с активного листа. Под категорию "все" подпадают текстовые поля, кнопки и т.д. Если в вашем документе есть кнопки и прочие элементы управления, то обязательно укажите фильтр в цикле. Проверить тип удаляемого объекта можно так:

if someShape.Type = 17 Then
 someShape.Delete

Выше приведенный код будет удалять только текстовые поля. Ознакомиться со всеми типами фигур вы можете на в MSDN.

Оставьте комментарий!
comments powered by HyperComments