.NETエンジニア・プログラマ向けの技術情報・業界ニュースをお届けします。

  1. FEnet.NETナビ
  2. .NETコラム
  3. プログラミング言語
  4. VBAでcontinue代わりになる命令文とは?GoToの使い方を紹介

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

  • プログラミング言語
公開日時:   更新日時:
VBAでcontinue代わりになる命令文とは?GoToの使い方を紹介
この記事でわかること
    基本情報技術者試験の試験対策はこちら>>

    システム
    エンジニア
    For Eachの使い方が知りたいです。

    プロジェクト
    マネージャー
    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の負荷状況によっては操作を受け付けてくれない場合がある点です。

    システム
    エンジニア
    このように、VBAでのループの方法は何種類もあるのですね。

    プロジェクト
    マネージャー
    実際に自分でコードを書いてFor Eachの使い方をマスターしましょう。

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


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

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

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

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

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

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

    FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
    株式会社オープンアップシステムロゴ

    株式会社オープンアップシステムはこんな会社です

    秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
    数多くのエンジニアが集まります。

    秋葉原オフィスイメージ
    • スマホアプリから業務系システムまで

      スマホアプリから業務系システムまで

      スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。

    • 充実した研修制度

      充実した研修制度

      毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。

    • 資格取得を応援

      資格取得を応援

      スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。

    • 東証プライム上場企業グループ

      東証プライム上場企業グループ

      オープンアップシステムは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。

      安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。

    株式会社オープンアップシステムに興味を持った方へ

    株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。

    年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
    まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。

    株式会社オープンアップシステムへのご応募はこちら↓
    株式会社オープンアップシステムへのご応募はこちら↓

    新着案件New Job