2

Have a VBA Module in Access 2007 which performs similar actions in a For loop. At the end of every loop I wish to compact and repair the current database before proceeding to the next iteration.

Reason : In every iteration I create , use for calculation and delete a table. The size should remain under control.

Using SendKeys , I cannot compact and repair - if calling the module from a Form Button. Any trick to ensure that the SendKey works fine and the Module continues onto the next iteration flawlessly. Some idea to control Form loading / Module execution / Checking Status etc. End Purpose being to wait just long enough till the Compacting is done and then move on. Also how to safely ensure that SendKeys / (suggest alternate) for compacting works fine.

Thanks

4

4 回答 4

7

“......在一个 For 循环中。在每个循环结束时,我希望在进行下一次迭代之前压缩并修复当前数据库。”

考虑压缩当前数据库时实际发生的情况。Access 首先将当前数据库的压缩版本创建为的db 文件。然后它删除旧的 db 文件,将新文件重命名为旧名称,最后打开新的 db 文件。

因此,如果您的代码尝试通过一个循环压缩每个循环For......当 Access 然后打开压缩的 db 文件......它怎么知道你希望它在那个For循环中继续?

如果你真的想做这样的事情,你必须存储一个值来记录For循环的最后一次迭代。然后创建一个autoexec宏以在数据库打开时检索该值,并For在适当的周期进入循环。然后决定您是否真的希望每次打开数据库时都发生这一切。

然而,这对我来说似乎太过分了。使用另一个 db 文件来保存易失性数据应该更简单。然后从当前数据库中的代码中,您可以使用DBEngine.CompactDatabase压缩外部 db 文件。

于 2013-04-21T22:16:13.803 回答
2

如果您正在做那么多紧凑和修复,那么我会将数据库拆分为前端和后端。您的所有表格都将位于后端。无论如何,拆分数据库对于任何常规 Access 程序员来说都是相当标准的。

然后,当您需要时,使用 Shell 命令使用/compact开关打开后端数据库。这将打开它,进行压缩和修复,然后将其关闭。

因此,您的代码将是这样的:

Ret = Shell("C:\Program Files\Microsoft Office\Office12\MSACCESS.EXE /compact c:\MyFolder\MyDB.accdb")

如果您需要等待它完成,请改用WScript.Shell命令。

祝你好运

于 2013-04-21T16:08:10.927 回答
2

您不能在任何类型的循环中压缩和修复当前数据库。 您可以在循环中压缩和修复外部数据库,也可以在关闭时压缩当前数据库。

于 2013-04-21T18:02:31.087 回答
0

我已经回答了您的另一个问题(非常相似),但是为了帮助其他人,我发布了一个简单的实用程序函数,可以帮助您重新启动和压缩当前数据库:

为确保您在重新启动后继续正确的迭代:

  • 将您的操作状态(例如循环计数)保存在LocalSettings数据库中的表(例如)中。
  • 重新开始。
  • 使用autoexec宏来启动执行您工作的函数:它应该从LocalSettings表中加载操作/循环计数并继续执行。

另一种解决方案是修改重新启动函数,将自定义命令行参数传递给 Access 应用程序,您可以在应用程序重新启动时检查该参数。
您可以轻松检查命令行参数,请参阅 VBA命令函数

于 2013-04-22T08:16:30.587 回答