初心者オサムシがExcelのマクロと戦う戦闘ブログである
by オサムシ
止まらないマクロを停止する~無限ループ~/マクロ基礎

止まらないマクロを停止する~無限ループ~/マクロ基礎



Do…LoopやFor…Nextを使っていると永遠に終わらないマクロを書いてしまう場合がある

VBEでもこのような論理的に矛盾の無い構文は検知してくれないから、実行してしまうとExcelを閉じる事さえできなくなる

無限ループの原因にもよるみたいだけど、【Esc】かもしくは【Ctrl】+【Pause】で止まるようです

一度陥った事があったのですが、どんな構文だったか忘れたし、新たに無限ループを作ろうにもすぐに思いつかなかったので、まだ未検証ですけど。。

僕の場合、実際の記述の中で、実行結果が希望通りになっているか検証できるまでは、回避策としてExitを選択できるようなIf文を仕込んでおくようにしている

Exit ステートメントは文字通り処理を抜けるステートメントです
早い話が、その処理を途中でやめるのですが、マクロ全体をやめてしまう訳ではなくて、指定方法によって、やめる処理の範囲が違います

Exit Sub
Subプロシージャを中止します

Exit Function
Functionプロシージャを中止します

Exit For
For…Nextステートメント・For Each…Nextステートメントを中止します

Exit Do
Do…Loopステートメントを中止します

構文に間違いが無ければ、最後に削除すればよい

例えばこんな感じ

A列のセルを上から巡回して、最初の空白セル(次に入力するであろうセル)に番号を1足して入力するマクロ
オートインクリメントです
Sub sample1()
Dim a As Variant //変数宣言
Dim n As Variant //変数宣言
n = 2 //2行目から開始
a = Cells(n, 1) //aにセルを代入
Do Until IsEmpty(a) //aが空でなかったら処理続行
If vbOK = MsgBox(a, vbOKCancel) Then //処理を続けるか対話。Ifで分岐
Else: Exit Do //OKじゃなければDoを抜ける
End If //Ifここまで
n = n + 1 //次のセルへ
a = Cells(n, 1) //aに次のセルを代入
Loop //Loopここまで
b = Cells(n - 1, 1) + 1 //bに最終行の値に1足して代入
Cells(n, 1).Value = b //新しいセルにbを代入
Cells(n, 2).Activate //名前を入力するB列をアクティブ化
MsgBox b & "番を追加しました" //bを表示
End Sub


シートにはこのように入力しておきます
d0285354_147422.jpg


実行
d0285354_148223.jpg

d0285354_1481223.jpg

d0285354_1482019.jpg

d0285354_1483056.jpg

d0285354_1484459.jpg


思惑通り、オートインクリメントした後に、処理を終了する事が確認できたら

Sub sample1()
Dim a As Variant
Dim n As Variant
n = 2
a = Cells(n, 1)
Do Until IsEmpty(a)
' If vbOK = MsgBox(a, vbOKCancel) Then
' Else: Exit Do
' End If
n = n + 1
a = Cells(n, 1)
Loop
b = Cells(n - 1, 1) + 1
Cells(n, 1).Value = b
Cells(n, 2).Activate
MsgBox b & "番を追加しました"
End Sub


確認用メッセージボックスをコメントアウトするか、削除して完了

そうすれば、上の画像の1~3までのメッセージボックスは表示されず、目的の処理だけ行ってくれます

範囲指定してコメントアウトする方法はコメントアウト/マクロ基礎を参照してください

どうですか?

強制的に終了させるより、かっこいいでしょww。osamushi

オサムシじゃーなる
[PR]
by 03musi | 2013-01-20 14:12 | マクロ 基礎
<< 配列を操作する関数/マクロ基礎... For Each ステートメン... >>