1.反復処理(For~Nextステートメント)とは
反復処理(For~Nextステートメント)とは、指定した作業を好きな回数繰り返すための構文で
For a = X to Y
作業を行うプログラム
Next a
の形で表されることが一般的です。
xには始まりの数字、yには終わりの数字が入ります。
多くの時間と手間がかかるような繰り返しを、反復処理を使うことで簡単かつ比較的短時間で終えることができます。
例えば、A1からA10セルに、1~10の間の乱数を入力するプログラムを考えてみましょう。For~Nextステートメントを使用しないと、以下のようにコードを10行書く必要があります。
Cells(1, 1) = Int(Rnd * 10) + 1
Cells(2, 1) = Int(Rnd * 10) + 1
Cells(3, 1) = Int(Rnd * 10) + 1
Cells(4, 1) = Int(Rnd * 10) + 1
Cells(5, 1) = Int(Rnd * 10) + 1
Cells(6, 1) = Int(Rnd * 10) + 1
Cells(7, 1) = Int(Rnd * 10) + 1
Cells(8, 1) = Int(Rnd * 10) + 1
Cells(9, 1) = Int(Rnd * 10) + 1
Cells(10, 1) = Int(Rnd * 10) + 1
上のように手動で書くと、それだけ手間がかかりますし、間違いを犯してしまう確率も高くなります。一方で、For~Nextステートメントを使用すると、以下のようなたった3行で同じ処理を実現することができます。
For a = 1 To 10
Cells(a, 1) = Int(Rnd * 10) + 1
Next a
これから反復処理がどのようなものかを一緒に見ていきます。
2.For~Nextステートメントの使い方
Dim a
Cells(1,1) = 0
For a = 1 to 10
Cells(1,1) = Cells(1,1) + 1
Next a
【解説】
まず変数aを宣言します
次にエクセルのCells(1,1)に0が入ります
ここから反復処理を行います。
まず赤色のセンテンスの処理から見ていきましょう。
これは[Cells(1,1)に今Cells(1,1)に入っている数値に1を足した数値を入れてください]という文章で、
0 + 1 = 1
となり、Cells(1,1)には1が入ります
この作業を規定回数繰り返します。
この例文ではFor a = 1 to 10と回数指定しているので赤色の文章を1回から10回繰り返して下さいということになります。よって、Cells(1,1)には10が入ります。
では、この反復処理をどういった場面で活用することができるでしょうか。
Cells(a,1) の列(縦)にランダムに様々な数字が10個記入されているとします。
この時全ての数値を自動的に奇数か偶数かを判断するプログラムを簡単に組むことができます。
以下の例を見てください。
A | B | C | |
1 | 28 | ||
2 | 11 | ||
~ | |||
9 | 42 | ||
10 | 51 |
もし、Cells(1,1)のみを判定したいのであれば、以下の式を使います。
If Cells(1, 1) Mod 2 = 0 Then
Cells(1, 2) = "偶数"
Else
Cells(1, 2) = "奇数"
End If
これを用いて10個の数字を判断するには、Cells(1,1)の部分を(2,1) (3,1)・・・(10,1)として10個の式を書く必要があります。
しかし反復処理を活用することで以下のようにまとめる事ができます。
Dim a
For a = 1 To 10
If Cells(a, 1) Mod 2 = 0 Then
Cells(a, 2) = "偶数"
Else
Cells(a, 2) ="奇数"
End If
Next a
これは作業を10回繰り返す中でaの数値も変動しています。
1回目の作業にはa=1つまりcells(1,1)
2回目にはa=2つまりCells(2,1)というように作業ごとに判断するセルが変動し、結果1回実行する事で10個のセル全てを判断する事ができます。
また反復処理は必ずしも一つ刻みでなければできない訳ではありません
For a = 1 to 10 step 2にすることで、aに入る値を二つ飛ばしにすることができます。つまり、作業は1,3,5,7,9の五回繰り返されることになります
また一つの式に対して反復処理が一つという訳ではありません。
For a = X to Y
For b = X to Y
(繰り返し行いたい処理)
Next b
Next a
というようにある反復処理そのものを繰り返させる事もできます。(二重ループ)
実際に二重ループの活用例を見ていきましょう。
Sub nizyu()
Dim a,b
For a = 1 to 3
For b = 1 to 5
Cells(a,b) = a
Next b
Next a
End sub
このプログラムを実行するとどうなるでしょうか。
変数bに対しては5回、変数aに対しては3回の繰り返し処理が行われます。
処理の順序としてはまず
aの繰り返し処理一回目つまりCells(1,b)に対する処理が行われます。
この処理の中でbに対する処理を5回繰り返します。
この一連の作業を3かい繰り返す事で作業は完了します。
イメージとしては
Cells(1,1)→(1,2)→(1,3)→(1,4)→(1,5)→(2,1)→(2,2)・・・(3,4)→(3,5)
といったようにaの繰り返しの最中にbが繰り返されているということになります。
ですので上の例の結果は以下になります。
A | B | C | D | E | |
1 | 1 | 1 | 1 | 1 | 1 |
2 | 2 | 2 | 2 | 2 | 2 |
3 | 3 | 3 | 3 | 3 | 3 |
3.練習問題
Q1.
以下のプログラムで誤っているところはどこでしょうか。
Sub practice()
Dim a
For a = 1 to 10
Cells(a,1)=Cells(a,1)+1
End Sub
Q 2
.ExcelのA列に20個不規則な数値が入力されています。これら全てを3の倍数か3の倍数ではないかを判断するにはどのような式を作ればよいでしょうか。
Q3.
次のプログラムを実行すると、エクセルのどの部分にどんな数値が入るでしょうか。
Sub kurikaeshi()
For a = 1 To 10
Cells(a, a) = Cells(a, a) + 1
Next a
End Sub
Q4.
A列1から100まで、一段おきに奇数(1,3,5,7...)を入れたいとき、どのようなプログラムを書けばよいでしょうか。
回答
A1.
Next aが抜けています。
A2.
Sub sannobaisu()
Dim a
For a = 1 To 10
If Cells(a, 1) Mod 3 = 0 Then
Cells(a, 3) = "3の倍数です"
Else
Cells(a, 3) = "3の倍数ではありません"
End If
Next a
End Sub
A3.
A1からJ10まで一段ずつ右下がりに1が入る。
A4.
Sub kurikaeshi()
For a = 1 To 100 Step 2
Cells(a, 1) = a
Next a
End Sub
コメント
最新を表示する
良い点
わかりやすく詳しく説明されていたので理解しやすかったです。
練習問題も様々なタイプの問題でよかったです。
改善点
強調できるところの色を変えればより見やすくなると思います。
文章がわかりやすいけど、エクセルの部分はちょっとわかりにくいと思う。文字よりScreenshotをとっとら方がわかりやすいと思います
はじめの「For a = X to Y」のところで、X, Yがそれぞれ何を意味するかを説明したほうが良いと思いました。「指定した作業を好きな回数繰り返す」とありますが、今の説明だと、どうやって回数を指定するのかわかりにくい気がします
よい点
赤字部分:Cells(1,1) = Cells(1,1) + 1 のコードの意味を日本語でも説明している点がより理解しやすく、プログラミング初心者の目線を大事にしていると感じた。
改善点:1、反復処理とは などタイトルの部分は文字の大きさを変えるとより見やすい気がします。
(下の続き)
上のように手動で書くと、それだけ手間がかかりますし、間違いを犯してしまう確率も高くなります。一方で、For~Nextステートメントを使用すると、以下のようなたった3行で同じ処理を実現することができます。
For a = 1 To 10
Cells(a, 1) = Int(Rnd * 10) + 1
Next a
(下の続き)
Cells(4, 1) = Int(Rnd * 10) + 1
Cells(5, 1) = Int(Rnd * 10) + 1
Cells(6, 1) = Int(Rnd * 10) + 1
Cells(7, 1) = Int(Rnd * 10) + 1
Cells(8, 1) = Int(Rnd * 10) + 1
Cells(9, 1) = Int(Rnd * 10) + 1
Cells(10, 1) = Int(Rnd * 10) + 1
(続く)
冒頭の部分は以下のような具体例があるとより良いと思います。
・・・・・
例えば、A1からA10セルに、1~10の間の乱数を入力するプログラムを考えてみましょう。For~Nextステートメントを使用しないと、以下のようにコードを10行書く必要があります。
Cells(1, 1) = Int(Rnd * 10) + 1
Cells(2, 1) = Int(Rnd * 10) + 1
Cells(3, 1) = Int(Rnd * 10) + 1
(続く)
良い点
表を用いて丁寧な説明がなされている点
改善できる点
文字続きで少し見にくいかも、、、
要所要所で字を大きくしたりするとわかりやすいと思います。
良い点
練習問題が充実していて良いと思いました。
改善点
細かい点ですが、「Cells(a,b) = a」は「Cells(a, b) = a」となりますね(カンマの後に半角スペースが必要)。
見出しはフォントを大きくすると、見やすくなると思います。
良かったと思う点は、~しましょう、という表現や丁寧な説明が多いので、プログラミング初心者に寄り添ったような説明の仕方がされていて、本来は難しくて読みにくいプログラミングの説明を読みやすくしているところ。
改善したほうがいいと思った点は、二重ループの説明をもう少し詳しくしてほしかったです。
NG表示方式
NGID一覧