こんにちは、フリーランスエンジニア兼ライターのワキザカ サンシロウです。
皆さんは、VBAで処理を実行したときに、処理が止まらず困ってしまった経験はありませんか?
ちょっとしたミスでExcelが固まってしまい、最悪の場合途中まで書いていたコードが消えてしまうこともあります。
そのため、強制終了方法を覚えておくのがおすすめです!
そこで今回は、
・Excelが固まってしまう原因
・VBAの処理を強制終了する方法
といった基礎的なことから、
・処理が止まらない場合の対応方法
・処理を強制終了したときにデータが消えるのをふせぐ方法
といった応用的な方法まで、徹底的に解説します!
処理が固まってしまう原因とは
VBAでは、重たい処理をループ処理してしまったり、ループ処理の終了条件をミスして無限ループにしてしまうと処理が固まってしまいます。
普通の処理では、リセットボタンを押すことで処理を止めることができます。
リセットボタン:
ただ、先ほど説明した重たい処理のループ処理、無限ループではリセットボタンを押しても処理が止まりません。
処理が重たくて固まってしまうサンプルコード:
Sub Test() Dim i As Long Dim j As Long For i = 1 To 50000 For j = 1 To 50000 Cells(i, j).Select Selection.Copy Next j Next i End Sub
このサンプルはFor文にFor文を入れたループ回数の多い処理の中に、セル選択・コピー処理を入れて重たい処理を書いているため、Excelが固まってしまいます。
このように重たい処理で固まってしまった場合は、処理を強制終了する必要があります。
処理が固まってしまった場合の強制終了方法とは
VBAで処理を強制終了する方法は、大きく分けて3つです。
- EscまたはCtrl + BreakキーでVBAの処理を強制終了する
- Excelの警告メッセージからファイルを閉じる
- タスクマネージャから直接Excelを閉じる
それぞれ詳しく解説しますね。
EscまたはCtrl + Breakキーで処理を強制終了する
まずは、一番お手軽な強制終了方法です。
Escキーまたは、Ctrl + Breakキーを押すと、VBAの処理を強制終了することができます。
今まで書いたコードを残しつつ処理を途中で止めることができるので、この方法が一番おすすめです。
Excelの警告メッセージからファイルを閉じる
ただ、Breakキーがキーボードにない場合や、この方法では処理が止まらないケースもあります。
そんなときは、Excelが固まった時に出てくる以下警告メッセージから、「→プログラムを終了します」を選択して、ファイルを閉じます。
ただ、ファイルを強制的に閉じるので、途中まで書いたコードがなくなってしまう場合があります。
そのため、重たい処理の場合は少し待ってみて、処理が終わらない場合のみこの方法を使うのがおすすめです!
タスクマネージャから直接ファイルを閉じる
先ほどの警告メッセージがなかなか出てこないケースもよくあります。
そのため、最終手段としてタスクマネージャからファイルを閉じる方法を知っておくと便利です。
タスクマネージャからファイルを閉じる手順は、以下の通りです。
1. タスクバーの空いているところを右クリックし、メニューからタスクマネージャを選択
2. 使用中のExcelファイルを選択し、タスクの終了ボタンをクリック
これで強制的にファイルを閉じることができます。
この方法も警告メッセージから表示する場合と同じく、途中まで書いたコードが保存されずに消えてしまう可能性があります。
そのため、重たい処理の場合は少し待ってみて、処理が終わらない場合のみこの方法を使うのがおすすめです!
途中まで書いたコードが消えるのを防ぐ方法
ここまで強制終了する方法について解説してきましたが、3つの方法のうち2つの方法が途中まで書いたコードが消える可能性がありましたよね。
EscキーとCtrl + Breakキーで止まらなかった時、書いたコードが消えてしまうのはかなり厳しいはず、、、
そんな方向けに、途中まで書いたコードが消えるのを防ぐ方法について、ご紹介します!
処理の先頭に名前を付けて保存するコードを入れておく
1つ目は、ファイルを別名で保存しておく方法です。
処理の先頭にファイルを保存するためのコードを入れておくことで、処理が固まってしまった場合でも保存したファイルから開発を続けることができます。
ファイルを名前を付けて保存する場合は、SaveAsメソッドを使います。
SaveAsメソッドを使ったサンプルコードは以下の通りです。
サンプルコード:
Sub TestSave1() 'ファイル名作成 Dim strFileName As String strFileName = " 開発ファイル_" & Format(Now, "yyyymmddhhmmssms") & ".xlsm" 'ファイルパス指定 Dim strFilePath As String strFilePath = ThisWorkbook.Path & "" & strFileName 'ファイル保存 ThisWorkbook.SaveAs Filename:=strFilePath, _ FileFormat:=xlOpenXMLWorkbookMacroEnabled 'メインの処理------------------ ' ' ' ' ' ' ' '------------------------------ End Sub
マクロを実行しているファイルと同じフォルダに、「開発ファイル_ + 年月日時分秒ミリ秒.xlsm」でファイルを保存するサンプルです。
ファイル名に年月日時分秒ミリ秒まで入れている理由は、同じファイル名のファイルが作成されてエラーになるのをふせぐためです。
「Format(Now, "yyyymmddhhmmssms")」とすることで、年月日時分秒ミリ秒を簡単に取得することができます。
また、「ThisWorkbook.Path」でマクロを実行しているファイルのフォルダパスを取得することができるので、ファイル名とつなげてファイルパスを指定しています。
処理を実行するたびにファイルができてしまうため容量は重くなってしまいますが、書いたコードが消える手間を考えると入れておいて損はないですよね。
DoEvents関数を使ってリセットボタンを押せるようにする
ただ、最後に説明した通りファイルを保存する処理を入れると実行するたびにファイルができてしまうため、フォルダの容量を圧迫してしまいますよね。
そんな時におすすめなのが、DoEvents関数です。
ループ処理中でもOSに処理をわたすことができるので、リセットボタンを押して処理を止めることができるようになります。
例えば、次のようにループ処理の中でDoEvents関数を入れる場合は、次のように書きます。
サンプルコード:
Sub Test() Dim i As Long Dim j As Long For i = 1 To 50000 For j = 1 To 50000 DoEvents Cells(i, j).Select Selection.Copy Next j Next i End Sub
この処理を実行するとExcelが固まってしまうのですが、リセットボタンを押すと処理を止めることができます。
DoEvents関数を入れておくだけで済むので、For文やWhile文などのループ処理を書くときにDoEvents関数を入れる癖をつけておくと、開発時にExcelが固まって書いたコードが消えるのをふせぐことができるのでおすすめです!
SaveAsメソッドの使い方、DoEvents関数の使い方については以下で詳しく解説しているので、気になる方は見てみてくださいね!
まとめ
今回は、VBAで処理が固まってしまったときの強制終了方法について解説しました。
せっかく書いていたコードが、ちょっとしたミスで消えてしまうのはとても悲しいですよね。
今回解説した強制終了する方法、コードが消えるのをふせぐ方法を覚えておくだけで消えるリスクを減らすことができます。
どれも使い方は簡単なので、ぜひ使ってみてくださいね!