MS Access:没有足够的内存来执行此操作

max*_*gen 10 memory ms-access ms-access-2003

我在具有4GB RAM的双核机器上使用Access 2003,运行Windows XP(Service Pack 3)[5.1.2600]

我定期收到错误消息"没有足够的内存来执行此操作.关闭不需要的程序并再次尝试操作."

检查任务管理器表示有足够的​​可用内存.关闭其他开放的程序没有任何区别.

这种情况偶尔发生,并且在不同的情况下:有时在保存表单设计或VBA代码更改时,有时在多个表单打开和使用时.

如果尝试保存设计更改,并且发生此错误,则Access对象已损坏且无法恢复.

任何可能导致这种情况的建议都会受到欢迎.

MTIA

Dav*_*ton 9

前端的VBA项目可能已损坏.您需要从头开始重建它,然后使用适当的Access编码实践:

  1. 在VBE选项中,关闭COMPILE ON DEMAND(有关原因的详细信息,请参阅Michael Kaplan关于DECOMPILE的文章).

  2. 在VBE选项中,启用REQUIRE VARIABLE DECLARATION.

  3. 在VBE中,自定义工具栏,以便可以轻松访问COMPILE按钮(它位于"调试"菜单上).我还建议添加CALL STACK按钮(来自VIEW菜单),因为它可以在中断模式下调试错误.这里的要点是尽可能简化调试和编译.

  4. 设置环境后,浏览新恢复项目中的所有模块,并将OPTION EXPLICIT添加到缺少它的每个模块的顶部.然后编译.您将很快找到无效代码的位置,您需要修复它.

  5. 从现在开始,编程时,经常编译,每隔两三行代码.我可能在编码时每天编译我的项目100次或更多次.

  6. 定期反编译您的项目并压缩并重新编译它.这将清除在常规开发过程中累积的任何碎屑.

这些实践确保非腐败项目中的代码尽可能保持干净.它无法恢复已经损坏的项目.

关于如何重建项目,我想我会采用Application.SaveAsText导出所有对象并使用Application.LoadFromText将它们导入新的空白数据库.这比简单地从现有的损坏前端导入要好,因为导入可以导入无法在SaveAsText/LoadFromText循环中生存的损坏结构.

我每天在Access中编程,使用大量代码的非平凡应用程序,包括大量独立的类模块.我在5年多的时间里没有丢失一个编码损坏的对象,那是在我还在使用A97的那一天.


max*_*gen 5

翻阅了我的这个旧帖子,看到它引起了很大的兴趣之后,我想也许有必要进行更新吗?

因此,两年过去了,做了很多2007年的应用程序工作以及较旧的2003年(甚至是'97年)应用程序,我发现与2003年相比,2007年不太容易发生真正的崩溃-在那儿,Access对象定义(窗体和报告尤其是)。

我仍然忠实地遵循David-W-Fenton的建议1-6(上文),以及使用Application.SaveAsText(请参见上面Tony Toews的建议和链接)。

这些天,无论是97、2003还是2007,我都在努力,如果Access提供任何奇怪的信息 | 崩溃 | 抛出无法解释的错误 ”之类的提示,我将执行以下操作:

  1. 立即关闭Access应用
  2. 备份mdb / accdb文件
  3. 在按住[Shift]的同时重新打开应用程序,因此没有任何运行
  4. 使用Application.SaveAsText将所有对象导出为文本(作为另一个备份)
  5. 使用/ decompile开关关闭并重新打开应用程序
  6. 重新编译VBA代码
  7. 进行压缩/修复。

这并不能解决所有问题,但是确实可以减少我观察到的Access对象损坏的次数。


max*_*gen 1

据我所知,表单或报告最有可能被损坏,我创建了一个新的 mdb,并且仅导入表(附加)、查询、脚本(仅一个)、模块和菜单。然后我使用 LoadFromText 通过函数导入表单和报告,然后进行通常的反编译/编译和压缩/修复等。

到目前为止,我已经好几天没有再发生过崩溃了,所以我可能会坚持使用这种恢复方法。

非常感谢大家的建议。