電子書籍の厳選無料作品が豊富!

いつもお世話になります。

ユーザーフォームの下にラベルを置いて、ステータスバー的に使っています。
ちょっと時間が掛かる処理があることが分かったので、その間は「処理中・・・」的なメッセージを出すことにしました。

現在は以下のようなプログラムにしています。

Option Explicit

Private Sub CommandButton1_Click()
setColor1'<==Break?
setcolor2
Dim i As Long
For i = 2 To 10000
Cells(i, 5).Value = "wanwan"
Next i
setcolor3
End Sub
Sub setColor1()
With UserForm1.Label1
.Caption = "you push the button..."
.ForeColor = RGB(0, 255, 0)
End With
End Sub
Sub setcolor2()
With UserForm1.Label1
.Caption = "wait for a while..."
.ForeColor = RGB(255, 0, 0)
End With
End Sub
Sub setcolor3()
With UserForm1.Label1
.Caption = "Finished"
.ForeColor = RGB(0, 0, 0)
End With
End Sub

これを実行しても、Forループの間はLabel1のCaptionはフォームデザイン時のデフォルト値Beforeになったままで、Forループが終わるとsetcolor3によってセットされるFinishedになります。
setcolor1、setcolor2が表示する途中経過は見えません。

しかし、上のリストの Break? と書いているところにブレークポイントを置いて、ブレークしたらF8を連打してsetcolor1、setcolor2を手動実行するとメッセージは狙い通りに変わります。

Forループの中でワークシートに何らかの操作を行っている場合にのみ起こる現象で、Forループの中でwait文を書いて10秒待つとかやると、メッセージは狙い通りに変わります。

ワークシートを処理しながら、メッセージを狙い通りに変える方法はあるでしょうか。
何かわかりましたらよろしくお願いします。
なお、ユーザーフォームの画像を添えます。

「Q:Ecvel 2007 VBA: 長い」の質問画像

A 回答 (1件)

Userformの再描画を強制的にさせないといけません。


で、プロシージャsetcolor2のEndSubの前に、DoEventsを入れてやる

'-----------------------------------
Sub setcolor2()
 With UserForm1.Label1
  .Caption = "wait for a while..."
  .ForeColor = RGB(255, 0, 0)
 End With

 DoEvents  '●これを挿入

End Sub
'---------------------------------------

それから、プロシージャのsetColor1はこのままでは意味がないと思いますが。。。
 

 
    • good
    • 0
この回答へのお礼

ありがとうございます!
上のサンプルコードも、その元になった長い業務用のコードも、DoEventsでバッチリでした。

>プロシージャのsetColor1はこのままでは意味がないと思いますが。。。
一瞬しか出ないから、という意味ですね。
そうなんです。
業務用のより長いコードを短くしてここに載せる過程で、メッセージが3回出ることが何か影響していたらと思って上のように書きました。
ありがとうございます!

お礼日時:2009/03/18 13:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!