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

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

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

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

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

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

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

パイさん

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

 

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

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

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

Img4_4_1

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

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

Img4_4_2

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

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

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

Img4_4_4

1. 1行・1~3列

パイさん

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

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

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

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

ソンくん

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

パイさん

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

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

 Dim セル値 As String

 Const 行 = 1

 Dim 列 As Integer

 列 = 1

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

 列 = 2

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

 列 = 3

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

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

End Sub

ソンくん

「列に係る順次処理を3回も書いています。ここは、ループ処理の出番ですね。」

パイさん

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

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

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

 Dim セル値 As String

 Const 行 = 1

 Dim 列 As Integer

 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_4_6

ソンくん

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

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


2. 1行・1~10列

パイさん

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

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

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

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

ソンくん

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

 一つ前の問題は、

 『列を1列目から3列目まで1列ずつカウントアップ』するのに対して、

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

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

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

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

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

 Dim セル値 As String

 Const 行 = 1

 Dim 列 As Integer

 For 列 = 1 To 10

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

 Next

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

End Sub

パイさん

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

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

Img4_4_8

ソンくん

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

 セル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

 Const 行 = 3

 Dim 列 As Integer

 For 列 = 2 To 10

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

 Next

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

End Sub

 

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

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

セルA12に代入

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

 Dim セル値 As String

 Const 行 = 5

 Dim 列 As Integer

 For 列 = 1 To 9

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

 Next

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

End Sub

 

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

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

セルA12に代入

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

 Dim セル値 As String

 Const 行 = 10

 Dim 列 As Integer

 For 列 = 4 To 8

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

 Next

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

End Sub

 

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

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

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

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