Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Переполнение буфера в Excel

3.7K
31 марта 2003 года
Андрей Несмеян
4 / / 31.03.2003
Здравствуйте.
Вопрос такой, при формировании больших отчетов в Ехсel изпользую копирование
листа в качестве шаблона. После создания и заполнения порядка 300 копий
Excel выдает ошибку и вылетает. Полагаю из-за переполнения буфера. Функции
очистки буфера в VBA Excel я не нашел. Помогите.
С уважением Андрей.
267
31 марта 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by Андрей Несмеян
Здравствуйте.
Вопрос такой, при формировании больших отчетов в Ехсel изпользую копирование
листа в качестве шаблона. После создания и заполнения порядка 300 копий
Excel выдает ошибку и вылетает. Полагаю из-за переполнения буфера. Функции
очистки буфера в VBA Excel я не нашел. Помогите.
С уважением Андрей.



Для очистки Экселевского буфера очень удобна команда Application.Calculate

3.7K
01 апреля 2003 года
Андрей Несмеян
4 / / 31.03.2003
Цитата:
Originally posted by Cutty Sark


Для очистки Экселевского буфера очень удобна команда Application.Calculate



Не канает, пробовал
Нельзя ли по подробнее про application.calculate
в чем смысл?
У меня такая фига, sheeets(bla).copy befor sheets(1) в цикле
ну и после многократного копирования(раз200-300) excel выдает ошибку 1004 и вылетает.:x
Заранее благодарен

267
01 апреля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by Андрей Несмеян


Не канает, пробовал
Нельзя ли по подробнее про application.calculate
в чем смысл?
У меня такая фига, sheeets(bla).copy befor sheets(1) в цикле
ну и после многократного копирования(раз200-300) excel выдает ошибку 1004 и вылетает.:x
Заранее благодарен



Application.Calculate призводит пересчет всех ячеек в открытых книгах. То есть это некий безопасный оператор, который удобно использовать, чтобы Excel "забыл" про ячейки, которые он собирался копировать. Но когда лист копируется целиком, там такого буфера не возникает. То есть дело в другом.
Может быть, там какая-нибудь проблема с именами...
Погляди, какие имена присваиваются твоим копируемым листам (причем, погляди как Экселевское имя, так и ВБА-шное).

Можешь сюда зазипить файл, поглядим...

3.7K
02 апреля 2003 года
Андрей Несмеян
4 / / 31.03.2003
Цитата:
Originally posted by Cutty Sark


...
Может быть, там какая-нибудь проблема с именами...
Погляди, какие имена присваиваются твоим копируемым листам (причем, погляди как Экселевское имя, так и ВБА-шное).

Можешь сюда зазипить файл, поглядим...



Может и так. вот архивчик. только не спрашивай, почему этого нельзя сделать в акцесе. Есть такое слово "НАДО".

267
02 апреля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by Андрей Несмеян


Может и так. вот архивчик. только не спрашивай, почему этого нельзя сделать в акцесе. Есть такое слово "НАДО".




Супер. В Экселе нашелся еще один баг! Он связан с генерированием внутренних Экселевских имен при копировании.

В твоем случае самый простой способ избежать этого - это воспользоваться-таки созданием нового диста и копированием на него ячеек. А чтобы твое форматирование копировалось целиком, замени твои строчки на вот эти:

 
Код:
Set NewSheet = Worksheets.Add
NewSheet.Name = strN
Sheets("Болванка").Cells.Copy Destination:=Sheets(strN).Cells
ActiveWindow.Zoom = 75


P.S. А про Access я ничего и не говорю. Я сам Эксельщик, у меня даже Виндоуз на Экселе написаны... :)
459
02 апреля 2003 года
gacol
273 / / 12.02.2003
Цитата:
Originally posted by Андрей Несмеян


Не канает, пробовал
Нельзя ли по подробнее про application.calculate
в чем смысл?
У меня такая фига, sheeets(bla).copy befor sheets(1) в цикле
ну и после многократного копирования(раз200-300) excel выдает ошибку 1004 и вылетает.:x
Заранее благодарен



У меня твой пример вылетает на i=255. И если после сохранения разбухшего файла его загрузить снова и продолжать счет, он вылетает там же. То есть это не переполнение буфера. Похоже на ограничение по числу страниц, уж число-то больно характерное 255. Но сам я с таким количеством листов не работал.

Кстати
Dim i, j, n As Integer
здесь целой объявляется только n.

267
02 апреля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by gacol


У меня твой пример вылетает на i=255. И если после сохранения разбухшего файла его загрузить снова и продолжать счет, он вылетает там же. То есть это не переполнение буфера. Похоже на ограничение по числу страниц, уж число-то больно характерное 255. Но сам я с таким количеством листов не работал.

Кстати
Dim i, j, n As Integer
здесь целой объявляется только n.



Формального ограничения на количество листов в Экселе нет. Вот такой макрос:

 
Код:
Sub Test()
    While 1 = 1
        Worksheets.Add
    Wend
End Sub

прекрасно работает "долгие годы".

Как мне кажется, вылет происходит по следующей причине. При копировании листа Эксель генерирует ему внутреннее и внешнее имена. С внешним все -понятно - "Болванка (2)" тут же переименовывается в "нормальное" имя - и дальше никаких проблем. А вот с внутренним возникает проблема. Я так понимаю, что сначала Эксель берет внутреннее имя копируемого листа и просто добавляет к нему единичку - Лист1 превращается в Лист11. При втором копировании Лист11 уже занят - пробуем Лист12 и т.д. То есть там организован цикл - перебирают имена вида Лист1n пока не встретят свободное. И эту переменную n ребята Билла Гейтса почему-то взяли типа byte. На 256 шаге получаем кирдык. Наверное, все примерно так...

К сожалению, внутренние имена нельзя менять программно, поэтому я вижу только такой способ обходить этот глюк - накопировать 250 листов - перенести их в другую книгу, накопировать еще 250 - потом перенести первые 250 обратно. Вроде бы при переносе листов механизм замены повторяющихся имен в Экселе другой.
267
02 апреля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Хотя нет - можно проще. Для каждых 250 нужных копий создаешь копию самого первого шаблона, а потом делаешь по 250 копий с этих промежуточных копий.
3.7K
02 апреля 2003 года
Андрей Несмеян
4 / / 31.03.2003
Цитата:
Originally posted by Cutty Sark



В твоем случае самый простой способ избежать этого - это воспользоваться-таки созданием нового диста и копированием на него ячеек. А чтобы твое форматирование копировалось целиком, замени твои строчки на вот эти:



Sheets("Болванка").Cells.Copy Destination:=Sheets(strN).Cells
Спасибо за подсказку, таперича все работает как положено. Позвоню своим в Новосиб, вразумлю.Может пиво стрясу.

Кстати, за мной не заржавеет.Чем смогу помогу

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог