3

テーブルをループする VBA スクリプトがありますが、コードの実行中に 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

モーダル フォームに「メモリ」を割り当てて、Access がフリーズした場合でもこれを維持することはできますか? コードは少し複雑ですが、Do Until (EOF) と If ステートメント (非常に基本的な VBA 関数) だけです。この進行状況バーを機能させる方法について何か考えはありますか? モーダル ダイアログの有無にかかわらず。

ステータス バーの編集を検討しましたが、Access がフリーズすると機能しません。

4

2 に答える 2

4

必要なのはDoEvents声明です。

これが行うことは、CPU キュー内の他のアイテムを実行させることです。これによりアプリの速度が低下しますが、アプリケーションを制御できるようになります。

コマンドをループの 1 つに入れます。

ところで、DoEvents を乱用するのは簡単です。このSO 投稿で詳しく説明します。

于 2013-05-15T06:25:53.187 に答える
1

DoEvents、トムが述べたように、Windowsにディスプレイを更新する機会を与えることは役立つはずです。DoEvents50K 行ごとに呼び出さないようにして、パフォーマンスへの影響を制限します。代わりに、妥当な間隔 (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
于 2013-05-15T16:14:08.287 に答える