在Access 2007中有一个VBA模块,它在For循环中执行类似的操作。 在每个循环结束时,我希望在继续下一次迭代之前压缩并修复当前数据库。
原因:在我创建的每个迭代中,用于计算和删除表。 尺寸应该保持在控制之下。
使用SendKeys,我无法压缩和修复 - 如果从表单按钮调用模块。 任何确保SendKey工作正常的技巧,并且模块可以完美地继续下一次迭代。一些想法来控制表格加载/模块执行/检查状态等。 结束目的是等待足够长的时间直到压缩完成然后继续。另外,如何安全地确保压缩的SendKeys /(建议替代)工作正常。
由于
答案 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。