Почему тормозят некоторые книги Excel
Рубрика: Программирование
Метки: excel | ms office | soft | инструменты | полезности | программирование | советы
Просмотров: 9474
Вроде давно работаю с офисным пакетом от Microsoft, а с подобной проблемой столкнулся впервые. Присылает мне коллега файл и просит разобраться с проблемой. В файле Excel всего 100 строк, но нормально работать с ним невозможно. Ячейки выделяются с ощутимой задержкой. При открытии файла процесс Excel съедает в районе 700 мегабайт оперативной памяти и ряд других симптомов, не позволяющих нормально работать с документом.
Первое, что меня насторожило - размер файла. Для 100 строк, размер в 29 мегабайт явно многовато. Первым делом я попробовал сохранить файл в режиме совместимости с Office 2003, но положительного результата это не принесло. Файл еще больше увеличился в размере и работать с ним стало еще трудней. Тогда мне ничего не оставалось как обратиться за помощью к Google. Через несколько попыток формирования разных запросов, поиск вывел меня на какой-то англоговорящий форум, где один из участников предложил свое решение подобных проблем.
Проблема тормозов в 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.