MS Access: недостаточно памяти для выполнения этой операции
Я использую Access 2003 на двухъядерной машине с 4 ГБ ОЗУ под управлением Windows XP (пакет обновления 3) [5.1.2600]
периодически я получаю сообщения об ошибке "недостаточно памяти для выполнения этой операции. Закройте ненужные программы и повторите операцию."
проверить Диспетчер задач показывает, что есть много свободной памяти. Закрытие других открытых программ не имеет значения.
это происходит спорадически и при разных обстоятельствах: иногда при сохранении дизайна формы или изменения кода VBA, иногда, когда несколько форм открыты и используются.
при попытке сохранить изменения дизайна, и эта ошибка возникает, объекты доступа повреждены и не могут быть восстановлены.
любые предложения о том, что может быть причиной этого, будут очень приветствоваться.
приводе mtia
7 ответов
проект VBA в вашем интерфейсе, вероятно, поврежден. Вам нужно перестроить его с нуля, а затем использовать правильные методы кодирования доступа:
в параметрах VBE отключите компиляцию по требованию (см. статья Майкла Каплана о декомпиляции подробности почему).
в параметрах VBE включите требование объявления переменной.
в VBE настройте панель инструментов так, чтобы кнопка компиляции была легко доступный (он находится в меню Debug). Я также рекомендую добавить кнопку стека вызовов (из меню Вид), так как это удобно для отладки ошибок в режиме перерыва. Дело в том, чтобы сделать отладку и компиляцию как можно проще.
настроив свою среду, пройдите все модули в вашем недавно восстановленном проекте и добавьте опцию EXPLICIT в верхнюю часть каждого модуля, которому ее не хватает. Затем компилировать. Вы быстро узнаете, где у вас есть недопустимый код, и вам понадобится исправить это.
отныне при программировании компилируйте часто, через каждые две-три строки кода. Я, вероятно, компилирую свой проект 100 или более раз в день при кодировании.
периодически декомпилируйте свой проект и компактируйте и перекомпилируйте его. Это очистит любой crud, который накапливается во время регулярного развития.
эти методы гарантируют, что код в неповрежденном проекте остается в чистом состоянии по возможности. Он ничего не сделает для восстановления уже поврежденного проекта.
Что касается того, как перестроить проект, я думаю, что я бы пошел по радикальному пути экспорта всех объектов с приложением.SaveAsText и импорт их в новую пустую базу данных с приложением.LoadFromText. Это превосходит простой импорт из существующего поврежденного интерфейса, поскольку импорт может импортировать поврежденные структуры, которые не переживут цикл SaveAsText/LoadFromText.
I программа ежедневно в доступе, работает с нетривиальными приложениями, которые используют много кода, включая множество автономных модулей класса. Я не потерял объект для коррупции кода более 5 лет, и это было еще в тот день, когда я все еще использовал A97.
наткнувшись на этот мой старый пост, и видя, что у него был изрядный интерес, я подумал, что, может быть, обновление будет в порядке?
Итак, 2 года вниз по дорожке, делая много работы приложения 2007 года, а также более старые приложения 2003 (и даже '97), я нахожу, что 2007 менее подвержен действительно неприятным сбоям, чем 2003 - где определения объектов доступа (формы и отчеты esp.) будет легко поврежден.
Я по-прежнему следую предложениям 1-6 (выше) Дэвида-W-Fenton религиозно, хотя, плюс использование приложения.SaveAsText (см. предложение Тони Toews и ссылку выше).
в эти дни, будь то 97, 2003 или 2007 я работаю, если доступ дает любой намек на "странный | авария | бросая непонятные ошибки" etc, я делаю следующее:
- сразу закрыть приложение Access
- резервное копирование файла mdb / accdb
- откройте приложение удерживая [Shift] , так что ничего не работает
- экспорт всех объектов в виде текста с помощью приложения.SaveAsText (как еще одна резервная копия)
- закройте и снова откройте приложение с помощью переключателя / decompile
- перекомпилировать код VBA
- сделайте компакт / ремонт.
Это не решает все, но это значительно уменьшает количество искажений объектов доступа от того, что я могу наблюдать.
О мой.
Я работала в магазине много лет, что б доступ к их платформе. Приложение в конечном итоге стало настолько большим, что оно начало поражать внутреннее ограничение памяти Access 2003. Они начали испытывать ту же самую проблему, что и вы. Как вы заметили, нет никаких внешних признаков проблем с памятью, когда это произойдет.
компания долго говорила с Microsoft о проблеме, и я считаю, что Microsoft в конце концов снабдил их заплаткой. Таким образом, вы можете поговорить с Microsoft об этом, если это звучит как аналогичная ситуация с тем, что вы испытываете, поскольку они могут предоставить вам тот же патч.
в конечном счете долгосрочное решение состоит в том, чтобы разбить приложение на более мелкие части. Переход на Access 2007 не помог; на самом деле, это ухудшило ситуацию, потому что Access 2007 имеет больше движущихся частей.
быстрое решение; гарантированный для работы:
открыть VBA (Alt-F11
)
В окне непосредственно введите следующее:
Application.SaveAsText acForm, "corrupt form name here", CurrentProject.Path & "\zzTempRevive"
затем
Application.LoadFromText acForm, "corrupt form name here", CurrentProject.Path & "\zzTempRevive"
вот и все :) надеюсь, это поможет другим!
Это также сообщение об ошибке по умолчанию, когда Access не имеет понятия, в чем проблема на самом деле. Теперь, если ваш MDB особенно велик, скажем, более 800 форм и отчетов с модулями, да, MDB может быть слишком большим, хотя это дало вам сообщение, когда вы пошли создавать MDEs. ACC2000:" Microsoft Access не удалось создать базу данных MDE " сообщение об ошибке
У меня это иногда случалось. И мои нынешние МБР не настолько велики. Обратите внимание, что compact и repair не обнаруживает ошибок в объектах, отличных от таблиц, индексов или связей. Поэтому импорт в другой MDB-единственный способ исправить эти ошибки.
вы работаете над этим MDB по сети? Это единственное, что я могу придумать, что может вызвать эту проблему.
поскольку я знаю, что это либо формы, либо отчеты, которые, скорее всего, будут повреждены, я создал новый mdb, и только импортированные таблицы (прикрепленные), запросы, скрипты (только один), модули и меню. Затем я использовал LoadFromText для импорта форм и отчетов через функцию, а затем сделал обычную декомпиляцию/компиляцию и компакт/ремонт и т. д.
до сих пор, прикоснитесь к дереву, у меня не было другой аварии в течение нескольких дней, поэтому я, вероятно, буду придерживаться этого метода восстановления.
большое спасибо всем за свои предложения.
Я сталкивался с этой проблемой много раз и, наконец, нашел решение, которое сработало. Я не знаю, что вызывает проблему, но я знаю, как ее решить.
обычно эта ошибка возникает при открытии формы. Что вам нужно сделать, это полностью воссоздать эту форму. Самый простой способ сделать это-сначала экспортировать форму в текстовый файл с помощью приложения недокументированной функции.SaveAsText. Затем вы удаляете форму из своей базы данных и повторно загружаете ее Приложение.LoadFromText.