即効テクニック |
UserFormのコマンドボタンをクリックして、時間のかかる処理をしたとします。 次のコードは、コマンドボタンをクリックすると、セルA1の値を増加させます。 UserFormにCommandButton1を追加して、UserForm上で実行してください。Private Sub CommandButton1_Click() Dim i As Long For i = 1 To 10000 Range("A1") = Range("A1") + 1 Next i End Subこのマクロを[停止]ボタンをクリックすることで中断するには、[停止]ボタンがクリックされたことをFor..Nextの中で調べる必要があります。Private Sub CommandButton1_Click() Dim i As Long For i = 1 To 10000 Range("A1") = Range("A1") + 1 If [停止]ボタンがクリックされた Then For..Nextを抜ける End If Next i End Sub[停止]ボタンがクリックされたかどうかを調べるには、[停止]ボタンがクリックされたとき、広域変数に何かの値を入れ、For..Next内ではその広域変数の値を調べるようにします。 UserFormにもうひとつコマンドボタン(CommandButton2)を追加してください。 このCommandButton2がクリックされたときマクロを停止するには次のようにします。Dim StopFlag As Boolean Private Sub CommandButton1_Click() Dim i As Long For i = 1 To 10000 Range("A1") = Range("A1") + 1 If StopFlag = True Then If MsgBox("中断しますか?", vbQuestion + vbYesNo) = vbYes Then Exit For Else StopFlag = False End If End If Next i End Sub Private Sub CommandButton2_Click() StopFlag = True End Sub実行すると、思うように停止してくれません。 これは、For..Nextの実行中に、ユーザーがCommandButton2を操作できないからです。 For..Nextの実行中にユーザーが他のコントロールを操作できるようにするには、For..Next内でCPUを解放してやらなければなりません。それにはDoEventsを使います。Dim StopFlag As Boolean Private Sub CommandButton1_Click() Dim i As Long For i = 1 To 10000 Range("A1") = Range("A1") + 1 DoEvents If StopFlag = True Then If MsgBox("中断しますか?", vbQuestion + vbYesNo) = vbYes Then Exit For Else StopFlag = False End If End If Next i End Sub Private Sub CommandButton2_Click() StopFlag = True End Sub