Excel VBA 入門 その6-4-1 : For文について学びましょう

StockSnap / Pixabay


皆さまこんにちは!

このサイトの管理者のHide(ヒデ)と申します。

今回はExcel-VBAで利用されるFor文についてお伝えしたいと思います。For文はループ文とも呼ばれていて、同じ命令を繰り返し実行したい場合に簡潔に表現できるプログラミングの文法です。特に繰り返す回数があらかじめ決まっている場合に便利な文となっています。

そういわれても、For文そのものが初めてであれば、何を言われているかさっぱりわからないかもしれませんね。それではFor文について詳しく見ていきましょう。

スポンサーリンク
Simplicityのレクタングル広告(大)

1. For文とは

For文を少しずつ理解するために、まずは、下記のTestという名前のプログラムをご覧ください。

Sub Test()
プログラムの命令その1
プログラムの命令その2
プログラムの命令その3
End Sub

これまで、プログラムは上から下に順番に実行されるということをお伝えしてきました。上記のプログラムも同じで「プログラムの命令その1」→「プログラムの命令その2」→「プログラムの命令その3」の順番で命令が実行されていきます。

では、例えば「プログラムの命令その2」の部分について3回実行したい場合、どのようにプログラムを書けばよいでしょうか。例えば下記のような書き方が考えられます。

Sub Test()
プログラムの命令その1
プログラムの命令その2
プログラムの命令その2
プログラムの命令その2

プログラムの命令その3
End Sub

上記のように同じ命令を3回記述するという方法ですね。では、「プログラムの命令その2」の部分を100回実行したいとしたらどうでしょう。3回ならまだ上記の書き方でよいですが、100回となるととても大変ですし、同じ命令を100回書くのはとても非効率に思えてきます。そこで利用するのがFor文になります。

2. For文の文法

それでは、For文はどのように記述するのか見ていきましょう。For文の書き方ですが、下記のようになっています。

Dim 変数名 As Long

For 変数名=初期値 To 終了値 (Step 増減値)

    プログラムの命令

Next (変数名)

上記がFor文の基本形となります。特にForからNextまでの部分はFor文の骨格となる部分です。このForからNextまでのひとくくりを一般的にFor文といいます。For文は繰り返しの回数などを制御するためにプログラミングする人が「ループ変数」と呼ばれる整数を扱う変数を用意する必要があります。変数名と書かれた部分がそれに当たります。ループ変数といっても普通の変数です。整数の変数を用意すればよいので、変数の型としては、扱う数の大きさにもよりますが、IntegerかLongを型として設定すればOKです。

変数の型とは何かについて知りたい方は下記のブログもご覧ください。

変数の型について解説しているブログはこちら

For文の中に「初期値」,「終了値」,「増減値」とありますが、この部分でプログラムの命令を繰り返す回数を制御します。この点ついては後述しますね。

次にNextという部分がありますが、NextはFor文の終端を表しています。そしてForとNextの間に繰り返し実行したい「プログラムの命令」を記述します。「プログラムの命令」の先頭にスペースがあるのは、If文のブログでもご紹介した字下げといって、プログラムを見やすくする工夫になります。

では具体的な例で考えてみましょう。プログラムの命令を3回繰り返したい場合、For文では下記のように記述します。※For文に必要な箇所だけ抜粋して記載しています。便宜上、行番号を付けていますが、実際には記述しませんのでご注意ください。

<記述例その1>
01. Dim i As Long
02.
03. For i=1 To 3
04.     プログラムの命令その1
05. Next i
06.
07. プログラムの命令その2
08. プログラムの命令その3

このように記述することで「プログラムの命令その1」の部分を3回繰り返すという動きを表現できるのですが、その仕組みについて下記の解説の部分でご説明したいと思います。(※02,06行目については空白行でプログラムを見やすくする行になりますので、プログラムの命令は実行されません。)

<解説>

For文のプログラムの動きについて:

【Step1】
まず、01行目で変数を「i」という名前でFor文に必要なループ変数を宣言しています。For文を利用する場合、このように整数を格納できる専用の変数の宣言が必須になると覚えてください。変数名は(予約語が利用できない,先頭を数字にできない等、若干制限はありますが)自由に決めることができます。

補足:予約語とはExcel-VBAの文法で利用される「Sub」や「If」などの既に役割が決まっている用語のことです。

【Step2】
次に03行目に処理が移ります。この行はFor文の開始位置で1度だけ実行されます。この文で「i=1」と書かれていますね。このように記述することでループ変数「i」に初期値として「1」が代入されます。また、終了値を「3」,増減値を「1」と指定しています。但し、増減値が「1」の場合は(Step 増減値)の部分を省略できます。今回は増減値を1にしたいのでこの部分は省略しました。

【Step3】
続いて、04行目の「プログラムの命令その1」に進みたいところですが、その前に、ループ変数の内容が終了値である「3」を超えていないかチェックされます。IF文などの記述はないのですが内部的にチェックが行われます。

ここでループ変数iの内容が終了値「3」を超えていなければForとNextの間に記述された04行目の「プログラムの命令その1」を実行し、その後【Step4】に進みます。

もしここでループ変数iの内容が終了値「3」を超えていた場合は、For文(03~05行)の処理を終了して07行目以降のプログラムに進みます。

そのため、【Step2】,【Step3】の処理によりループ変数iの初期値が既に終了値「3」を超えていると判断された場合にはForとNextの間に記述された04行目の「プログラムの命令その1」は一度も実行されずに07行目以降のプログラムに進んでしまうこともあるわけです。これはどのようなケースかというと例えば今回の例ように初期値に「1」などの固定値を設定するのではなく、ループ変数iとは別の変数を宣言して、その変数を初期値として代入して(例:i=jのような形)制御するようなプログラムの場合です。For文だからといってForとNextの間に記述されたプログラムの命令が必ず(繰り返し)実行されるとは限らないと覚えておいてください。

【Step4】
続いて05行目のNext iと書かれた行が実行されます。ループ変数の変数名「i」は、このNextの行でも記述します。省略も可能ですが基本的には記述しましょう。Nextには現在のループ変数iの内容に増減値の部分に指定された値を加算(マイナス値が指定されている場合は減算)するという役割があります。今回のケースではNextの行が実行されると(Step 増減値)の記述が省略されているのでループ変数iに「1」が加算され、ループ変数iの内容は「2」になります。また、このNextにはもう1つの役割があり、それは何かというと先ほどの【Step3】に処理を戻すという役割です。つまり、Next文はループ変数の加算と同時にプログラムの処理を上側(For文の開始行の次にくる最初の命令)に戻す役割があります(但し、その前に【Step3】の判定が入りますので、ここでループ変数の内容が終了値を超えた場合を除きます)。

For文は、このような流れで処理が進んで行き(ループ変数iの内容は「1→2→3→4」と変化していきます)、【Step3】のところで、条件を満たさなくなり次第(ループ変数iの内容が終了値である「3」を超え次第)、For文(03~05行目)を終了して07行目の命令に処理が進みます。

ここまでで、For文の動きについて見てきました。文章だけでの説明ではわかりにくいかもしれませんので上記の<記述例その1>のFor文についてフローチャートを使って見ていきましょう。

3. For文のフローチャート

下図は<記述例その1>のフローチャートになります。図の中に解説を記載していますのでじっくりご覧ください。

For文のフローチャートはいかがでしたか。このフローチャートの解説の中にも書かれていますが、重要な点が1つあります。それは、For文の処理が終了した後、次のプログラムに進むのですが、ループ変数iの内容はFor文で指定した終了値「3」よりも1つ多い(正確には増減値で設定した値を加算した(※1))「4」になっているということです。

For文を習いたての頃は、For文が終了した後は、ループ変数iは最終的に終了値である「3」になっていると勘違いしやすいのですが、実際には終了値に増減値で設定した値を加算した値(※1)になっていることにご注意ください。

※1について:増減値がマイナスの値の場合は減算した値という意味になります。

ここで3点ほど補足させて頂きます。

1点目:<記述例その1>のFor文のようにループ変数の初期値を「1」,終了値を「命令を繰り返したい回数」,増減値を「1」にして「1」ずつカウントアップしていくというのがFor文で最も基本的な使い方になります。数学的に言えば、For文の変数iは初項が「1」,公差が「1」の等差数列の動きになっています。数学嫌いの方ごめんなさい。

2点目:本ブログではFor文の基礎を理解頂くためにFor文の初期値,終了値,増減値に直接数字を指定していますが、実際のプログラムでは変数を記述して可変式にすることも可能です。

3点目:<記述例その1>のFor文で「プログラムの命令その1」を3回実行することが可能ですが、たとえば下記のように書くことも可能です。

<記述例その2>
01. Dim i As Long
02.
03. For i=3 To 1 Step -1
04.     プログラムの命令その1
05. Next i
06.
07. プログラムの命令その2
08. プログラムの命令その3

この例は変数iの初期値を「3」からスタートして「1」ずつ減算していき、終了値の「1」より小さくなったら、つまり変数iが「0」になったらFor文(03~05行目)を終了する動きになります。このように書いても「プログラムの命令その1」を3回実行できますが、プログラムがわかりにくくなるので一般的には<記述例その1>の形を用います。

それでは上記のフローチャートと同じようにFor文で命令を3回繰り返し実行するプログラムを作ってみましょう。

4. 実際にプログラムを動かしてみましょう

4-1. モジュールを追加する

今回、VBEの画面で下図のように新しいモジュールを追加して、赤枠部(1番)のように名前を「Mo04_For」としました。また、モジュールを追加した際に赤枠部(2番)のようにコード画面の先頭に「Option Explicit」という文字が挿入されていることを確認してください。

モジュールの作成方法や名前の変更方法については、下記のブログをご覧ください。

モジュールの作成方法について解説したブログはこちら
モジュール名の変更方法について解説したブログはこちら

4-2. プログラムを入力する

モジュールが追加できたら、プログラムを入力してみましょう。今回は下記のようなプログラムを考えてみました。このプログラムはFor文によって「イミディエイトウィンドウに現在の変数の内容を表示する」命令を3回繰り返します。また、For文の終了後に「イミディエイトウィンドウに現在の変数の内容を表示する」命令を再度実行します。

Sub Test1()

Dim i As Long

For i=1 To 3

    Debug.Print "変数iの値は" & i & "です。"

Next i

Debug.Print "変数iの値は" & i & "です。"

End Sub

では、このプログラムをVBEのコード画面に入力してみましょう。入力すると下図のようになります。みなさんもできましたか?

4-3. 1行ずつプログラムを動かしてみる

プログラムは入力できましたでしょうか。それではプログラムを動かしてみましょう。通常、プログラムの動かす場合、動かしたいプログラムの中(このプログラムであれば、Sub Test1() と End Sub の間)にカーソルを置いてF5キーを押します。

この方法でもよいのですが、今回はステップ実行というプログラムを1行ずつ動かせる便利な機能を使って動かしてみたいと思います。カーソルを上記のようにプログラムの中に置いた状態でキーボードのF8キーを1回押してみてください。すると下図のように、プログラムの先頭が黄色でハイライトされました。

続いて、F8キーを1回押してみましょう。すると下図のように(Dimから始まる変数の宣言の部分はプログラムの命令ではないので通過して)For文の開始位置がハイライトされました。

上図でハイライトされたForの行はこれから実行されることを表していてまだ実行されていません。この時点でFor文の行の変数iの上付近にマウスのカーソルを近づけてみましょう。すると下図の赤枠部のように変数iの内容はこの時点ではまだ「0」だとわかります。

さらに、F8キーを1回押してみましょう。すると下図のようにForとNextの間にある「Debug.Print "変数iの値は" & i & "です。"」の行がハイライトされました。黄色でハイライトされている行はこれから実行される命令を表していてまだ実行されていません。実際、画面では何も起きていないと思います。

この時点でもう一度For文の行の変数iの上付近にマウスのカーソルを近づけてみましょう。すると下図の赤枠部のように変数iの内容が「1」と表示されます。先ほどのForと書かれた行で変数iに初期値「1」が代入されたことがわかりますね。

補足になりますが、この行がハイライトされた理由はループ変数iの内容が「1」でFor文を継続する条件である「i<=3」の条件(フローチャートを参照)を満たしたためです。

では、もう1回、F8キーを押してみましょう。すると下図のようにイミディエイトウィンドウに「変数iの値は1です。」と表示されました。

※Debug.Printはその右側に書かれた文字や数値,変数の内容をイミディエイトウィンドウに表示して改行する命令でしたね。表示したい文字は「"(ダブルクォーテーション)」で囲みます。また「&」記号で「文字と文字」や「文字と変数」などを連結することができます。

これでForとNextに囲まれたプログラムが1回実行されたことになります。また同時にNext i の行がハイライトされました。

この時点で再度変数iの内容を見てみましょう。プログラムの中の変数iが記述された場所であればどこでもよいのでマウスカーソルを近づけてみましょう。例えば Next i の行の変数iの上にマウスカーソルを近づけてみると下図のようになりました。この時点ではまだ変数iの内容は「1」だとわかりますね。

では、もう1回、F8キーを押してみましょう。すると下図のようにForとNextの間にある「Debug.Print “変数iの値は” & i & “です。”」の行にハイライトが戻りました。

この時点で変数iの上付近にマウスカーソルを近づけてみましょう。すると下図のように変数iの値が「2」になっています。これはさきほどの Next i の命令が実行されたことによる結果となります。

では、イミディエイトウィンドウに下図のように「変数iの値は3です。」と表示されるまでF8キーを押してみましょう。ここまでで、For文により命令が3回繰り返されたことがお分かり頂けるかと思います。

一方、プログラムにおいては、下図のように Next i の行がハイライトされました。

この時点でNext文の行の変数iの上付近にマウスのカーソルを近づけてみましょう。すると下図の赤枠部のように変数iの内容はこの時点ではまだ「3」だとわかります。

ここでみなさんに質問です。ではF8キーをもう1回押すとどうなるでしょうか。答えを先に言うと Next i の命令により変数iの内容は「4」に変化します。つまりFor文を継続する条件である「i<=3」の条件を満たさなくなるので、For文の処理は終了するはずですね。

では、実際にF8キーを1回押してみましょう。すると下図のように確かにFor文の処理を終了してプログラムの最後の命令の行が黄色でハイライトされました。

ではあと2回、F8キーを押してみましょう。これでプログラムの実行は終了となりますが、イミディエイトウィンドウは下図のようになりました。下図の赤枠部のメッセージは、For文の外側にあるDebug.Printの文の命令で表示されたものです。変数iの内容はこの時点で「4」になっていることがわかりますね。

先ほどお伝えしましたが、For文の処理を終了した場合、ループ変数の内容は終了値になるのではなく、終了値にFor文に設定した増減値の値を加算したものになるとお伝えしました。今回は増減値が省略されていますので終了値に「1」が加算された「4」となりました。

今回のプログラムで利用したループ変数iのような変数、またはその変数の値は実際のプログラムでは別の用途で再利用することがあります。その際は、ループ変数の値がどのような状態になっているのか把握した上で利用することが重要です。今回の例では、最終的なループ変数iの値は「4」になりましたが、これは後のブログでご説明しますが、For文を途中で中断するようなケースでは、別の値になることもありますので、ループ変数を再利用する際には注意して利用するようにしましょう。

5. まとめ

長くなりましたが、今回はプログラミングで重要なFor文について見てきました。For文はとても重要ですので本ブログを何度も読み返して理解して頂ければと思います。

次回のブログでは、For文を応用したプログラムをご紹介します。

お疲れさまでした!

ブログの続きはこちら

Excel VBA 入門 目次ページ はこちら

本ブログの内容が電子書籍(Kindle)になりました。

スポンサーリンク
Simplicityのレクタングル広告(大)
Simplicityのレクタングル広告(大)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

%d人のブロガーが「いいね」をつけました。