如何等待Compact Repair - 访问VBA

时间:2013-04-21 15:00:26

标签: vba ms-access ms-access-2007 access-vba

在Access 2007中有一个VBA模块,它在For循环中执行类似的操作。 在每个循环结束时,我希望在继续下一次迭代之前压缩并修复当前数据库。

原因:在我创建的每个迭代中,用于计算和删除表。 尺寸应该保持在控制之下。

使用SendKeys,我无法压缩和修复 - 如果从表单按钮调用模块。 任何确保SendKey工作正常的技巧,并且模块可以完美地继续下一次迭代。一些想法来控制表格加载/模块执行/检查状态等。 结束目的是等待足够长的时间直到压缩完成然后继续。另外,如何安全地确保压缩的SendKeys /(建议替代)工作正常。

由于

4 个答案:

答案 0 :(得分:7)

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

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

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

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

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

答案 1 :(得分:2)

如果你做的那么紧凑&修复,然后我将DB分成前端和后端。你的所有桌子都在后端。无论如何,拆分数据库对于任何常规的Access程序员来说都是非常标准的。

然后,如果需要,使用Shell命令使用 / compact 开关打开后端DB。这将打开它,做一个紧凑的&修复,然后关闭它。

所以,你的代码将是这样的:

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

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

祝你好运

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

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

  • 在数据库的LocalSettings表(例如)中保存操作的状态(例如循环计数)。
  • 重新启动。
  • 使用autoexec宏启动完成工作的函数:它应该从LocalSettings表加载操作/循环计数并随身携带。

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