【ループ処理でセルに値を書きこむ】
1 多数のセルの行番号と列番号を直接指定して値を書きこむ
2 多数のセルの行番号と列番号を変数と定数で指定して値を書きこむ
3 ループ処理で多数行のセルに値を書きこむ
4 ループ処理で多数列のセルに値を書きこむ
5 ダブルループ処理で多数行×多数列のセルに値を書きこむ
ダブルループ処理で多数行×多数列のセルに値を書きこむ
パイさん
「前々回『ループ処理で多数行のセルに値を書きこむ』は、
行数がどんなに増えたとしても、
For文をつかえば一つの順次処理にまとめられるという話でした。
前回『ループ処理で多数列のセルに値を書きこむ』は、
列数がどんなに増えたとしても、
For文をつかえば一つの順次処理にまとめられるという話でした。
では、行数と列数の両方とも増えたときは、どうすればよいのでしょうか。」
ソンくん
「行数と列数の両方がどんなに増えたとしても、
多数行に係るFor文と多数列に係るFor文を組み合わせれば
一つの順次処理にまとめられるのではないかな。」
パイさん
「その通りです。
Excel VBA/マクロでは、二つ以上のループ処理を組み合わせることもできます。
Excel VBA/マクロのダブルループ処理をつかえば、
多数行×多数列に係る順次処理を一つの順次処理にまとめることができます。
変数『行番号』を、開始行から終了行になるまで1ずつカウントアップさせながら、
併せて、変数『列番号』を、開始列から終了列になるまで1ずつカウントアップさせて、
セルに値を書きこむ順次処理をくり返し実行する二重For文は、次のようになります。」
パイさん
「今回は、行に係るループ処理と列に係るループ処理を組み合わせて、
行番号をカウントアップしていきながら、列番号をカウントアップしていき、
X行×Y列のセルに値を書きこんでみましょう。」
1. 1~3行・1~3列
パイさん
「行を1行目から3行目まで1行ずつカウントアップしていきながら、
列を1列目から3列目まで1列ずつカウントアップしていき、
3行×3列のセルに対して、『X行Y列』を設定しましょう。」
ソンくん
「今度の問題は、『行番号と列番号を変数と定数で指定して書きこむ』の 4.1~3行・1~3列と同じ問題ですね。」
パイさん
「そのときにつくったマクロ『行番号と列番号を変数と定数で指定4』を記載します。」
Sub 行番号と列番号を変数と定数で指定4()
Dim 行 As Integer
Dim 列 As Integer
行 = 1
列 = 1
Cells(行, 列).Value = "1行1列"
列 = 2
Cells(行, 列).Value = "1行2列"
列 = 3
Cells(行, 列).Value = "1行3列"
行 = 2
列 = 1
Cells(行, 列).Value = "2行1列"
列 = 2
Cells(行, 列).Value = "2行2列"
列 = 3
Cells(行, 列).Value = "2行3列"
行 = 3
列 = 1
Cells(行, 列).Value = "3行1列"
列 = 2
Cells(行, 列).Value = "3行2列"
列 = 3
Cells(行, 列).Value = "3行3列"
End Sub
ソンくん
「行×列に係る順次処理を9回も書いています。ここは、ループ処理の出番ですね。」
パイさん
『行』の変数宣言と『列』の変数宣言はそのままのこして、
For文をつかって、9回の順次処理を一つにまとめてみましょう。」
Sub 行番号と列番号をカウントアップするループ処理1()
Dim 行 As Integer
Dim 列 As Integer
For 行 = 1 To 3
For 列 = 1 To 3
Cells(行, 列).Value = 行 & "行" & 列 & "列"
Next
Next
End Sub
ソンくん
「3行×3列に係る順次処理が、二つのFor文をつかうことで一つの順次処理にまとまりました。」
パイさん
「今回のコードを解説します。
行を1行目から3行目まで1行ずつカウントアップするということから、開始行は『1』、終了行は『3』となり、
行に関するFor文は、
For 行 = 1 To 3
-----
Next
になります。
列を1列目から3列目まで1列ずつカウントアップするということから、開始列は『1』、終了列は『3』となり、
列に関するFor文は、
For 列 = 1 To 3
-----
Next
になります。
セルに対して、『X行Y列』を設定するということから、処理は、
Cells(行, 列).Value = 行 & "行" & 列 & "列"
になります。
次に、『行と列の二つのループ処理を行うための構文』を参考にしながら、
二つのFor文と順次処理を組み合わせていきます。
For 行 = 1 To 3
For 列 = 1 To 3
Cells(行, 列).Value = 行 & "行" & 列 & "列"
Next
Next
と記述します。
それでは、いったん全てのセルの値をクリアしてから、そのマクロを実行してみましょう。」
ソンくん
「1行目から3行目で、1列目から3列目のセルに、つまり3行×3列のセルに『X行Y列』が書きこまれました。」
2. 1~10行・1~10列
パイさん
「行を1行目から10行目まで1行ずつカウントアップしていきながら、
列を1列目から10列目まで1列ずつカウントアップしていき、
10行×10列のセルに対して、『X行Y列』を設定しましょう。」
ソンくん
「今度の問題も、二つのループ処理を利用できそうですね。
For文では、『To』の次に、終了値を記述することになっているから、
さきほどのマクロの
『For 行 = 1 To 3』を、『For 行 = 1 To 10』に
『For 列 = 1 To 3』を、『For 列 = 1 To 10』に
書きかえるだけですね。」
Sub 行番号と列番号をカウントアップするループ処理2()
Dim 行 As Integer
Dim 列 As Integer
For 行 = 1 To 10
For 列 = 1 To 10
Cells(行, 列).Value = 行 & "行" & 列 & "列"
Next
Next
End Sub
パイさん
「10行×10列に係る順次処理が、二つのFor文をつかうことで一つの順次処理にまとまりました。
それでは、いったん全てのセルの値をクリアしてから、そのマクロを実行してみましょう。」
ソンくん
「1行目から10行目で、1列目から10列目のセルに、つまり10行×10列のセルに『X行Y列』が書きこまれました。」
3. 1~100行・1~100列
パイさん
「100行×100列のセルに対して、『X行Y列』を設定しましょう。」
ソンくん
「今度の問題も、二つのループ処理を利用します。
For文では、『To』の次に、終了値を記述することになっているから、
さきほどのマクロの
『For 行 = 1 To 10』を、『For 行 = 1 To 100』に
『For 列 = 1 To 10』を、『For 列 = 1 To 100』に
書きかえるだけですね。」
Sub 行番号と列番号をカウントアップするループ処理3()
Dim 行 As Integer
Dim 列 As Integer
For 行 = 1 To 100
For 列 = 1 To 100
Cells(行, 列).Value = 行 & "行" & 列 & "列"
Next
Next
End Sub
パイさん
「100行×100列に係る順次処理が、二つのFor文をつかうことで一つの順次処理にまとまりました。
それでは、いったん全てのセルの値をクリアしてから、そのマクロを実行してみましょう。」
ソンくん
「1行目から100行目で、1列目から100列目のセルに、つまり100行×100列のセルに『X行Y列』が書きこまれました。」
4. 1~1000行・1~1000列
パイさん
「いっきに1000行×1000列のセルに対して、『X行Y列』を設定しましょう。」
ソンくん
「今度の問題も、二つのループ処理を利用します。
For文では、『To』の次に、終了値を記述することになっているから、
さきほどのマクロの
『For 行 = 1 To 100』を、『For 行 = 1 To 1000』に
『For 列 = 1 To 100』を、『For 列 = 1 To 1000』に
書きかえるだけです。」
Sub 行番号と列番号をカウントアップするループ処理4()
Dim 行 As Integer
Dim 列 As Integer
For 行 = 1 To 1000
For 列 = 1 To 1000
Cells(行, 列).Value = 行 & "行" & 列 & "列"
Next
Next
End Sub
パイさん
「1000行×1000列に係る順次処理が、二つのFor文をつかうことで一つの順次処理にまとまりました。
それでは、いったん全てのセルの値をクリアしてから、そのマクロを実行してみましょう。」
ソンくん
「1行目から1000行目で、1列目から1000列目のセルに、つまり1000行×1000列のセルに、『X行Y列』が書きこまれました。」
パイさん
「このように、例え1000行×1000列、10000行×10000列、1048576行×16384列と
行数×列数がどんなに増えたとしても、
多数行に係るFor文と多数列に係るFor文をつかえば一つの順次処理にまとめられます。
試しに二つのFor文の開始値と終了値を適当な数字に書きかえて、マクロを実行して、
多数行×多数列のセルに値が書きこまれることを確かめてみましょう。
ただし、終了行が32767行以上になるときは、
変数『行』のデータ型を数値型-長整数型の『Long』としましょう。
※ 前々回『ループ処理で多数行のセルに値を書きこむ』参照
(1) 1行目から100行目まで、2列目から200列目までのセルに、『X行Y列』を、
(2) 2行目から200行目まで、1列目から100列目までのセルに、『X行Y列』を、
(3) 3行目から300行目まで、4列目から400列目までのセルに、『X行Y列』を、代入してみましょう。
-
演習(1):マクロ『行番号と列番号をカウントアップするループ処理』
1行目から100行目まで、2列目から200列目までのセルに、『X行Y列』を代入
-
Sub 行番号と列番号をカウントアップするループ処理()
Dim 行 As Integer
Dim 列 As Integer
For 行 = 1 To 100
For 列 = 2 To 200
Cells(行, 列).Value = 行 & "行" & 列 & "列"
Next
Next
End Sub
-
演習(2):マクロ『行番号と列番号をカウントアップするループ処理』
2行目から200行目まで、1列目から100列目までのセルに、『X行Y列』を代入
-
Sub 行番号と列番号をカウントアップするループ処理()
Dim 行 As Integer
Dim 列 As Integer
For 行 = 2 To 200
For 列 = 1 To 100
Cells(行, 列).Value = 行 & "行" & 列 & "列"
Next
Next
End Sub
-
演習(3):マクロ『行番号と列番号をカウントアップするループ処理』
3行目から300行目まで、4列目から400列目までのセルに、『X行Y列』を代入
-
Sub 行番号と列番号をカウントアップするループ処理()
Dim 行 As Integer
Dim 列 As Integer
For 行 = 3 To 300
For 列 = 4 To 400
Cells(行, 列).Value = 行 & "行" & 列 & "列"
Next
Next
End Sub
今回は、行数×列数がどんなに増えたとしても、
多数行に係るFor文と多数列に係るFor文をつかえば一つの順次処理にまとめられて、
多数行×多数列のセルに値を書きこむことができるという話でした。
では、セルの値を読みとるときは、どうすればよいのでしょうか。
これについては、次回『行番号と列番号を直接指定して値を読みとる』で紹介します。」