【ループ処理でセルに値を書きこむ】
1 多数のセルの行番号と列番号を直接指定して値を書きこむ
2 多数のセルの行番号と列番号を変数と定数で指定して値を書きこむ
3 ループ処理で多数行のセルに値を書きこむ
4 ループ処理で多数列のセルに値を書きこむ
5 ダブルループ処理で多数行×多数列のセルに値を書きこむ
ループ処理で多数行のセルに値を書きこむ
パイさん
「二つ目の基本構造、それはループ(繰り返し)処理です。
Excel VBA/マクロのループ(繰り返し)処理をつかえば、
多数行に係る順次処理を一つの順次処理にまとめることができます。
例え100万行の順次処理でも一つの順次処理にまとめることができます。」
ソンくん
「ループ処理って、なんですか。」
パイさん
「ループ処理とは同じ処理を何度もくり返し実行するということです。
ここで、ループ処理の構文として、For文を紹介します。」
パイさん
「このように、For文は、『For』の次にセットされた変数を、開始値から終了値になるまで、
1ずつカウントアップさせながら、ForとNextに、はさまれた順次処理をくり返し実行します。」
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文は、次のようになります。」
パイさん
「この行番号のループ処理を実行するための構文をつかって、
マクロ『行番号と列番号を変数と定数で指定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』をブロックの最後に必ず記述するようにします。」
パイさん
「それでは、いったん全てのセルの値をクリアしてから、そのマクロを実行してみましょう。」
ソンくん
「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文をつかうことで一つの順次処理にまとまりました。
それでは、いったん全てのセルの値をクリアしてから、そのマクロを実行してみましょう。」
ソンくん
「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文をつかうことで一つの順次処理にまとまりました。
それでは、いったん全てのセルの値をクリアしてから、そのマクロを実行してみましょう。」
ソンくん
「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文をつかうことで一つの順次処理にまとまりました。
それでは、いったん全てのセルの値をクリアしてから、そのマクロを実行してみましょう。」
ソンくん
「1行目から1000行目で、1列目のセルに、『X行1列』が書きこまれました。」
パイさん
「このように、例え10000行、100000行、1000000行、1048576行と
行数がどんなに増えたとしても、
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文をつかえば、多数行に係る順次処理が、
一つの順次処理にまとめられて、多数行のセルに値を書きこむことができるという話でした。
では、列数が増えたときは、どうすればよいのでしょうか。
これについては、次回『ループ処理で多数列のセルに値を書きこむ』で紹介します。」