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

 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をつかえば、多数列に係る順次処理が、

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

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

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