【VBA】処理の途中で一時停止して、ボタンで再開する

スポンサーリンク
excelvba VBA
スポンサーリンク

VBAの処理で途中で一旦停止して、シートの処理を確認したいときは無いでしょうか。

また、ループ処理で一回ずつ止めてシートを確認する(途中で強制的に止めたい)などの実装は可能でしょうか。

答えは可能です!

ネット上の情報では出来るわけがないぐらいで書かれていたのですが、色々と考えてユーザーフォームを使うことによって実装が出来ないか考えてみました。

activexボタンなどからの処理だと拡張性が持たせにくいので、ユーザーフォームでタイムリーに操作をすることにします。

それでは早速ソースを見ていきましょう。

前提としてユーザーフォームで「開始」「再開」ボタンを配置しましょう。

処理的には3つの処理があって、その間にフラグ判定をしてループで処理を止めておいて、フォームのボタンからフラグを書き換えてループを抜けることによって処理を再開するというものです。

ここでのソースは上から下への単一処理ですが、ループ内で使用することによって多くの処理の中で一時停止をすることも可能です。

Public StopFlag As Boolean '停止するかのフラグ。グローバル変数で設定
'-----------------------------------------
Private Sub UserForm_Initialize()
'開始時の処理
ThisWorkbook.Worksheets("sheet1").Cells.Clear 'シートをクリア
With Me.Controls("CommandButton2") '再生ボタンを選択できないようにする
.Enabled = False
End With
End Sub
'-----------------------------------------
Private Sub CommandButton1_Click()
'開始ボタンが押されたら処理開始
StopFlag = False
With Me.Controls("CommandButton1") '開始ボタンを選択できないようにする
.Enabled = False
End With

'処理1
ThisWorkbook.Worksheets("sheet1").Range("A1") = "処理1"

'一時停止
StopFlag = True
Application.Cursor = xlNorthwestArrow 'ループ中に砂時計になるので矢印にする
Do While StopFlag = True
DoEvents 'イベントを受け取れるようにする※絶対入れてください!
With Me.Controls("CommandButton2") '再生ボタンを選択可能に
.Enabled = True
End With
If StopFlag = False Then
Exit Do
End If
Application.Wait Now() + TimeValue("00:00:01")
Loop
Application.Cursor = xlDefault 'マウスポインタ―を元に戻す

'処理2
ThisWorkbook.Worksheets("sheet1").Range("A2") = "処理2"

'一時停止
StopFlag = True
Application.Cursor = xlNorthwestArrow 'ループ中に砂時計になるので矢印にする
Do While StopFlag = True
DoEvents 'イベントを受け取る※絶対入れてください!
With Me.Controls("CommandButton2") '再生ボタンを選択可能に
.Enabled = True
End With
If StopFlag = False Then
Exit Do
End If
Application.Wait Now() + TimeValue("00:00:01")
Loop
Application.Cursor = xlDefault 'マウスポインタ―を元に戻す

'処理3
ThisWorkbook.Worksheets("sheet1").Range("A3") = "処理3"
Unload Me
End Sub
'-----------------------------------------
Private Sub CommandButton2_Click()
'再生ボタンがクリックされたら処理を再開するためにフラグを書き換える
With Me.Controls("CommandButton1") '再生ボタンを選択できないようにする
.Enabled = False
End With
StopFlag = False
End Sub

フラグのStopFlagは拡張性を持たせるためにグローバル変数にしています。

フォームボタンでStopFlagを書き換えることによって一時停止のループを抜けます。

ちなみにユーザーフォームに一時停止ボタンを作って、ループ処理の途中で止めることも可能です。

一時停止と再生をするコントロールができるということです。

注意点としては、一時停止のループに絶対にDoEvents を入れてください。

これを入れないと無限ループになってしまいエクセルが固まってしまいます

挿入箇所や処理を変えれば色々と出来るかと思います。

 

コメント

タイトルとURLをコピーしました