皆さまこんにちは!
このサイトの管理者のHide(ヒデ)と申します。
前回のブログではFor文とは何か、また、For文はどのような動きをするのかという点について学びました。
For文はForとNextの間に書かれた命令を繰り返し実行するという文法でした。
でも、命令を繰り返し実行するといっても具体的に何に役立つのか、どのような場面で利用するのかという疑問がわいてきます。例えば、同じ文字を画面に何回も繰り返し表示するというのもあまり役に立たない気もします。
「For文」イコール「繰り返し」というイメージが強いのですが、確かにFor文は命令を繰り返し実行するのですが、掘り下げて見るとFor文の意外な側面が見えてきます。
このブログでは、より踏み込んだFor文の役割と、その活用例を見ていきます。
Contents
1. For文の利用用途
For文はどのように利用したらよいのかイメージがつきにくいと思いますので下記にその例を記載しました。
1-1. For文の変数の動きに着目した規則性のある計算に利用
例えば1から100までの整数の和を計算してSumという変数に代入したいとしましょう。For文を知らなければ、単純に下記のように書くしかありませね。
Sum=1+2+3+4+....+99+100
しかし、これをプログラムとして1行に書こうとすると横に長いものになってしまい画面から見えなくなるかもしれません。
前回のブログで、For文の一般的な使い方をすると数学の等差数列のような動きをするとお伝えしました。上記の計算のように数列に規則性のある場合、For文と相性がよいのです。この点については後ほど実際にプログラミングしてみていきましょう。
1-2. Excelのシートのセルの行方向や列方向の移動に利用
本ブログは、BASIC言語の文法の基礎の理解に主眼を置いているため、Excelのシートの操作については、解説していません。
みなさんもご存じのようにExcelのシートは無数のセルで構成されています。例えばA1セルは1行1列目にあるセルで、B5セルは5行2列目にあるセルというように各セルは行番号と列番号で位置を表すことが可能です。
例えば、あるシートにある5行5列の大きさの表のセルの内容を1つずつ読み取って調査したいような場合があるとします。例えば下記のような感じですね。
1行1列目 , 1行2列目 ,.... 1行5列目 の順にセルの内容を読み取る。続いて
2行1列目 , 2行2列目 ,.... 2行5列目 の順にセルの内容を読み取る。続いて
....
5行1列目 , 5行2列目 ,.... 5行5列目 の順にセルの内容を読み取る。
このような場合にもFor文を使うと便利です。For文は変数の内容を規則正しく変化させるのが得意なため、セルの位置を動かしながら調査するのにもってこいなのです。
1-3. 配列変数の各変数の値の取り出しに利用
配列変数という新しい言葉が出てきました。配列変数もBASIC言語の重要な概念の1つですが、こちらもまだ解説していません。改めて別のブログで解説しますが、配列変数は現時点では変数に番号が付番されているものと理解してください。この変数の内容を読み取る際にもFor文が活躍します。
2. For文を活用したプログラム例
それでは実際にプログラムを入力してFor文の理解を深めましょう。今回はFor文を活用したプログラムの例を2つほどご紹介します。
2-1. 整数の和の計算
まず初めに整数の和を計算するプログラムを作ってみましょう。今回は「1~100までの間の整数について、奇数の和と偶数の和を計算するプログラム」について考えてみます。
プログラムをご紹介する前にこのプログラムではどのような変数が必要か考えてみましょう。まず、プログラムの目的である整数の和を計算してその結果を保持するための変数が必要となります。それからもう1つ、For文を利用するという時点で、For文を利用するのに必要なループ変数が1つ必要となります。変数については、このような感じで必要なものをイメージしながら実際のプログラムで宣言していきます。プログラムを書きながら変数が足りないことに気づいて変数の宣言を追加するのももちろんOKですよ(笑)
それでは実際のプログラムをご紹介します。プログラムの名前はCalcSumという名前にしました。
Sub CalcSum()
'変数の宣言
Dim Sum As Long
Dim i As Long
'奇数の和の計算
Sum=0
For i=1 To 99 Step 2
Sum=Sum+i
Next i
Debug.Print "奇数の和=" & Sum
'偶数の和の計算
Sum=0
For i=2 To 100 Step 2
Sum=Sum+i
Next i
Debug.Print "偶数の和=" & Sum
End Sub
上記のプログラムについて、説明のために各行の先頭に行番号を付けたのが下記になります。※便宜上、行番号を付けていますが、実際には記述しませんのでご注意ください。
01. Sub CalcSum()
02. '変数の宣言
03. Dim Sum As Long
04. Dim i As Long
05.
06. '奇数の和の計算
07. Sum=0
08. For i=1 To 99 Step 2
09. Sum=Sum+i
10. Next i
11.
12. Debug.Print "奇数の和=" & Sum
13.
14. '偶数の和の計算
15. Sum=0
16. For i=2 To 100 Step 2
17. Sum=Sum+i
18. Next i
19.
20. Debug.Print "偶数の和=" & Sum
21.
22. End Sub
では、このプログラムについて解説していきます。
<解説>
01,22行目について:
01行目はプログラムの先頭を表し、22行目はプログラムの末尾を表しています。
03,04行目について:
この部分はプログラムで利用する変数を宣言する部分になります。03行目の変数Sumは整数の和の計算結果を保持するためにLong型という整数を格納できる変数として用意しました。04行目はFor文を利用するために必要なループ変数になります。ループ変数は通常は整数型として用意しますのでこちらもLong型としました。今回の整数の計算は数が小さいのでどちらともInteger型としてもよいですが、最近のパソコンはメモリーも大きくなっているので整数を扱う場合、全てLong型にしてもまず問題ありません。
02,06,14行目について:
この部分は初めてご紹介する書き方になります。各行をよく見ると先頭に「'(シングルクォーテーション)」が付いていて、その後にプログラムの説明が日本語で書かれています。実はこのような行のことをコメント行と言います。先頭に「'」記号を付けることで、それ以降に書かれた文字はプログラムの命令ではなくプログラムの説明と解釈されます。このような行は命令ではないため何も処理は実行されないと覚えてください。
05,11,13,19,21行目について:
この行は空白行といってプログラムを見やすくするための行となります。先ほどのコメント行と同じで、命令ではないため何も処理は実行されません。
07,15行目について:
各行ともに「Sum=0」と書かれています。
先ほど一度お伝えしましたが、変数Sumは整数の和の計算結果を格納する変数です。
「Sum=0」はFor文の処理に入る前に変数の内容を初期化するという意味になります。実は07行目の「Sum=0」は省略可能です。というのはExcel-VBAでは03行目で変数Sumを宣言した後、その変数に何も処理を行っていなければその内容は「0」だからです。ただ、変数の最初の値がどのような数値から始まっているか明確にするためにあえて07行目のように初期化することもあります。これを明示的な初期化といいます。他の方がプログラムを見たときに変数Sumは初めは「0」なんだなと分かりやすくなるメリットがあります。
15行目にも「Sum=0」がありますが、実はこれは省略できません。というのが、15行目に処理が移った時点で変数Sumには奇数の和の合計値が入ってしまっているからです。もし15行目の初期化を省略してしまうと変数Sumに奇数の合計値が入ったまま、偶数の計算が継続されてしまうのです。
08~10行目,16~18行目について:
この部分でFor文を使ってそれぞれ奇数と偶数の和の計算を行っています。初期値と終了値は違いますが、行っている処理は同じです。変数Sumは整数の和の計算結果を格納する変数で、変数iは初期値から「2」ずつ増やすことで奇数や偶数を表現します。
Sum=Sum+i という式がこのプログラムのポイントになります。この式で整数を和を計算できるのですが、これについては後ほど実際にプログラムをVBE画面に入力して動きを確認しましょう。また、この式の先頭にスペースがあるのは字下げといってForとNextに囲まれた繰り返し実行される命令をわかりやすく見せるための工夫です。
12,20行目について:
Debug.Printという命令で奇数,偶数の和の計算結果をイミディエイトウィンドウに表示しています。文字の部分は「"(ダブルクォーテーション)」で囲み、この文字と変数Sumの内容を連結するために「&」記号を用いています。
補足:本プログラムの重要事項と注意点
先ほど、15行目の「Sum=0」という行(変数の初期化)は省略できないとお伝えしました。この理由について、別の視点からお伝えすると、それはSumという変数を使いまわしていたからです。プログラムの中で1つの変数を使って複数回、別の計算や用途に利用することを、変数を使いまわすと言います。もしあらかじめ奇数の和の格納用にSum1,偶数の和の格納用にSum2のような変数を宣言していれば、15行目の変数の初期化の処理は省略できました。変数を使いまわす場合は途中で初期化を忘れると不具合の原因になりますので、注意しましょう。
変数をいくつ用意するかは、プログラミングする人に委ねられています。後々の事を考慮しながら変数を宣言しましょう。今回の例では整数の和を計算した後にその都度、変数Sumの内容を表示していたので、変数Sumを使いまわしても問題ありませんでしたが、奇数と偶数、それぞれの和をプログラムの最後に同時に表示するような場合は途中で変数Sumを初期化するわけにいかないので、Sum1,Sum2のように、それぞれの結果を格納する変数を用意して計算する必要があります。この点も変数の宣言のテクニックとなりますので覚えておきましょう。
For文で利用されているもう一つの変数i(ループ変数)も使いまわされています。ただ、変数Sumのような形の初期化の行が無いようにも見えますが大丈夫でしょうか?前回のブログをご覧になった方はお分かりと思いますが、For文ではForと書かれた行で(つまりFor文の開始時に)ループ変数の初期化が行われるのでしたね。今回のケースでは各For文の開始時にループ変数iが初期化されるので、1つの変数iを使いまわしても問題ありませんでしたが、この変数についても別々に用意するかという判断は前述の通りプログラムの書き方や用途によります。
ここまでで、整数の和のプログラムについて説明してきましたが、実際にVBEのコード画面に整数の和の計算をするCalcSumのプログラムを入力して動かしてみましょう。
前回のブログで下図のようにVBEの画面のMo04_Forというモジュールに「Test1」という名前のプログラムを作成しました。今回のブログではこのプログラムの上側にプログラムを入力していきたいと思います。ちょうど赤矢印の部分に入力しましょう。
プログラムを入力すると下図の赤枠部のようになりました。みなさんも同じようになりましたか。1点補足になりますが、先ほどお伝えしたコメントの行は、下図のように緑色の文字に変化します。これはプログラムの命令とコメントを区別するためのExcelの親切機能ですね。
プログラムは入力できましたでしょうか。それではプログラムを動かしてみましょう。通常、プログラムの動かす場合、動かしたいプログラムの中(このプログラムであれば、Sub CalcSum() と End Sub の間)にカーソルを置いてF5キーを押します。
この方法でもよいのですが、今回はステップ実行というプログラムを1行ずつ動かせる便利な機能を使って動かしてみたいと思います。カーソルを上記のようにプログラムの中に置いた状態でキーボードのF8キーを1回押してみてください。すると下図のように、プログラムの先頭が黄色でハイライトされました。
これ以降では、このプログラムのポイントとなる部分をメインに解説していきます。続いて、F8キーを2回押してみましょう。すると、プログラムの命令ではないDimから始まる変数の宣言を通過し、「Sum=0」という変数の初期化の行が実行された後、下図のようにFor文の行がハイライトされます。
この時点で、For文のループ変数である、変数iの内容を確認してみましょう。変数iの上付近にマウスのカーソルを合わせてみてください。すると下図の赤枠部のように変数iの内容は「0」と確認できます。黄色でハイライトされている行は、これから実行される行でまだ実行されていません。そのためこの時点での変数iの内容は変数iの宣言直後の状態「0」というわけです。
つづいてF8キーをもう一度押してみましょう。すると下図のように「Sum=Sum+i」の行が黄色でハイライトされます。このハイライトされている行は、先ほどと同様、これから実行される行でまだ実行されていません。
このプログラムの重要なポイントに来ました。Sum=Sum+i という式について解説します。変数のブログのところでもご説明しましたが、Excel-VBAでは、このように左辺と右辺が「=」で結ばれた式の場合、右辺の計算が先に行われ、左辺の変数に代入されるという動きをします。(数学のように変数を移項しません。)
この動きを確認するために、この時点での左辺と右辺の各変数にマウスポインタを近づけて、その中身を事前に把握しておきましょう。
左辺の変数Sumの内容は下図の状態
右辺の変数Sumの内容は下図の状態
右辺の変数iの内容は下図の状態
ここまでで、「Sum=Sum+i」の実行直前の各変数の状態がわかりました。左辺と右辺にある変数Sumの中身が共に「0」,右辺の変数iの中身は「1」となっています。左辺と右辺にある変数Sumの中身が共に「0」で同じなのは、同じ変数で、なおかつ、メモリ上で利用している場所も同じ1つの場所のため、このような表示になります。変数iの中身が「1」になったのは直前のForの行で変数の初期化が実行されたためです。
上記の変数の状態が何を示しているかというと、このハイライトされた行をこれから実行すると右辺の「0+1」が計算され、この計算結果である「1」が左辺の変数Sumに代入される(変数Sumの内容が「0」から「1」に更新される)ことを表しています。
ではF8キーを1回押してみましょう。すると下図のようにNext i の行がハイライトされます。これで「Sum=Sum+i」の行は実行されたことになります。
この時点で、再度、左辺と右辺の各変数にマウスを近づけて、その内容を確認してみましょう。
左辺の変数Sumの内容は下図の状態
右辺の変数Sumの内容は下図の状態
右辺の変数iの内容は下図の状態
これで「Sum=Sum+i」の実行直後の各変数の値が分かりました。
変数Sumは左辺,右辺ともに「1」,右辺の変数iは「1」となっています。変数Sumの左辺と右辺がともに「1」で同じなのは、同じ変数を表しているので常にこのような結果になります。それよりも重要な点は「Sum=Sum+i」の右辺の内容、数字に置き換えると「0+1」が計算されて、左辺の変数Sumの内容が「1」に更新されたという点です。先ほどお伝えしましたが、「Sum=Sum+i」の実行直前の変数Sumの内容は「0」,変数iの内容は「1」であったことを改めて確認しておいてください。
右辺の変数iは「1」のままで変わっていません。変数iはNext i の行が実行された時点で(ハイライトが解除された時点で)更新されるためです。
では、F8キーをもう1回押してみましょう。すると下図のように再度「Sum=Sum+i」の行がハイライトされました。
まだ、「Sum=Sum+i」の行は実行されていませんので、この時点での左辺と右辺の変数の内容を確認してみましょう。
左辺の変数Sumの内容は下図の状態
右辺の変数Sumの内容は下図の状態
右辺の変数iの内容は下図の状態
変数Sumは左辺,右辺ともに「1」,右辺の変数iは「3」となっています。変数iの内容が「1」から「3」に変わりました。これは、さきほど Next i の行が実行され、初期値の「1」に増減値である「2」が加算されたことで次に加算すべき奇数「3」になったという動きによるものです。
上記の変数の状態が何を示しているかというと、このハイライトされた行をこれから実行すると右辺の「1+3」が計算され、左辺の変数Sumに「4」が代入される(変数Sumの内容が「1」から「4」に更新される)ことを表しています。
For文では、この後もこのような流れで変数Sumに奇数を表す変数iの値を順番に加算していきます(ループ変数iの内容は「1→3→5...→99」と変化していきます)。そして変数iが99を超える前までは、加算処理が続き、変数iが99+2、つまり101になった時点でFor文を終了して次のプログラムである、計算結果を表示する行に進みます。
この「Sum=Sum+i」の部分はイメージ的には下記のような動きを行っています。
1=0+1
4=1+3
9=4+5
...
2500=2401+99
ちょっとわかりずらいですか?1行ずつ数字の動きを追ってみてください。右辺は「直前までの奇数の和(Sum)」+「新たに加算する奇数(i)」の形で、その計算結果を左辺の「奇数の和(Sum)」に代入し、これを次回の計算時に「直前までの奇数の和(Sum)」として再度右辺で利用するという流れです。
この部分について難しく感じる方は、下記の変数の加算の基礎についてかかれたブログも合わせてご覧ください。
今回、奇数の和の計算を実行するFor文について解説しましたが、偶数の和の計算を行う、もう1つのFor文も同じ動きとなります。
これ以降は、F8キーを何度も押していくのは大変のため、F5キーを押して、プログラムを最後まで実行しましょう。すると、イミディエイトウィンドウに下図のような結果が表示されます。
ここまではFor文による整数の和の計算の例について見てきました。少し難しかったでしょうか。For文による整数の和の計算は重要な動きですので、ぜひ理解してくださいね。
イミディエイトウィンドウは、次の例題のためにクリアしておきましょう。
2-2. 九九の計算
つづいては、For文の特徴を利用した九九の計算を行ってイミディエイトウィンドウに結果を表示してみたいと思います。先にプログラムからお見せしますね。
Sub TimesTable()
'変数の宣言
Dim i As Long
Dim j As Long
'九九の計算
For i=1 To 9
For j=1 To 9
Debug.Print i & "*" & j & "=" & i*j
Next j
Next i
End Sub
上記のプログラムについて、説明のために各行の先頭に行番号を付けたのが下記になります。※便宜上、行番号を付けていますが、実際には記述しませんのでご注意ください。
01. Sub TimesTable()
02. '変数の宣言
03. Dim i As Long
04. Dim j As Long
05.
06. '九九の計算
07. For i=1 To 9
08. For j=1 To 9
09. Debug.Print i & "*" & j & "=" & i*j
10. Next j
11. Next i
12.
13. End Sub
今回のプログラムも非常に重要ですので一緒に見ていきましょう。
<解説>
01,13行目について:
01行目はプログラムの先頭を表し、13行目はプログラムの末尾を表しています。
02,06行目について:
この部分はコメント行となりますので、何も処理は実行されません。
03,04行目について:
ここでは九九の計算で利用する数を変化させるための変数を準備しています。九九の計算は2つの整数の掛け算ですね。2つの数はそれぞれ別々に変化させる必要があるので整数を格納する2つの変数を宣言したというのが経緯です。変数の型はLong型になっていますが、九九の計算は数が小さいのでInteger型でもOKです。
05,12行目について:
この部分は空白行でプログラムを見やすくするための行です。この行も処理は実行されません。
07~11行目について:
これまで、For文についてお伝えしてきましたが、ここで少し変わった形のFor文が出てきましたね。
For文が2つあり、07,11行目ではループ変数として変数iが使われ、08,10行目ではループ変数として変数jが使われています。この07~11行目ですが、実は、07,11行目のFor文が08,10行目のFor文を包んでおり、この内側のFor文を「入れ子」と呼びます。また、For文は別名ループ文と呼ばれ、そのループが2つあることから「2重ループ」とも呼ばれます。内側のFor~Nextの部分は外側のForとNextの間にはさまれたプログラムの命令と考えると理解がはやいです。
このようにFor文を入れ子にして2重ループの文をプログラムで記述する際のポイントは、上記のように同じループ変数を使う外側のForとNextのセットが、同じループ変数を使う内側のForとNextのセットを包む必要があるという点です。上記の例では、Next j の文がNext i の外側(下側)に来てはいけないという点にご注意ください。
また、内側のForとNextのセットが外側のForとNextのセットより一段奥に記述されています。これもプログラムを見やすくする字下げという工夫です。For文が入れ子になる場合、このように外側と内側のFor文の対応が分かりやすいように字下げを行いますので合わせて覚えておいてください。
この07~11行目について簡単に説明すると07行目の外側のFor文のループ変数iが初期値「1」でスタートします。この変数iが「1」を保った状態で08行目のFor文に移ります。内側のFor文のループ変数jも初期値「1」からスタートしますが、外側の変数iが「1」で固定された状態で、変数jが「1」~「9」まで「1」ずつ変化しながら、ForとNextに囲まれた09行目の「Debug.Print i & "*" j & "=" i*j」の命令を実行します。
09行目は九九の計算結果の1つをイミディエイトウィンドウに表示する命令です。
つまり、外側のFor文のループ変数iが「1」の時、内側のFor文においては下記のような命令が実行されることになります。
Debug.Print 1 & "*" & 1 & "=" & 1*1
Debug.Print 1 & "*" & 2 & "=" & 1*2
Debug.Print 1 & "*" & 3 & "=" & 1*3
....
Debug.Print 1 & "*" & 9 & "=" & 1*9
09行目について補足すると、Debug.Printの命令で利用されている変数iやjは、その時点での変数の内容に置き換えられます。また文字は「"(ダブルクォーテーション)」で囲み、変数と文字は「&」記号で連結して1つの文章にしています。掛け算には「*」を利用します。「i*j」で変数同士を掛け算しています。
内側のFor文でループ変数jが終了値の「9」を超えたら、つまり「10」になったら外側のループ変数iを「2」に更新した後、再度内側のForの開始位置に戻り、ループ変数jを「1」に初期化した上で内側のFor文を実行します。(※1)つまりループ変数jが改めて「1」~「9」まで「1」ずつ変化しながら、内側のForとNextに囲まれた09行目の「Debug.Print i & "*" j & "=" i*j」の命令が実行されるということです。
※1について:外側のFor文のループ変数iの初期化が1回しか行われないのに対して内側のFor文のループ変数jが(外側のFor文の Next i の文の実行後に内側のFor文の開始位置に戻って)毎回初期化されるのは、内側のFor~Next jの入れ子の部分が外側のFor~Next iの間にはさまれた「繰り返し実行されるプログラムの命令部」として認識されているためです。
また、外側と内側のFor文には2点ほど異なる点があります。
<相違点その1>
外側のFor文のループ変数iが初期化されるのは1度だけですが(これはFor文の基本的な動きですね)、内側のFor文は、先ほどお伝えしたように外側のForとNext iの間に置かれた「ひとかたまりのプログラムの命令扱い」のため、内側のFor文の初回実行時(外側のFor文のループ変数iが「1」の時)と、外側のFor文のループ変数更新後(Next i 文を実行後)に内側のFor文のループ変数は毎回初期化される(jが「1」になる)という点です。
<相違点その2>
外側のForとNext iの間にあるプログラムの命令は内側の「For~Next j」を「ひとかたまりの命令」と考えると、この部分は9回実行されます。それに対して内側のForとNext jの間にあるプログラムの命令は「九九の計算結果の表示」で、外側のFor文による「9」回の繰り返しそれぞれに対して内側のFor文のループ変数jが「1」~「9」まで変化することによって、計9×9回、つまり81回実行されます。
上記の点については後述のフローチャートをご覧頂き理解を深めてください。
つまり、2重ループでは下記の【Step1】~【Step3】を繰り返すような動きをしています。
【Step1】
外側のFor文のループ変数の値を固定するイメージで【Step2】へ進みます。
【Step2】
内側のFor文の処理に移り、内側のFor文のループ変数を初期値から終了値まで変化させながら、内側のForとNextの間に囲まれたプログラムの命令を実行します。
【Step3】
内側のFor文のループ変数が終了値を超えたら、外側のFor文のループ変数を更新して(「直前のループ変数の値」+「増減値」に更新して)【Step1】に戻ります。
少し文章での説明がながくなりましたので、ここで九九の計算の2重ループについてのフローチャートをご覧ください。
ここまでで、九九の計算のプログラムについて説明してきましたが、実際にVBEのコード画面に九九の計算をするTimesTableのプログラムを入力して動かしてみましょう。
先ほど、下図のようにVBEの画面のMo04_Forというモジュールに「CalcSum」という名前のプログラムを作成しました。今回のブログではこのプログラムの上側にプログラムを入力していきたいと思います。ちょうど赤矢印の部分に入力しましょう。
プログラムを入力すると下図のようになりました。
プログラムは入力できましたでしょうか。それではプログラムを動かしてみましょう。通常、プログラムの動かす場合、動かしたいプログラムの中(このプログラムであれば、Sub TimesTable() と End Sub の間)にカーソルを置いてF5キーを押します。
この方法でもよいのですが、今回はステップ実行というプログラムを1行ずつ動かせる便利な機能を使って動かしてみたいと思います。カーソルを上記のようにプログラムの中に置いた状態でキーボードのF8キーを1回押してみてください。すると下図のように、プログラムの先頭が黄色でハイライトされました。
では、ここでキーボードのF8キーを1回押してみましょう。すると、下図のように外側のFor文の開始位置がハイライトされました。
この行はこれから実行される行で、まだ実行されていません。この時点での変数iの内容を確認してみましょう。マウスのカーソルを変数iの付近に近づけると下図の赤枠部のように変数iの内容は「0」であることが分かります。
それでは、F8キーをもう1回押してみましょう。すると下図のように内側のFor文の開始位置がハイライトされました。
この行はこれから実行される行で、まだ実行されていません。この時点での変数iと変数jの内容を確認してみましょう。マウスのカーソルを変数iと変数jの付近にそれぞれ近づけると下図の赤枠部のようになります。
変数iの内容は「1」,変数jの内容は「0」であることが分かりますね。直前で外側のFor文のハイライトが解除され、ループ変数iに初期値である「1」の代入処理が行われたことを意味しています。
それではF8キーをもう1回押してみましょう。すると下図のように九九の表示を行うDebug.Printの行がハイライトされました。
このハイライトされたDebug.Printの行は、これから実行される行でまだ実行されていません。この時点での変数iと変数jの内容を確認してみましょう。場所はどこでも大丈夫ですので「i」又は「j」と書かれた部分にマウスカーソルを近づけてみてください。するとそれぞれ下図の赤枠部のようになります。
変数iの内容は「1」,変数jの内容は「1」であることが分かりますね。直前で内側のFor文のハイライトが解除され、ループ変数jに初期値である「1」の代入処理が行われたことを意味しています。また、この時点で変数iと変数jには九九の計算の最初の組み合わせである「1」と「1」が正しく準備されていることが分かります。
それではF8キーをもう1回押してみましょう。すると直前のDebug.Printの行のハイライトが解除されて実行され、下図のようにイミディエイトウィンドウに九九の掛け算の1つ目が表示されます。また、内側のFor文のNext jの行がハイライトされます。
それでは、ここからはF8キーをどんどん押していき、イミディエイトウィンドウに下図のように九九の1の段が全て表示されたところで止めてください。(プログラム上ではNext j の部分がハイライトされた状態で止めてください。)
ここからが2重ループの重要な動きの確認になります。F8キーをもう1回押してみましょう。すると下図のように一旦、内側のFor~Next j のセットを終了して、外側のFor文のNext i の行がハイライトされました。
では、この時点で外側のFor文のループ変数iの内容を確認してみましょう。すると下図のようにこの時点では変数iの内容は「1」のままだとわかります。そうです、変数iはNext i の行が実行された時点で更新されるのでしたね。ハイライトされている行はまだ実行されていないので「1」のままというわけです。
ここからの動きも重要ですが、F8キーをもう1回押してみましょう。すると下図のように(内側のFor文の中のDebug.Printの命令ではなく)内側のFor文の開始位置がハイライトされました。つまりこれはどういうことかというと、内側のFor文のループ変数jがまた初期化されて「1」からスタートするということです。但し、この時点ではまだ、内側のFor文の初期化は実行されていません。
では、この時点での変数iと変数jの変数の内容を再度確認してみましょう。するとそれぞれ下図のようになります。
この時点で変数iは「2」,変数jは「10」になっています。この変数の動きについてご説明します。変数iは直前でNext i の行が実行されたことで「初期値+増減値」、つまり「1+1」に内容が更新されたことによります。
また変数jですが「1」になったと思いましたか?内側のFor文はハイライト状態のため、まだ変数jの初期化はおこなわれていません。先ほど、Next i の前にNext j の行が実行されたことを思い出してください。これにより変数jは「終了値+増減値」、つまり「9+1」で内容が更新されたことになります。また変数jの内容が「10」になったからこそ、一旦、内側のFor文が終了したのですね。
では、もう1回、F8キーを押してみましょう。すると、内側のFor文の開始位置のハイライトが解除されDebug.Printの行にハイライトが移りました。
では、この時点での変数jの内容を改めて確認してみましょう。マウスポインタを変数jに近づけてみると下図のようになっています。
変数jの内容が、ここで「1」に戻りました。これは直前で内側のFor文のループ変数jの初期化処理が行われたためです。
ではここで、F8キーをもう1回押してみましょう。すると、下図のように2の段の最初の組み合わせの結果が表示されます。
九九の掛け算はこのような流れで動いていきます。では、F5キーを押して、プログラムを最後まで実行しましょう。これで、下図のようにイミディエイトウィンドウに九九の結果が全て表示されます。
2重ループについて、初めは少し難しく感じるかもしれませんが、慣れれば簡単ですので、ぜひ理解してください。
3. まとめ
長くなりましたが、今回はFor文の利用用途とFor文による具体的なプログラムについてご紹介しました。
お疲れさまでした!
【電子書籍出版のご案内】
本ブログで扱っている「Excel VBA 入門」の内容が、内容を大幅に増やした形で電子書籍(Kindle)になりました。ご興味のある方は、ぜひご覧頂ければ幸いに存じます。
Excel VBA に挫折しないためのプログラミング超入門 (基礎から応用まで)