在Access 2007中有一个VBA模块,它在For循环中执行类似的操作。在每次循环结束时,我希望在进行下一次迭代之前压缩和修复当前数据库。
原因:在我创建的每个迭代中,使用进行计算和删除一个表。大小应保持在可控范围内。
使用SendKeys,我无法压缩和修复-如果从表单按钮调用模块。确保SendKey正常工作并且模块继续进行下一次迭代的任何技巧。控制表单加载/模块执行/检查状态等的一些想法。最终目的是等待足够长的时间,直到压缩完成,然后继续进行。另外,如何安全地确保SendKeys /(建议替代)用于压缩工作良好。
谢谢
发布于 2013-04-22 06:16:14
"...在For循环中。在每个循环结束时,我希望在继续下一次迭代之前压缩和修复当前数据库。“
考虑压缩当前数据库时实际发生的情况。Access首先将当前数据库的压缩版本创建为新的db文件。然后删除旧的数据库文件,将新文件重命名为旧名称,最后打开新的数据库文件。
因此,如果您的代码尝试通过For循环压缩每个循环...当Access随后打开压缩的db文件时...它怎么知道您想让它在For循环中继续呢?
如果你真的想做这样的事情,你将不得不存储一个值来记录For循环的最后一次迭代。然后创建一个autoexec宏,以便在数据库打开时检索该值,并在适当的周期进入For循环。然后决定您是否真的希望每次打开数据库时都发生这一切。
然而,对我来说,这似乎太费力了。使用另一个db文件来保存易失性数据应该更简单。然后,通过当前数据库中的代码,您可以使用DBEngine.CompactDatabase压缩外部db文件。
发布于 2013-04-22 00:08:11
如果您正在进行如此多的压缩和修复,那么我会将DB拆分为前端和后端。所有的表都将放在后端。拆分DB对于任何常规的Access程序员来说都是相当标准的。
然后,在需要时,使用外壳命令通过/compact开关打开后端数据库。这将打开它,执行压缩和修复,然后关闭它。
因此,您的代码将如下所示:
Ret = Shell("C:\Program Files\Microsoft Office\Office12\MSACCESS.EXE /compact c:\MyFolder\MyDB.accdb")如果需要等待它完成,请改用WScript.Shell命令。
祝好运
发布于 2013-04-22 02:02:31
您不能在任何类型的循环中压缩和修复当前数据库。您可以在循环中压缩和修复外部数据库,也可以在关闭时压缩当前数据库。
https://stackoverflow.com/questions/16132519
复制相似问题