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

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

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

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

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

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

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

パイさん

「前々回『ループ処理で多数行のセルに値を書きこむ』は、

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

 Forをつかえば一つの順次処理にまとめられるという話でした。

Img3_3_2

 

 前回『ループ処理で多数列のセルに値を書きこむ』は、

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

 Forをつかえば一つの順次処理にまとめられるという話でした。

Img3_4_2

 

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

ソンくん

行数列数の両方がどんなに増えたとしても、

 多数行に係るFor多数列に係るFor組み合わせれば

 一つの順次処理にまとめられるのではないかな。」

パイさん

「その通りです。

 Excel VBA/マクロでは、二つ以上のループ処理を組み合わせることもできます

 Excel VBA/マクロのダブルループ処理をつかえば、
 多数行×多数列に係る順次処理を一つの順次処理にまとめることができます

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

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

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

Img3_5_2

パイさん

「今回は、に係るループ処理に係るループ処理を組み合わせて、

 行番号をカウントアップしていきながら、列番号をカウントアップしていき、

 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

 と記述します。

 

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

Img3_5_3

ソンくん

「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をつかうことで一つの順次処理にまとまりました。

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

Img3_5_5

ソンくん

「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をつかうことで一つの順次処理にまとまりました。

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

Img3_5_7

ソンくん

「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をつかうことで一つの順次処理にまとまりました。

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

Img3_5_9

ソンくん

「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をつかえば一つの順次処理にまとめられて、

 多数行×多数列のセルに値を書きこむことができるという話でした。

 では、セルの値を読みとるときは、どうすればよいのでしょうか。

 これについては、次回『行番号と列番号を直接指定して値を読みとる』で紹介します。」