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

时间:2009-10-15 22:28:30

标签: ms-access memory ms-access-2003

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

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

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

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

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

对于可能导致此问题的任何建议都非常受欢迎。

MTIA

7 个答案:

答案 0 :(得分:9)

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

  1. 在VBE选项中,关闭COMPILE ON DEMAND(有关原因的详细信息,请参阅Michael Kaplan's article on DECOMPILE。)

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

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

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

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

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

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

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

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

答案 1 :(得分:5)

跳过我这个老帖子,看到它有一点兴趣,我想也许会有更新?

2年后,我做了很多2007应用程序工作以及2003年(甚至是'97)应用程序,我发现2007年比2003年更容易发生真正令人讨厌的崩溃 - 其中Access对象的定义(形式和报告esp。)很容易被破坏。

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

现在,无论是97年,2003年还是2007年我都在努力,如果Access提供任何提示“很奇怪 | 崩溃 | 抛出莫名其妙的错误“等,我执行以下操作:

  1. 立即关闭Access应用
  2. 备份mdb / accdb文件
  3. 在按住[Shift]的同时重新打开应用程序,以便无法运行
  4. 使用Application.SaveAsText(作为另一个备份)
  5. 将所有对象导出为文本
  6. 使用/ decompile开关
  7. 关闭并重新打开应用程序
  8. 重新编译VBA代码
  9. 做一个小型/维修。
  10. 这并不能解决所有问题,但它确实可以从我能够观察到的内容中显着减少Access对象的损坏数量。

答案 2 :(得分:4)

哦,我的。

我在一家商店工作多年,使用Access作为他们的首选平台。该应用程序最终变得如此之大,以至于它开始触及Access 2003的内部内存限制。他们开始遇到与您遇到的完全相同的问题。正如您所注意到的,当发生这种情况时,没有内存问题的外部指示。

该公司与微软就此问题进行了长时间的讨论,我相信微软最终还是为他们提供了补丁。因此,如果听起来与您遇到的情况类似,您可能希望与Microsoft讨论此问题,因为他们可能能够为您提供相同的补丁。

最终,长期解决方案是将应用程序分解为更小的部分。迁移到Access 2007没有帮助;事实上,它使事情变得更糟,因为Access 2007有更多移动部件。

答案 3 :(得分:3)

快速解决方案;保证工作:

打开VBA(Alt-F11) 在即时窗口中输入以下内容:

Application.SaveAsText acForm, "corrupt form name here", CurrentProject.Path & "\zzTempRevive"

然后

Application.LoadFromText acForm, "corrupt form name here", CurrentProject.Path & "\zzTempRevive"

就是这样:)希望这有助于其他人!

答案 4 :(得分:1)

当Access不知道问题究竟是什么时,这也是默认的错误消息。现在,如果您的MDB特别大,那么说出800多个表单和带有模块的报告,是的,MDB可能太大了,尽管在您创建MDE时会给您一条消息。 ACC2000: "Microsoft Access Was Unable to Create an MDE Database" Error Message

我偶尔会发生这种情况。而我目前的MDB并不是那么大。请注意,压缩和修复不会检测除表,索引或关系之外的对象中的错误。因此,导入另一个MDB是纠正这些错误的唯一方法。

您是否通过网络处理此MDB?这是我能想到的唯一可能导致这个问题的事情。

答案 5 :(得分:1)

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

到目前为止,触摸木材,我有几天没有再发生过一次撞击,所以我可能会坚持使用这种恢复方法。

非常感谢大家的建议。

答案 6 :(得分:0)

我多次遇到过这个问题,最后找到了一个有效的解决方案。我不知道是什么导致了这个问题,但我知道如何解决它。

通常,当您打开表单时会发生错误。您需要做的是完全重新创建该表单。最简单的方法是首先使用未记录的函数Application.SaveAsText将表单导出到文本文件。然后从数据库中删除表单并使用Application.LoadFromText重新加载它。