反復処理

ページ名:反復処理

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

 

シェアボタン: このページをSNSに投稿するのに便利です。

コメント

返信元返信をやめる

※ 悪質なユーザーの書き込みは制限します。

最新を表示する
kakeru

良い点
わかりやすく詳しく説明されていたので理解しやすかったです。
練習問題も様々なタイプの問題でよかったです。
改善点
強調できるところの色を変えればより見やすくなると思います。

返信
2018-10-23 13:29:18

Joru

文章がわかりやすいけど、エクセルの部分はちょっとわかりにくいと思う。文字よりScreenshotをとっとら方がわかりやすいと思います

返信
2018-10-23 13:24:04

ンゴ

はじめの「For a = X to Y」のところで、X, Yがそれぞれ何を意味するかを説明したほうが良いと思いました。「指定した作業を好きな回数繰り返す」とありますが、今の説明だと、どうやって回数を指定するのかわかりにくい気がします

返信
2018-10-23 13:24:03

yuri

よい点
赤字部分:Cells(1,1) = Cells(1,1) + 1 のコードの意味を日本語でも説明している点がより理解しやすく、プログラミング初心者の目線を大事にしていると感じた。
改善点:1、反復処理とは などタイトルの部分は文字の大きさを変えるとより見やすい気がします。

返信
2018-10-23 13:19:12

ンゴ

(下の続き)
上のように手動で書くと、それだけ手間がかかりますし、間違いを犯してしまう確率も高くなります。一方で、For~Nextステートメントを使用すると、以下のようなたった3行で同じ処理を実現することができます。

For a = 1 To 10
  Cells(a, 1) = Int(Rnd * 10) + 1
Next a

返信
2018-10-18 17:47:42

ンゴ

(下の続き)

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
(続く)

返信
2018-10-18 13:35:23

ンゴ

冒頭の部分は以下のような具体例があるとより良いと思います。

・・・・・
例えば、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
(続く)

返信
2018-10-18 13:35:10

gemba

良い点
表を用いて丁寧な説明がなされている点

改善できる点
文字続きで少し見にくいかも、、、
要所要所で字を大きくしたりするとわかりやすいと思います。

返信
2018-10-16 23:28:58

ンゴ

良い点
練習問題が充実していて良いと思いました。

改善点
細かい点ですが、「Cells(a,b) = a」は「Cells(a, b) = a」となりますね(カンマの後に半角スペースが必要)。

返信
2018-10-16 18:44:12

ンゴ

見出しはフォントを大きくすると、見やすくなると思います。

返信
2018-10-16 16:05:11

seina

良かったと思う点は、~しましょう、という表現や丁寧な説明が多いので、プログラミング初心者に寄り添ったような説明の仕方がされていて、本来は難しくて読みにくいプログラミングの説明を読みやすくしているところ。
改善したほうがいいと思った点は、二重ループの説明をもう少し詳しくしてほしかったです。

返信
2018-10-16 14:22:40

NG表示方式

NGID一覧