.net column
.NET開発者のためのブログメディア

VBAでcontinue代わりになる命令文とは?GoToの使い方を紹介

2021年01月26日

SE
For Eachの使い方が知りたいです。

PM
For Eachで繰り返し処理ができます。それでは見ていきましょう。

VBAには「ループの先頭に戻る」という命令がない?


C言語やJava言語など、他の言語を知っている方であれば『無限ループを作成しておいて、必要に応じてループを抜けたり、ループの先頭に戻ったりする』という処理を考えることがあるでしょう。そうすると、必須なのが『break命令』と『continue命令』です。

VBAの場合は、途中でループを抜ける「Exit」命令はあるものの、ループの先頭に戻る、continueに当たる命令が言語として実装されていません。「なんでVBAはbreakがあるのにcontinueが無いの?」「ここでcontinueしたいのに!」と、思うことも多いでしょう。

ですが、実装されていないものは仕方がないので、別の方法で解決するしかありません。ここでは、VBAでcontinueの代わりになる命令について紹介していきます。

VBAでcontinue代わりになる命令文とは?


VBAでcontinueの代用をする場合は「GoTo」という命令を使います。GoTo命令は「指定したラベル先へ処理をジャンプさせる」という命令です。処理をスキップしたり、try~catchのようなエラー処理をしたりする場合によく使われます。

ラベルは同じプロシージャ内にだけ付けることができます。他のプロシージャへジャンプさせることはできません。

では、どのようにしてGoTo命令でcontinueのような処理を実現するのか解説していきます。

VBAにおけるGoToの使い方3つ


VBAにおけるGoToの使い方として
1.For Eachの中でGoToを使い、ループをスキップするやり方
2.ループの最後のラベルに処理を移すやり方
3.ループの先頭のIf文で条件判定するやり方
の3つがあります。

早速、見ていきましょう。

1:For EachでGoToでループをスキップするやり方

VBAでのループをスキップする方法を紹介します。continueに相当します。VBAでは、GoToを使用します。実際のソースコードを見てみましょう。

実行結果は以下のようになります。
このように、GoToを使えばcontinue相当の処理を実現することができます。

break相当の記述方法

ループの外に「Continue:」を記述すれば、break相当になります。実際のソースコードを見てみましょう。

実行結果は以下のようになります。

GoToでもbreakは実現できますが、可読性が低くなるのでExit Forのほうが良いでしょう。

2:ループの最後のラベルに処理を移すやり方

ループの最後に貼ったラベルに、処理を移す方法もあります。実際のソースコードを見てみましょう。

実行結果は以下のようになります。

このようにFor文やWhile文でも、continue相当の処理を実現することができます。

3:ループの先頭のIf文で条件判定するやり方

ループの先頭のIf文で条件判定をするやり方もあります。実際のソースコードを見てみましょう。

実行結果は以下のようになります。
このようにIf文で条件判定するやり方もありますが、ネストが深くなりがちなので、あまりお勧めできません。

VBAでのその他のループ処理6つ


ここまで、continueの代わりになるGoTo命令について紹介してきました。

ですが、GoTo命令は多用しすぎると、コードが複雑になって読みにくくなる⇒バグの原因になるというリスクを抱えています。

ですので、ループの書き方を工夫することでGoTo命令の使用回数が減るのであれば、それに越したことはありません。

ここでは、VBAで使用できるループを6つ、ご紹介します。

1:配列のループ

VBAでの配列のループ方法を紹介します。実際のソースコードを見てみましょう。

実行結果は以下のようになります。Debug.Printの結果はイミディエイトウィンドウに出力されます。イミディエイトウィンドウが表示されていない場合は、「表示(V)」→「イミディエイトウィンドウ(I)」を選択してください。

配列のすべての要素が表示されていることが分かります。このように、For Eachで繰り返し処理ができます。

2:逆順ループ

VBAでの配列の逆順ループ方法を紹介します。For Eachでは逆順ループは実現できないので、代わりにFor~Nextを使用します。実際のソースコードを見てみましょう。

実行結果は以下のようになります。

「Step -1」の部分が、ループインデックスiをデクリメントする指定です。

初期値である「UBound(myArray)」から最終値である「LBound(myArray)」とすることで、インデックスの大きいほうから逆順に処理が行われます。

このように、逆順に繰り返し処理をすることもできます。

3:break

VBAでのループ処理を抜ける方法を紹介します。プログラミング言語でよくある「break」に相当します。VBAではbreakはないので、その代わりに「Exit For」を使用します。実際のソースコードを見てみましょう。

実行結果は以下のようになります。

「Exit For」でループ処理を抜けることが分かります。

「Exit Sub」とすることで、関数を抜けます。実際のソースコードを見てみましょう。

実行結果は以下のようになります。

このように、Exit Forでループ処理を抜け、Exit Subで関数を抜けることが分かります。

4:Range

VBAでのRangeのループ方法を紹介します。実際のソースコードを見てみましょう。

実行結果は以下のようになります。

Range内のアドレスがすべて表示されることが分かります。

5:Selection

VBAでのSelectionのループ方法を紹介します。実際のソースコードを見てみましょう。

エクセルのセルを選択した状態でマクロを実行してみてください。実行結果は以下のようになります。

選択したセルのアドレスが表示されることが分かります。

6:Worksheets

VBAでのWorksheetsのループ方法を紹介します。実際のソースコードを見てみましょう。

実行結果は以下のようになります。

エクセルのシートがすべて出力されることが分かります。

VBAでループ処理が重くなったときの対処法


ループの書き方を工夫し、GoTo命令を使用することでcontinueのような処理が作れたとしても、それが重たい処理になってしまった場合は、注意が必要です。
VBAでは、重たい処理をループさせようとすると、固まってしまう場合があります。

また、GoTo命令を多用しすぎた結果、ループの終了条件を間違えてしまって無限ループにしてしまった場合も、Excelが固まってしまいます。

普通の処理では、リセットボタンを押すことで処理を止めることができますが、上記のような場合は、もうExcel自体が動かなくなっているのでリセットボタンを押しても処理が止まりません。
このように固まってしまった場合は、処理を強制終了する必要があります。

処理が固まってしまった場合の強制終了の方法は、大きく分けて2つあります。

・Excelの警告メッセージからファイルを閉じる
・EscまたはCtrl + BreakキーでVBAの処理を強制終了する

それぞれ、詳しく解説していきます。

警告メッセージからファイルを閉じよう

Excelが固まってしまうと、警告メッセージが出ることがあります。

このメッセージの『→プログラムを終了します』を選択すればExcelを閉じることができます。

この方法の欠点はファイルを強制的に閉じてしまうので、これまで行った変更が消えてしまう場合があることです。

そのため、Excelが固まってもすぐにファイルを閉じずに、しばらく待ってみることをお勧めします。そして、それでも固まったまま動かないのであれば、上記の方法でExcelを閉じてみてください。

処理を強制終了しよう

他にも、Escキーまたは、Ctrl+Breakキーを押すと、VBAの処理を強制終了することができます。

こちらの方法のメリットは今まで書いたコードを残しつつ、処理を途中で止めることができることです。

デメリットは、キーボードによってはBreakキーがついていないことがある点と、PCの負荷状況によっては操作を受け付けてくれない場合がある点です。

SE
このように、VBAでのループの方法は何種類もあるのですね。

PM
実際に自分でコードを書いてFor Eachの使い方をマスターしましょう。

VBAでcontinueの代わりにループ処理をスキップする方法を理解しよう


いかがでしたでしょうか。

VBAではcontinueという命令が実装されていないため、ループの回し方を工夫したり、GoToをうまく使って処理をスキップしたりする必要があります。

continueが使えないことで、C言語やJava言語では考えなかったようなループ処理を検討する必要があるのもVBAの醍醐味だと考えられるでしょう。

また、『GoToはバグの元!』と嫌悪感を持つ方も時々いらっしゃいます。ですが、それはGoToを乱発していたり、変なところにGoToを使っているのでソースの可読性が下がっているだけです。

大きく言えば、break命令もcontinue命令も、ルール化されたGoTo命令ですので「continueなら乱発しても良いが、GoToを使ってはいけない」というものもおかしな話です。

GoToは正しく使えば非常に優秀で便利な命令ですので、ぜひ、みなさんも怖がらずに使ってみてください。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags