【ループ処理でセルに値を書きこむ】
1 多数のセルの行番号と列番号を直接指定して値を書きこむ
2 多数のセルの行番号と列番号を変数と定数で指定して値を書きこむ
3 ループ処理で多数行のセルに値を書きこむ
4 ループ処理で多数列のセルに値を書きこむ
5 ダブルループ処理で多数行×多数列のセルに値を書きこむ
ループ処理で多数列のセルに値を書きこむ
パイさん
「前回『ループ処理で多数行のセルに値を書きこむ』は、
行数がどんなに増えたとしても、
For文をつかえば一つの順次処理にまとめられるという話でした。
では、列数が増えたときは、どうすればよいのでしょうか。」
ソンくん
「列数がどんなに増えたとしても、
For文をつかえば一つの順次処理にまとめられるのではないかな。」
パイさん
「その通りです。
Excel VBA/マクロのループ(繰り返し)処理をつかえば、
多数列に係る順次処理を一つの順次処理にまとめることができます。
例え1万列の順次処理でも一つの順次処理にまとめることができます。
ループ処理の構文として、For文を再び紹介します。」
パイさん
「このように、For文は、『For』の次にセットされた変数を、開始値から終了値になるまで、
1ずつカウントアップさせながら、ForとNextに、はさまれた順次処理をくり返し実行します。」
1. 1行・1~3列
パイさん
「行を1行目に固定して、列を1列目から3列目まで1列ずつカウントアップしていき、
3つのセルに対して、『1行Y列』を設定しましょう。」
ソンくん
「今度の問題は、『行番号と列番号を変数と定数で指定して書きこむ』の 3.1行・1~3列と同じ問題ですね。」
パイさん
「そのときにつくったマクロ『行番号と列番号を変数と定数で指定3』を記載します。」
Sub 行番号と列番号を変数と定数で指定3()
Const 行 = 1
Dim 列 As Integer
列 = 1
Cells(行, 列).Value = "1行1列"
列 = 2
Cells(行, 列).Value = "1行2列"
列 = 3
Cells(行, 列).Value = "1行3列"
End Sub
ソンくん
「列に係る順次処理を3回も書いています。ここは、ループ処理の出番ですね。」
パイさん
『行』の定数宣言と『列』の変数宣言はそのままのこして、
For文をつかって、3回の順次処理を一つにまとめてみましょう。」
変数『列番号』を、開始列から終了列になるまで1ずつカウントアップさせながら、
セルに値を書きこむ順次処理をくり返し実行するFor文は、次のようになります。」
パイさん
「この列番号のループ処理を実行するための構文をつかって、
マクロ『行番号と列番号を変数と定数で指定3』をまとめると、次のようになります。」
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行』と 変数『列』と 『列』を文字連結した値を設定する
という意味です。
それでは、いったん全てのセルの値をクリアしてから、そのマクロを実行してみましょう。」
ソンくん
「1行目・1列目のセルに『1行1列』、
1行目・2列目のセルに『1行2列』、
1行目・3列目のセルに『1行3列』、が書きこまれました。」
2. 1行・1~10列
パイさん
「行を1行目に固定して、列を1列目から10列目まで1列ずつカウントアップしていき、
10のセルに対して、『1行Y列』を設定しましょう。」
ソンくん
「今度の問題も、ループ処理を利用できそうですね。
一つ前の問題は、『列を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列』、
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列』、が書きこまれました。」
3. 1行・1~100列
パイさん
「ループ処理の終了値を100まで増やします。
行を1行目に固定して、列を1列目から100列目まで1列ずつカウントアップしていき、
100のセルに対して、『1行Y列』を設定しましょう。」
ソンくん
「今度の問題も、ループ処理を利用する問題ですね。
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行目のセルに、『1行Y列』が書きこまれました。」
4. 1行・1~1000列
パイさん
「ループ処理の終了値をいっきに1000まで増やします。
行を1行目に固定して、列を1列目から1000列目まで1列ずつカウントアップしていき、
1000のセルに対して、『1行Y列』を設定しましょう。」
ソンくん
「今度の問題も、ループ処理を利用します。
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
End Sub
パイさん
「1000列に係る順次処理が、For文をつかうことで一つの順次処理にまとまりました。
それでは、いったん全てのセルの値をクリアしてからそのマクロを実行してみましょう。
ちょっとその前に、ここで全てのセルの値をクリアする技を伝授します。
列記号の最も左、行番号の最も上の空白のマス(赤枠)をクリックします。」
ソンくん
「全てのセルの色が暗くなりました。」
パイさん
「これは、全てのセルが選択されている状態です。この状態で、Deleteキーを打ってください。」
ソンくん
「全てのセルの値がクリアされました。」
パイさん
「次に、選択されているセルを『A1』に変更します。CtrlキーとHomeキーを同時に打ってください。」
ソンくん
「セル『A1』が選択されました。」
パイさん
「このように、全てのセルを選択している状態で、Deleteキーを打てば、全てのセルの値がクリアされます。
また、CtrlキーとAキーを同時に打ったときも全てのセルを選択している状態になります。
こちらも、ためしてみてください。それでは、そのマクロを実行してみましょう。」
ソンくん
「1列目から1000列目で、1行目のセルに、『1行Y列』が書きこまれました。」
パイさん
「このように、例え1000列、、1000列、16384列と列数がどんなに増えたとしても、
For文をつかえば、多数列に係る順次処理が、一つの順次処理にまとめられます。
試しにFor文の開始列・終了列と行番号の定数に設定する値を適当な数字に書きかえて、
マクロを実行して、多数列のセルに値が書きこまれることを確かめてみましょう。
(1) 2列目から200列目まで、2行目のセルに、『2行Y列』を、
(2) 30列目から3000列目まで、3行目のセルに、『3行Y列』を、
(3) 160列目から16000列目まで、40行目のセルに、『40行Y列』を、代入してみましょう。
-
演習(1):マクロ『列番号をカウントアップするループ処理』
2列目から200列目まで、2行目のセルに、『2行Y列』を代入
-
Sub 列番号をカウントアップするループ処理()
Const 行 = 2
Dim 列 As Integer
For 列 = 2 To 200
Cells(行, 列).Value = "2行" & 列 & "列"
Next
End Sub
-
演習(2):マクロ『列番号をカウントアップするループ処理』
30列目から3000列目まで、3行目のセルに、『3行Y列』を代入
-
Sub 列番号をカウントアップするループ処理()
Const 行 = 3
Dim 列 As Integer
For 列 = 30 To 3000
Cells(行, 列).Value = "3行" & 列 & "列"
Next
End Sub
-
演習(3):マクロ『列番号をカウントアップするループ処理』
160列目から16000列目まで、40行目のセルに、『40行Y列』を代入
-
Sub 列番号をカウントアップするループ処理()
Const 行 = 40
Dim 列 As Integer
For 列 = 160 To 16000
Cells(行, 列).Value = "40行" & 列 & "列"
Next
End Sub
今回は、列数がどんなに増えたとしても、
For文をつかえば、多数列に係る順次処理が、一つの順次処理にまとめられて、
多数列のセルに値を書きこむことができるという話でした。
では、行数と列数の両方とも増えたときは、どうすればよいのでしょうか。
これについては、
次回『ループ処理で多数行×多数列のセルに値を書きこむ』で紹介します。」