【ループ処理でセルの値を読みとる】
1 多数のセルの行番号と列番号を直接指定して値を読みとる
2 多数のセルの行番号と列番号を変数と定数で指定して値を読みとる
3 ループ処理で多数行のセルの値を読みとる
4 ループ処理で多数列のセルの値を読みとる
5 ダブルループ処理で多数行×多数列のセルの値を読みとる
ループ処理で多数行のセルの値を読みとる
パイさん
「ループ処理をつかって、行番号をカウントアップしながら多数行のセルの値を読みとってみましょう。
Excel VBA/マクロのループ処理をつかえば、
一つの順次処理で多数行のセルの値を読みとることができます。
変数『行番号』を、開始行から終了行になるまで1ずつカウントアップさせながら、
セルの値を読みとる順次処理をくり返し実行するFor文は、次のようになります。
For文の後に、変数の値を別のセルに格納します。
変数の値を読みとってセル番地のセルに格納する順次処理は次のようになります。
今回も、多数のセルの値を読みとることになるので、『ループ処理で多数行×多数列のセルに書きこむ』
のときにつくったマクロ『行番号と列番号をカウントアップするループ処理2』をつかって、
あらかじめ10行×10列のセルに値を書きこんでおきましょう。」
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ずつカウントアップしながら、
変数『セル値』に対して、一つ前の変数『セル値』と 変数『行』と定数『列』のセル値を
文字連結した値を設定するという意味です。
それでは、そのマクロを実行してみましょう。」
ソンくん
「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の値をクリアしてから、そのマクロを実行してみましょう。」
ソンくん
「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の値をクリアしてから、そのマクロを実行してみましょう。」
ソンくん
「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文をつかえば、多数行に係る順次処理が、
一つの順次処理にまとめられて、多数行のセルの値を読みとることができるという話でした。
では、列数が増えたときは、どうすればよいのでしょうか。
これについては、次回『ループ処理で多数列のセルの値を読みとる』で紹介します。」