【ループ処理でセルの値を読みとる】

 1 多数のセルの行番号と列番号を直接指定して値を読みとる

 2 多数のセルの行番号と列番号を変数と定数で指定して値を読みとる

 3 ループ処理で多数行のセルの値を読みとる

 4 ループ処理で多数列のセルの値を読みとる

 5 ダブルループ処理で多数行×多数列のセルの値を読みとる

ループ処理で多数行のセルの値を読みとる

パイさん

ループ処理をつかって、行番号をカウントアップしながら多数行のセルの値を読みとってみましょう。

 

 Excel VBA/マクロのループ処理をつかえば、
 一つの順次処理で多数行のセルの値を読みとることができます

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

 セルの値を読みとる順次処理をくり返し実行するForは、次のようになります。

Img4_3_1

 Forの後に、変数の値を別のセルに格納します。

 変数の値を読みとってセル番地のセルに格納する順次処理は次のようになります。

Img4_3_2

 今回も、多数のセルの値を読みとることになるので、『ループ処理で多数行×多数列のセルに書きこむ』

 のときにつくったマクロ『行番号と列番号をカウントアップするループ処理2』をつかって、

 あらかじめ10行×10のセルに値を書きこんでおきましょう。」

Img4_3_4

1. 1~3行・1列

パイさん

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

 そのつどセル値を読みとり文字連結変数『セル値』に格納。

 その後、セルA12変数『セル値』を設定しましょう。

 このとき行番号変数『列番号定数『としましょう。」

ソンくん

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

パイさん

「そのときにつくったマクロ『変数と定数で指定して読みとり2』を記載します。」

Sub 変数と定数で指定して読みとり2()

 Dim セル値 As String

 Dim As Integer

 Const = 1

  = 1

 セル値 = Cells(, ).Value

  = 2

 セル値 = セル値 & Cells(, ).Value

  = 3

 セル値 = セル値 & Cells(, ).Value

 Range("A12").Value = セル値

End Sub

ソンくん

に係る順次処理3回も書いています。ループ処理一つにまとめられそうですね。」

パイさん

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

 セル値』及び『』の変数宣言と『』の定数宣言セルA12への変数『セル値』の格納、はそのままのこして、

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

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

 Dim セル値 As String

 Dim As Integer

 Const = 1

 For = 1 To 3

   セル値 = セル値 & Cells(, ).Value

 Next

 Range("A12").Value = セル値

End Sub

ソンくん

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

パイさん

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

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

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

 

 『Cells(, ).Value』は、1ずつカウントアップされていく変数『固定値1として宣言された定数『

 セル値という意味です。

 

 『セル値 & Cells(, ).Value』は、変数『セル値』変数『』と定数『のセル値を演算子『&』で

 結合するという意味です。

 

 『For = 1 To 3』は、変数『初期値『1から終了値『3まで1ずつカウントアップしていく

 ということです。

 

 つまり、

 For = 1 To 3

   セル値 = セル値 & Cells(, ).Value

 Next

 とは、

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

 変数『セル値』に対して、一つ前の変数『セル値』変数『定数『のセル値

 文字連結した値を設定するという意味です。

 

 それでは、そのマクロを実行してみましょう。」

Img4_3_6

ソンくん

1~3行目・1列目のセル値が読みとられて文字連結されて、セルA12に書きこまれました。

 だけど、セル値どうしがピッタリくっついているので読みにくいな。」

パイさん

「それでは、セル値とセル値の間に『 』(スペース)を入れてみましょう。

 For文の処理部分

   セル値 = セル値 & Cells(, ).Value

 を少し書きかえてみましょう。」

ソンくん

「セル値とセル値の間に『 』(スペース)を追加するのだから、

   セル値 = セル値 & " " & Cells(, ).Value

 と書きかえました。」

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

 Dim セル値 As String

 Dim As Integer

 Const = 1

 For = 1 To 3

   セル値 = セル値 & " " & Cells(, ).Value

 Next

 Range("A12").Value = セル値

End Sub

パイさん

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

Img4_3_8

ソンくん

1~3行目・1列目のセル値が読みとられて『 』(スペース)区切りで文字連結されて、

 セルA12に書きこまれました。」


2. 1~10行・1列

パイさん

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

 そのつどセル値を読みとり『 』(スペース)区切りで文字連結変数『セル値』に格納。

 その後、セルA12変数『セル値』を設定しましょう。

 このとき行番号変数『列番号定数『としましょう。」

ソンくん

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

パイさん

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

ソンくん

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

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

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

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

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

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

 Dim セル値 As String

 Dim As Integer

 Const = 1

 For = 1 To 10

   セル値 = セル値 & " " & Cells(, ).Value

 Next

 Range("A12").Value = セル値

End Sub

パイさん

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

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

Img4_3_10

ソンくん

1~10行目・1列目のセル値が読みとられて『 』(スペース)区切りで文字連結されて、

 セルA12に書きこまれました。」


パイさん

「このように、Forをつかってループ処理を行えば、多数行のセルの値を一瞬で読みとることができます。

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

 多数行のセルの値が読みとれることを確かめてみましょう。

 (1) 2行目から10行目まで、3列目のセルの値を読みとり、

 (2) 1行目から9行目まで、5列目のセルの値を読みとり、

 (3) 4行目から8行目まで、10列目のセルの値を読みとり、スペース区切りで文字連結し、セルA12に代入してみましょう。

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

2行目から10行目まで、3列目のセルの値を読みとり、スペース区切りで文字連結し、

セルA12に代入

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

 Dim セル値 As String

 Dim 行 As Integer

 Const 列 = 3

 For 行 = 2 To 10

   セル値 = セル値 & " " & Cells(行, 列).Value

 Next

 Range("A12").Value = セル値

End Sub

 

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

1行目から9行目まで、5列目のセルの値を読みとり、スペース区切りで文字連結し、

セルA12に代入

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

 Dim セル値 As String

 Dim 行 As Integer

 Const 列 = 5

 For 行 = 1 To 9

   セル値 = セル値 & " " & Cells(行, 列).Value

 Next

 Range("A12").Value = セル値

End Sub

 

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

4行目から8行目まで、10列目のセルの値を読みとり、スペース区切りで文字連結し、

セルA12に代入

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

 Dim セル値 As String

 Dim 行 As Integer

 Const 列 = 10

 For 行 = 4 To 8

   セル値 = セル値 & " " & Cells(行, 列).Value

 Next

 Range("A12").Value = セル値

End Sub

 

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

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

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

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