即効テクニック

ユーザーフォーム関連のテクニック

[停止]ボタンでマクロを停止する

(Excel 97/2000/2002/2003/2007)
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