Переполнение буфера в Excel
Вопрос такой, при формировании больших отчетов в Ехсel изпользую копирование
листа в качестве шаблона. После создания и заполнения порядка 300 копий
Excel выдает ошибку и вылетает. Полагаю из-за переполнения буфера. Функции
очистки буфера в VBA Excel я не нашел. Помогите.
С уважением Андрей.
Здравствуйте.
Вопрос такой, при формировании больших отчетов в Ехсel изпользую копирование
листа в качестве шаблона. После создания и заполнения порядка 300 копий
Excel выдает ошибку и вылетает. Полагаю из-за переполнения буфера. Функции
очистки буфера в VBA Excel я не нашел. Помогите.
С уважением Андрей.
Для очистки Экселевского буфера очень удобна команда Application.Calculate
Для очистки Экселевского буфера очень удобна команда Application.Calculate
Не канает, пробовал
Нельзя ли по подробнее про application.calculate
в чем смысл?
У меня такая фига, sheeets(bla).copy befor sheets(1) в цикле
ну и после многократного копирования(раз200-300) excel выдает ошибку 1004 и вылетает.:x
Заранее благодарен
Не канает, пробовал
Нельзя ли по подробнее про application.calculate
в чем смысл?
У меня такая фига, sheeets(bla).copy befor sheets(1) в цикле
ну и после многократного копирования(раз200-300) excel выдает ошибку 1004 и вылетает.:x
Заранее благодарен
Application.Calculate призводит пересчет всех ячеек в открытых книгах. То есть это некий безопасный оператор, который удобно использовать, чтобы Excel "забыл" про ячейки, которые он собирался копировать. Но когда лист копируется целиком, там такого буфера не возникает. То есть дело в другом.
Может быть, там какая-нибудь проблема с именами...
Погляди, какие имена присваиваются твоим копируемым листам (причем, погляди как Экселевское имя, так и ВБА-шное).
Можешь сюда зазипить файл, поглядим...
...
Может быть, там какая-нибудь проблема с именами...
Погляди, какие имена присваиваются твоим копируемым листам (причем, погляди как Экселевское имя, так и ВБА-шное).
Можешь сюда зазипить файл, поглядим...
Может и так. вот архивчик. только не спрашивай, почему этого нельзя сделать в акцесе. Есть такое слово "НАДО".
Может и так. вот архивчик. только не спрашивай, почему этого нельзя сделать в акцесе. Есть такое слово "НАДО".
Супер. В Экселе нашелся еще один баг! Он связан с генерированием внутренних Экселевских имен при копировании.
В твоем случае самый простой способ избежать этого - это воспользоваться-таки созданием нового диста и копированием на него ячеек. А чтобы твое форматирование копировалось целиком, замени твои строчки на вот эти:
NewSheet.Name = strN
Sheets("Болванка").Cells.Copy Destination:=Sheets(strN).Cells
ActiveWindow.Zoom = 75
P.S. А про Access я ничего и не говорю. Я сам Эксельщик, у меня даже Виндоуз на Экселе написаны... :)
Не канает, пробовал
Нельзя ли по подробнее про application.calculate
в чем смысл?
У меня такая фига, sheeets(bla).copy befor sheets(1) в цикле
ну и после многократного копирования(раз200-300) excel выдает ошибку 1004 и вылетает.:x
Заранее благодарен
У меня твой пример вылетает на i=255. И если после сохранения разбухшего файла его загрузить снова и продолжать счет, он вылетает там же. То есть это не переполнение буфера. Похоже на ограничение по числу страниц, уж число-то больно характерное 255. Но сам я с таким количеством листов не работал.
Кстати
Dim i, j, n As Integer
здесь целой объявляется только n.
У меня твой пример вылетает на i=255. И если после сохранения разбухшего файла его загрузить снова и продолжать счет, он вылетает там же. То есть это не переполнение буфера. Похоже на ограничение по числу страниц, уж число-то больно характерное 255. Но сам я с таким количеством листов не работал.
Кстати
Dim i, j, n As Integer
здесь целой объявляется только n.
Формального ограничения на количество листов в Экселе нет. Вот такой макрос:
While 1 = 1
Worksheets.Add
Wend
End Sub
прекрасно работает "долгие годы".
Как мне кажется, вылет происходит по следующей причине. При копировании листа Эксель генерирует ему внутреннее и внешнее имена. С внешним все -понятно - "Болванка (2)" тут же переименовывается в "нормальное" имя - и дальше никаких проблем. А вот с внутренним возникает проблема. Я так понимаю, что сначала Эксель берет внутреннее имя копируемого листа и просто добавляет к нему единичку - Лист1 превращается в Лист11. При втором копировании Лист11 уже занят - пробуем Лист12 и т.д. То есть там организован цикл - перебирают имена вида Лист1n пока не встретят свободное. И эту переменную n ребята Билла Гейтса почему-то взяли типа byte. На 256 шаге получаем кирдык. Наверное, все примерно так...
К сожалению, внутренние имена нельзя менять программно, поэтому я вижу только такой способ обходить этот глюк - накопировать 250 листов - перенести их в другую книгу, накопировать еще 250 - потом перенести первые 250 обратно. Вроде бы при переносе листов механизм замены повторяющихся имен в Экселе другой.
В твоем случае самый простой способ избежать этого - это воспользоваться-таки созданием нового диста и копированием на него ячеек. А чтобы твое форматирование копировалось целиком, замени твои строчки на вот эти:
Sheets("Болванка").Cells.Copy Destination:=Sheets(strN).Cells
Спасибо за подсказку, таперича все работает как положено. Позвоню своим в Новосиб, вразумлю.Может пиво стрясу.
Кстати, за мной не заржавеет.Чем смогу помогу