2013-04-21 52 views
2

在Access 2007中有一個VBA模塊,它在For循環中執行類似的操作。 在每個循環結束時,我希望在繼續下一次迭代之前對當前數據庫進行壓縮和修復。如何等待緊湊修復 - 訪問VBA

原因:在我創建的每個迭代中,用於計算並刪除一個表。 尺寸應保持控制。

使用SendKeys,我無法壓縮和修復 - 如果從Form按鈕調用模塊。 任何技巧,以確保SendKey工作正常,模塊繼續到下一次迭代完美無瑕。一些想法來控制表格加載/模塊執行/檢查狀態等。 最終目的是等待足夠長的時間直到壓縮完成,然後繼續。另外如何安全地確保SendKeys /(建議備用)壓縮工作正常。

感謝

+0

[MS Access:如何在VBA中壓縮當前數據庫]的可能重複(http://stackoverflow.com/questions/1460129/ms-access-how-to-compact-current-database-in-vba) – 2013-04-21 15:36:18

+1

另一個問題是類似的,它也涉及到壓縮。然而,這個問題在'For'循環中提出了緊湊的問題...多次壓縮當前數據庫,這意味着它必須在緊湊之前和之後保持循環的狀態。除了簡單的壓縮之外,這是一個更復雜的複雜程度。 – HansUp 2013-04-21 22:21:10

+0

由於某種原因,MS Access的大小保持不變 - 它聲明瞭一些它知道可以使用的磁盤空間。我不確定如果你的下一段代碼再次擴展它,那麼縮小的意義何在? – 2013-04-22 02:02:55

回答

7

「...在For循環中。在每個循環結束時,我希望在繼續下一次迭代之前壓縮和修復當前數據庫。」

考慮緊縮當前數據庫時實際發生的情況。 Access首先創建當前數據庫的壓縮版本,作爲新的 db文件。然後它刪除舊的db文件,將新文件重命名爲舊名稱,最後打開新的db文件。

所以如果你的代碼試圖通過For循環每個週期壓縮...當Access然後打開壓縮的db文件...它如何知道你想要它繼續在那For循環?

如果您真的想要這樣做,您將不得不存儲一個值以記錄For循環的最後一次迭代。然後創建一個autoexec宏以在數據庫打開時檢索該值,並在適當的週期輸入For循環。然後決定是否真的希望每次打開數據庫時都發生這種情況。

但是,這似乎是太多的努力,我。使用另一個db文件來保存易失性數據應該更簡單。然後從當前數據庫中的代碼中,您可以使用DBEngine.CompactDatabase壓縮外部數據庫文件。

2

如果你做那麼多的緊湊&修復,那麼我會分裂成數據庫前端和後端。所有的表格都將在後端。無論如何,拆分數據庫對於任何常規的Access程序員來說都是非常標準的。

然後,當您需要時,使用Shell命令打開後端數據庫,使用/compact開關。這將打開它,做一個緊湊的&修復,然後關閉它。

所以,你的代碼將是這樣的:

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

如果你需要等待它完成,然後使用WScript.Shell命令。

好運

+1

替代方案可能是'DBEngine.CompactDatabase「C:\ __ tmp \ tempDB.accdb」,「C:\ __ tmp \ newTempDB.accdb」,這將在當前Access實例中發生(並且將等待)。 – 2013-04-21 16:19:24

+0

尚未使用該方法。它可以壓縮到同一個數據庫中,還是需要一個新的數據庫? – 2013-04-21 20:41:33

+0

當使用'DBEngine.CompactDatabase'時,目標數據庫一定不存在,它堅持創建一個新的數據庫文件。 – 2013-04-21 21:17:45

2

你不能緊湊,並且在任何類型的循環修復當前的數據庫。您可以在循環中壓縮並修復外部數據庫,也可以關閉當前數據庫。

0

我已經回答了你的other question(這是相當相似的),但對於幫助別人的緣故,我已經出版了一本簡單實用的功能,可以幫助您重新啓動和緊湊當前數據庫:

爲確保您在重新啓動之後繼續適當迭代:

  • 保存統計您的數據庫中的LocalSettings表(例如)中的操作(例如循環計數)。
  • 重新啓動。
  • 使用一個autoexec宏來啓動您的工作的功能:它應該從LocalSettings表中加載操作/循環計數和隨身攜帶。

另一種解決方案是修改重啓功能以將自定義命令行參數傳遞給Access應用程序,您可以檢查應用程序何時重新啓動。
您可以輕鬆檢查命令行參數,請參閱VBA Command function