【ループ処理でセルに値を書きこむ】

 1 多数のセルの行番号と列番号を直接指定して値を書きこむ

 2 多数のセルの行番号と列番号を変数と定数で指定して値を書きこむ

 3 ループ処理で多数行のセルに値を書きこむ

 4 ループ処理で多数列のセルに値を書きこむ

 5 ダブルループ処理で多数行×多数列のセルに値を書きこむ

ループ処理で多数行のセルに値を書きこむ

パイさん

二つ目の基本構造、それはループ(繰り返し)処理です。

 

 Excel VBA/マクロのループ(繰り返し)処理をつかえば、

 多数行に係る順次処理を一つの順次処理にまとめることができます。

 例え100万行の順次処理でも一つの順次処理にまとめることができます。

ソンくん

ループ処理って、なんですか。」

パイさん

ループ処理とは同じ処理を何度もくり返し実行するということです。

 ここで、ループ処理の構文として、Forを紹介します。」

Img3_3_1

パイさん

「このように、Forは、『For』の次にセットされた変数を、開始値から終了値になるまで、

 1ずつカウントアップさせながら、ForNextに、はさまれた順次処理をくり返し実行します。」



1. 1~3行・1列

パイさん

列を1列目に固定して、行を1行目から3行目まで1行ずつカウントアップしていき、

 3つのセルに対して、『X行1列』を設定しましょう。」

ソンくん

「今度の問題は、『行番号と列番号を変数と定数で指定して書きこむ』の 2.1~3行・1列と同じ問題ですね。」

パイさん

「そのときにつくったマクロ『行番号と列番号を変数と定数で指定2』を記載します。」

Sub 行番号と列番号を変数と定数で指定2()

 Const = 1

 Dim As Integer

  = 1

 Cells(, ).Value = "1行1列"

  = 2

 Cells(, ).Value = "2行1列"

  = 3

 Cells(, ).Value = "3行1列"

End Sub

ソンくん

に係る順次処理3回も書いています。一つにまとめられないのかな。」

パイさん

「いいところに気がつきましたね。ここで、ループ処理の出番となります。

 』の定数宣言と『』の変数宣言はそのままのこして

 Forをつかって、3回の順次処理を一つにまとめてみましょう。

 

 変数『行番号を、開始行から終了行になるまで1ずつカウントアップさせながら、

 セルに値を書きこむ順次処理をくり返し実行するForは、次のようになります。」

Img3_3_2

パイさん

「この行番号のループ処理を実行するための構文をつかって、

 マクロ『行番号と列番号を変数と定数で指定2』をまとめると、次のようになります。」

Sub 行番号をカウントアップするループ処理1()

 Const = 1

 Dim As Integer

 For = 1 To 3

 Cells(, ).Value = & "行1列"

 Next

End Sub

ソンくん

3に係る順次処理が、Forをつかうことで一つの順次処理にまとまりました。

パイさん

「今回のコードを解説します。

 『For = 1 To 3』から『Next』までが、ループ処理のブロックとなっていて、

 『Cells(, ).Value = & "行1列"』がくり返し実行される処理となっています。

 

 『&』は、左の文字列右の文字列結合する演算子です。

 『 & "行1列"』は、1ずつカウントアップされていく変数『『行1列』

 演算子『&』で結合するという意味です。

 

 『For = 1 To 3』は、変数『開始行『1から終了行『3まで1ずつカウントアップ

 していくということです。

 

 つまり、

 For = 1 To 3

   Cells(, ).Value = & "行1列"

 Next

 とは、

 変数『開始行『1から終了行『3まで1ずつカウントアップしながら、

 変数『定数『のセルに対して、変数『『行1列』文字連結した値を設定する

 という意味です。」

ソンくん

「『Next』はどういう意味ですか。Forを記述するときに『Next』を省略することはできますか。」

パイさん

Next』はカウンタ変数をカウントアップするという意味があるのと同時に、

 ループ処理のブロックの終わりを意味します。

 今回は、『Cells(, ).Value = & "行1列"』というように、

 くり返し実行される処理が一つだけですが、

 くり返し実行される処理は、場合によっては一つだけとは限らず2・3個から数十個のときもあります。

 そうしたときにくり返し実行される処理がどこまでかを明確にするためにも『Next』がつかわれます。

 『For』からループ処理を記述するときは必ず『Next』で締めくくる必要があり、

 Forを記述するときに『Next』を省略することは絶対にできません。」

ソンくん

「わかりました。ループ処理の始まりとして『For』を書き始めたときは、

 ループ処理ブロックの締めくくりとなる『Next』をブロックの最後に必ず記述するようにします。」

 

パイさん

「それでは、いったん全てのセルの値をクリアしてから、そのマクロを実行してみましょう。」

Img3_3_4

ソンくん

「1行目・1列目のセルに『1行1列』、

 2行目・1列目のセルに『2行1列』、

 3行目・1列目のセルに『3行1列』、が書きこまれました。」


2. 1~10行・1列

パイさん

列を1列目に固定して、行を1行目から10行目まで1行ずつカウントアップしていき、

 10のセルに対して、『X行1列』を設定しましょう。」

ソンくん

「今度の問題も、ループ処理を利用できそうですね。

パイさん

「その通りです。実は一つ前につくったマクロを一か所書きかえるだけでいいのです。」

ソンくん

「一つ前の問題は、『行を1行目から3行目まで1行ずつカウントアップ』するのに対して、

 今度の問題は、『行を1行目から10行目まで1行ずつカウントアップ』するということで、

 カウントアップの終了値が変わるだけですね。

 Forでは、『To』の次に、終了値を記述することになっているから、

 さきほどのマクロの『For 行 = 1 To 3』を、『For 行 = 1 To 10』に書きかえるだけですね。」

Sub 行番号をカウントアップするループ処理2()

 Const = 1

 Dim As Integer

 For = 1 To 10

 Cells(, ).Value = & "行1列"

 Next

End Sub

パイさん

10に係る順次処理が、Forをつかうことで一つの順次処理にまとまりました。

 それでは、いったん全てのセルの値をクリアしてから、そのマクロを実行してみましょう。」

Img3_3_6

ソンくん

「1行目・1列目のセルに『1行1列』、

 2行目・1列目のセルに『2行1列』、

 3行目・1列目のセルに『3行1列』、

 4行目・1列目のセルに『4行1列』、

 5行目・1列目のセルに『5行1列』、

 6行目・1列目のセルに『6行1列』、

 7行目・1列目のセルに『7行1列』、

 8行目・1列目のセルに『8行1列』、

 9行目・1列目のセルに『9行1列』、

 10行目・1列目のセルに『10行1列』、が書きこまれました。」


3. 1~100行・1列

パイさん

ループ処理終了値100まで増やします。

 列を1列目に固定して、行を1行目から100行目まで1行ずつカウントアップしていき、

 100のセルに対して、『X行1列』を設定しましょう。」

ソンくん

「今度の問題も、ループ処理を利用する問題ですね。

 Forでは、『To』の次に、終了値を記述することになっているから、

 さきほどのマクロの『For 行 = 1 To 10』を、『For 行 = 1 To 100』に書きかえるだけですね。」

Sub 行番号をカウントアップするループ処理3()

 Const = 1

 Dim As Integer

 For = 1 To 100

 Cells(, ).Value = & "行1列"

 Next

End Sub

パイさん

100に係る順次処理が、Forをつかうことで一つの順次処理にまとまりました。

 それでは、いったん全てのセルの値をクリアしてから、そのマクロを実行してみましょう。」

Img3_3_8

ソンくん

「1行目から100行目で、1列目のセルに、『X行1列』が書きこまれました。」


4. 1~1000行・1列

パイさん

ループ処理終了値をいっきに1000まで増やします。

 列を1列目に固定して、行を1行目から1000行目まで1行ずつカウントアップしていき、

 1000のセルに対して、『X行1列』を設定しましょう。」

ソンくん

「今度の問題も、ループ処理を利用します。

 Forでは、『To』の次に、終了値を記述することになっているから、

 さきほどのマクロの『For 行 = 1 To 100』を、『For 行 = 1 To 1000』に書きかえます。」

Sub 行番号をカウントアップするループ処理4()

 Const = 1

 Dim As Integer

 For = 1 To 1000

 Cells(, ).Value = & "行1列"

 Next

パイさん

1000に係る順次処理が、Forをつかうことで一つの順次処理にまとまりました。

 それでは、いったん全てのセルの値をクリアしてから、そのマクロを実行してみましょう。」

Img3_3_10

ソンくん

「1行目から1000行目で、1列目のセルに、『X行1列』が書きこまれました。」


パイさん

「このように、例え1000010000010000001048576

 行数がどんなに増えたとしても、

 Forをつかえば、多数行に係る順次処理が、一つの順次処理にまとめられます。

 ただし、終了行32767以上になるとオーバーフローしました』というエラーメッセージが表示されます。

 これは、変数『データ型数値型-整数型の『Integer』となっているためです。

 数値型-整数型の『Integer』は-32,768から32,767までの間の整数しか格納できません。

 そこで、数値型-長整数型の『Long』の出番となります。

 数値型-長整数型の『Long』は、-2,147,483,648から2,147,483,647までの間の整数を

 格納できます。

 終了行32767以上になるときは、変数『データ型数値型-長整数型の『Long

 としましょう。

Sub 行番号をカウントアップするループ処理4_2()

 Const = 1

 Dim As Long

 For = 1 To 32767

 Cells(, ).Value = & "行1列"

 Next

 

 試しにForの開始行・終了行と列番号の定数に設定する値を適当な数字に書きかえて、

 マクロを実行して、多数行のセルに値が書きこまれることを確かめてみましょう。

 (1) 2行目から200行目まで、2列目のセルに、『X行2列』を、

 (2) 30行目から3000行目まで、3列目のセルに、『X行3列』を、

 (3) 400行目から40000行目まで、4列目のセルに、『X行4列』を、代入してみましょう。

演習(1):マクロ『行番号をカウントアップするループ処理』

2行目から200行目まで、2列目のセルに、『X行2列』を代入

Sub 行番号をカウントアップするループ処理()

 Const 列 = 2

 Dim 行 As Integer

 For 行 = 2 To 200

 Cells(行, 列).Value = 行 & "行2列"

 Next

End Sub

 

演習(2):マクロ『行番号をカウントアップするループ処理』

30行目から3000行目まで、3列目のセルに、『X行3列』を代入

Sub 行番号をカウントアップするループ処理()

 Const 列 = 3

 Dim 行 As Integer

 For 行 = 30 To 3000

 Cells(行, 列).Value = 行 & "行3列"

 Next

End Sub

 

演習(3):マクロ『行番号をカウントアップするループ処理』

400行目から40000行目まで、4列目のセルに、『X行4列』を代入

Sub 行番号をカウントアップするループ処理()

 Const 列 = 4

 Dim 行 As long

 For 行 = 400 To 40000

 Cells(行, 列).Value = 行 & "行4列"

 Next

End Sub

 

 今回は、行数がどんなに増えたとしても、Forをつかえば、多数行に係る順次処理が、

 一つの順次処理にまとめられて、多数行のセルに値を書きこむことができるという話でした。

 では、列数が増えたときは、どうすればよいのでしょうか。

 これについては、次回『ループ処理で多数列のセルに値を書きこむ』で紹介します。」