2012-03-20 5 views
1

上で「ステータスフォーム」ロックを更新しますこれにはしばらく時間がかかりますので、現在何をしているのかを示すステータスウィンドウを作ることにしました。私は単に問題は、それがビット(5-15秒)ウィンドウと展望ロックの残りのために実行した後ということである。このは絶えずこれには、私と一緒に</p> <p>を負担してください、私はフォルダにさまざまなことを行い、基本的なマクロを作成したOutlookのVBAを使って、私の最初の時間です。時間

Function UpdateStatus(Message As String) 
    StatusForm.StatusUpdate.Caption = Message 
    StatusForm.Repaint 
End Function 

と、ラベルの値のいずれかを設定しておきます。フォームはもはや更新されず、ウインドウタイトルに「(Not Responding)」が表示されます。

私は何とかUIスレッドをデッドロックしているような気がしますが、私はそれを回避する方法を失っています。驚くことではないが、それを更新することはできませんが、私はどこに見えるのか分かりません。

何か提案がありますか?

+0

は、ブレークポイントを設定し、デバッグモードで実行しようとしたことがありますか? –

+0

@ Jean-FrançoisCorbett私はそれについて考えましたが、最初の50%で動作していたので、デバッグがどのように役立つのか分かりません。 – TheLQ

+0

これについて考えてみると、おそらくそれは役に立つかもしれません。それは私がボトルにメッセージを入れる前にやっていることです...あなたはCtrl-Breakで実行を破ることができますか? –

答えて

4

計算集約型のループにDoEventsを追加してみてください。こうすることでUIスレッドへの実行コードが生成され、バックグラウンドで計算量の多いものが実行されたときに他のことができるようになります。 Officeはシングルスレッドなので、マクロを実行しているときにUIをブロックできます。

サンプル:

Sub LockUI() 
    Dim x 
    x = Timer 
    Do While Timer - x < 5 
     'Blocks the UI for 5 seconds 
    Loop 
End Sub 

Sub LockUI2() 
    Dim x 
    x = Timer 
    Do While Timer - x < 5 
     'Doesn't block the UI 
     DoEvents 
    Loop 
End Sub 
+0

恐ろしい、DoEventsはそれを修正しました!しかし、将来の参照のために、DoEventsはいくつかのグローバルメソッドをFormsライブラリの一部ですか? – TheLQ

+0

これはVBA.Interactionモジュールの一部で、すべてのOfficeアプリで使用できます。 Visual Basicエディタでは、[表示] - > [オブジェクトブラウザ]に移動して、 "DoEvents"を検索して検索することができます。 – transistor1