2013-05-15 38 views
1

我有一個VBA腳本,通過表環,雖然它運行的代碼訪問凍結它的工作原理,只是罰款。代碼運行後,它解凍並顯示所有內容(vba執行了所需的操作,它打開了一個最終查詢,如編碼等)。的MS Access凍結,同時運行VBA,然後解凍一次吃完

直到現在,這是很好的,因爲我已經實現(或想要實現)VBA腳本的「進度狀態」功能。這是因爲由於新的要求,所分析的表格從大約4,000個記錄跳到大約50,000個記錄。

我用每條記錄後刷新一個簡單的模式對話框的形式做到了這一點。

模式對話框最初打開:

DoCmd.OpenForm ("ProgressReport") 
Forms("ProgressReport").Controls("ProgressLabel").Caption = "0 of " & RecordCount & " records analyzed." 

然後每次迭代後:

RecordsAnalyzed = RecordsAnalyzed + 1 
Forms("ProgressReport").Controls("ProgressLabel").Caption = RecordsAnalyzed & " of " & RecordCount & " records analyzed." 
Forms("ProgressReport").Repaint 

是否有可能分配給模態形式「記憶」所以即使訪問凍結,這是保持活力?代碼稍微複雜一點,但它只是直到(EOF)和If語句 - 非常基本的VBA函數。關於如何讓這個進度條工作的任何想法?沒有或沒有模態對話框。

我看着但是編輯狀態欄,這是行不通的任何給定的接入凍結。

回答

2

你需要的是DoEvents聲明。

這樣做是讓CPU隊列中的其他項目運行。這會減慢你的應用程序,但你會控制你的應用程序。

將命令放入一個循環中。

順便說一下,很容易過度使用DoEvents。這SO post會告訴你更多。

1

DoEvents,給Windows中的機會,更新顯示應該是有用的,因爲湯姆提及。對於每個50K行,請不要致電DoEvents以限制性能影響。相反,請選擇一些合理的時間間隔,比如每隔100行,然後更新該時間間隔的進度。

考慮適應此骨架代碼中概述的策略。我只是用Debug.Print來顯示進度。

Public Sub ShowProgress() 
    Const lngInterval As Long = 100 
    Dim RecordsAnalyzed As Long 
    For RecordsAnalyzed = 1 To 500 
     If RecordsAnalyzed Mod lngInterval = 0 Then 
      ' update progess here ... 
      Debug.Print RecordsAnalyzed & " records analyzed" 
      DoEvents 
     End If 
    Next 
End Sub 
+0

很好的回答。昨晚我太累了,以提供更多細節。 –