Уважаемые знатоки, месяц я работал над очень сложным и объёмным файлом с очень сложными формулами привязанными к примерно 50-ти умным таблицам на разных листах. Основная таблица так же "умная" и имеет размер порядка 100 столбцов на 15000 строк, где в каждой ячейке очень сложная формула.
И вот работал я над табличкой 300кб... и решил протянуть формулы на 15000 строк вниз (в этом и есть вся задумка файла изначально). Нажал сохранить и закрыл (файл получился размером 85мб... в последующем когда буду внесены все данные он будет весить порядка 150мб)
И теперь не могу его открыть - вообще никак. Пишет что недостаточно ресурса памяти - пытался открыть на 5 разных компьютерах - в том числе и с ССД и 16гб озу.
Как его открыть? Спасите кто-нибудь... Возможно причина именно в огромной умной таблице, из-за которой файл стал так много весить. Хочу открыть и перевести умную таблицу в обычную... но как открыть???
Я сам не понимаю почему он такой большой получился - 100% из-за умной таблицы. Т.к. у меня есть файл где данных в 4 раза больше, и файл весит 45мб. Собственно этот "новый" файлик и создавался, для того, чтобы уменьшить размер файла... а в итоге он ещё и в 2 раза больше весить стал...
Странно это, если 64 да при таких объёмах ОЗУ. Попробуйте, вдруг макрос поможет
Код
Public Sub OpenBook()
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Workbooks.Open "d:\path\filename.xlsx", False, True, CorruptLoad:=xlNormalLoad
End Sub
Естественно, поменяйте путь и имя файла на свой. Поиграйтесь с вариантами CorruptLoad P. S. Если файл откроется и получится его вернуть в исходное состояние, то не забудьте потом включить события Application.EnableEvents = True и автовычисления Application.Calculation = xlCalculationAutomatic.
Я очень не дружу с макросами... Да и смысл именно в том, что я не могу открыть файл... вообще... он просто на середине загрузки выдаёт ошибку с недостатком ресурсов и всё...
как в #7 - макрос можете прописать в др. (новой) книге - для открытия файла из указанного пути p.s. цитату из предыдущего поста сократите или уберите (пока не пришли модераторы и не закрыли тему ввиду неисполнения Правил форума)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Андрей VG написал: не забудьте потом включить события Application.EnableEvents = True и автовычисления Application.Calculation = xlCalculationAutomatic
только один вопрос: когда мы это всё потом включаем (например, макросом или ручками) - делает ли xl авто-пересчёт в окончании работы макроса или, если ручками, сразу в момент выставления нужной галки?..
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
JeyCi написал: делает ли xl авто-пересчёт в окончании работы макроса или, если ручками, сразу в момент выставления нужной галки?..
По идее не должен. Файл уже открыт, событие обновления/вычисления по факту открытия книги было пропущено. Мы просто меняем состояние режима вычислений. Но это мои догадки - надо бы как-то проверить.
По вычислениям: автоматически режим не возвращается в исходное состояние(автопересчет) после окончания макроса. Этот параметр автоматически меняется только в одном случае: если в текущем сеансе установлен автопересчет формул и мы открываем файл, для которого был перед сохранением установлен ручной режим. В этом случае непременно будет отключен автопересчет для всех открытых книг, т.к. параметр этот распространяется на приложение полностью, но хранится отдельно для каждой книги. Если же изначально установлен пересчет ручной и после этого была открыта книга с автопересчетом - то произойдет действие ровно до наоборот - книге с автопересчетом будет установлен ручной режим пересчета формул.
Связано это с тем, что ручной режим предназначен для экономии ресурсов и времени в случаях, когда формул много или они тяжелые и пересчитывать их каждый раз нет необходимости. И если такой файл будет открыт и для него включится без ведома автопересчет - есть шанс уйти в нирвану. Поэтому настройка ручного пересчета имеет приоритет и всегда выставляется автоматом, а автопересчет - нет.
Цитата
JeyCi написал: если ручками, сразу в момент выставления нужной галки?
в этом случае будет произведен немедленный пересчет всех формул во всех книгах при условии, что в книге зафиксировано изменение каких-либо значений после открытия файла или есть летучие формулы.
Изменено: The_Prist - 13.05.2016 11:51:24(исправлены мелкие опечатки)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
ой, туплю сегодня по страшному (то ли жизнь такая, то ли, действительно, торможу, вместе с моим файлом)... вобщем, по факту (можно сказать проверки): макросом перед закрытием выставляю xlManual, соответственно, открывается потом быстрее обычного, в файле есть куча макросов для работы, которые всё равно прогоняются для подгрузки новой инфо для работы далее... поэтому макросы всё-равно включат (там прописано) xlAutomatic... поэтому возник вопрос: то ли всё немного подвисает (пока прогоняются все макросы) (?) из-за того, что макрос включает пересчёт и xl пересчитывает сразу на месте (проверить долго, макросов много друг за другом автоматом - долго вспоминать что где) или всё-таки в самих макросах дело... просто есть 1 лист с множеством формул массива...и если открывать с ручным пересчётом - открывается нормально... а если потом руками ставить пересчёт на авто - то тоже зависает немного (задумывается, пока не пересчитает этот лист - выявлено, что проблема именно с этим листом)... вот и думаю, зависание в работе макросов может не связано с макросами, а с включением в конце xlAutomatic?.. знает ли кто-нибудь однозначно? (просто ещё столько всего ковырять для оптимизации )
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
ну как можно однозначно что-то сказать по конкретному файлу и коду, не видя его?
Проверить легко: закомментируйте все строки в макросе, отвечающие за включение автопересчета. Если скорость вернется - дело только в формулах. Если нет - значит код медленный. Вот и всех делов.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
засекала секунды на часах на стене ~ 27 секунд открывался файл с пересчётом "авто"... и если открыть с пересчётом ручным и выбрать руками авто (галку) ~27 сек зависание тоже (пока не пересчитается этот лист) p.s. может и макросы так страдают пока работают?.. просто не хочется лезть проверять их все на включение xlManual-xlAutomatic (модулей достаточно - друг за другом)... если кто-нибудь знает и так (как у них там с пересчётом - пересчитывают ли сразу после строки xlAutomatic)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
JeyCi написал: если ручками, сразу в момент выставления нужной галки?
в этом случае будет произведен немедленный пересчет всех формул во всех книгах при условии, что в книге зафиксировано изменение каких-либо значений после открытия файла или есть летучие формулы.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
The_Prist написал: при условии, что в книге зафиксировано изменение каких-либо значений после открытия файла
вот это не понятно... макрос(ы) в начале отключает(ют) всё, потом включает(ют) всё... и гонятся друг за другом (отключение-включение в каждом)... в моменты окончания каждого макроса - они фиксируют изменения?? (которые для них становятся тригером на пересчёт)... т.е. промежуточно между ними (всеми) возникает пересчёт этого сумасшедствия?
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Изменения фиксируют НЕ МАКРОСЫ, а Excel. Если Вы макросом или вручную внесли хоть какое-то изменение на листах(да даже просто нажали F2-Enter) в промежутке между отключением автопересчета и включением - то включение автопересчета спровоцирует пересчет всех формул для тех книг, где были зафиксированы изменения.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
я предлагал не на стене, а в окне отладки Т.е. выводите значение таймера до включения пересчёта и после. Как вариант - посчитать разницу и показать месиджбокс.
The_Prist написал: то включение автопересчета спровоцирует пересчет всех формул для тех книг, где были зафиксированы изменения.
спасибо, пошла думать, что происходит при выходе из одного макроса (где отключение - в конце включение) в другой (где ТОЖЕ отключение - в конце включение) ? P.S.
Цитата
Hugo написал: я предлагал не на стене, а в окне...
Hugo - это уже на макросах... а на стене - даже без них на открытие и пересчёт... про взаимопереплетение модулей и макросов написала - надеялась, что не придётся лезть в эти дебри (хоть с таймером, хоть без) - когда милисекунды не помогут (а только десятки секунд) но всё равно сделала, на всякий случай, - спасибо Hugo
Код
Dim timet
timet = Timer
With Application: .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: .Calculation = xlManual: End With
'..................
With Application: .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: End With '.Calculation = xlAutomatic:
MsgBox Timer - timet & " сек." & vbNewLine & vbNewLine & " done.", 64, "MACROS done"
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
JeyCi написал: при выходе из одного макроса (где отключение - в конце включение) в другой (где ТОЖЕ отключение - в конце включение) ?
Получается, чсто пересчёт будет происходить многократно. Тогда лучше в первом (или в главном, который запускает все остальные) макросе выключить, а в последнем включить )) Ведь они у Вас выполнятся последовательно?
Юрий М написал: Ведь они у Вас выполнятся последовательно?
иногда с выходом друг в дружку через Call... вот пытаюсь (сделала - в 2 раза ускорилось - завтра проверю - спасибо, The_Prist)
Цитата
The_Prist написал: легко: закомментируйте все строки в макросе, отвечающие за включение автопересчета. Если скорость вернется - дело только в формулах.
- но иногда пересчёт формул приходится включать, чтобы макросы далее работали с обновлёнными данными... да и макросы некоторые через ADO и что-то тянется из net'а (зависимость от скорости трафика, предоставляемой провайдером + наверно, от самого сайта)... и книга потом переименовывается программно и рвутся все связи и настраиваются на книгу саму себя... - тоже время (на создание подключений)... вот и думаю, за счёт чего можно увеличить скорость и убрать какие тормоза... (просто долго будет все формулы массивные переводить в макросы, да и макросов уже много... Вобщем, пока по результатам попыток - вероятно дело не в макросах, ничего сильно не меняется (наверно, особо негде убрать лишний пересчёт - есть только нужные)... поэтому останусь при мыслях о 2х вариантах, оставшихся, по оптимизации: а) найти способ не менять название файла, а историю собирать др путём (просто разрывая связи и сохраняя под именем даты б) сделать промежуточную таблицу (уже сокращённую выборку по нужным критериям), а массивные формулы, чтобы тянули из неё, а не из общей базы (бОльшей по размерам) - просто критерии на отбор запихивала в массивные формулы + др. вычисления... но по этим критериям, видимо, лучше изначально настроить query - для отбора... а уже потом по отобранному - формулы массива для расчётов... наверно, и открываться начнёт не ~27 секунд буду пробовать... спасибо большое за идеи
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
kalbasiatka написал: 64 бита не windows, а office должен быть
Добрый день! Если более точно, то и то и другое должно быть 64-битным, так как для установки MS Office 64-bit требуется 64-битная операционная система.
А для счастливых обладателей 32-bit Excel 2016 в O365 build 16.0.6868.2060 (обновление от 3 Мая 2016г.для Office 365 for Windows) есть приятная новость от Microsoft: 1. При Windows 32 bit теперь Excel 32-bit поддерживается не 2, а 3 ГБайта памяти. 2. При Windows 64 bit и при Excel 32-bit поддерживается уже 4 ГБайта памяти. Приятно еще и то, что аналогичное расширение памяти произошло и в VBA
JeyCi написал: но иногда пересчёт формул приходится включать, чтобы макросы далее работали с обновлёнными данными
Если есть возможность и знаете где надо пересчитать формулы, то можно принудительно кодом пересчитывать либо только нужные листы нужных книг, либо вообще только отдельные диапазоны:
Код
'пересчитываем весь лист книги book1.xls
Workbooks("book1.xls").Sheets(1).Calculate
'пересчитываем только диапазон А1:А20 на листе 1 книги book1.xls
Workbooks("book1.xls").Sheets(1).Range("A1:A20").Calculate
это будет быстрее в случае, если пересчитывать надо не все открытые книги, а только отдельные из них(либо отдельные диапазоны).
The_Prist. спасибо большое, так и сделала (там небольшие диапазоны пересчитать надо было по ходу работы макросов, остальное можно в конце один раз)... [просто свет отключали - голова кругом, что успела сохранить, что нет] - вроде восстановила, что смогла до вчерашнего вида - уже быстрее (как провела ревизию пересчётов)... осталось провести ревизию формул (или подхода, как 2 из #25)... день убит потерей света
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)