【ループ処理でセルの値を読みとる】
1 多数のセルの行番号と列番号を直接指定して値を読みとる
2 多数のセルの行番号と列番号を変数と定数で指定して値を読みとる
3 ループ処理で多数行のセルの値を読みとる
4 ループ処理で多数列のセルの値を読みとる
5 ダブルループ処理で多数行×多数列のセルの値を読みとる
多数のセルの行番号と列番号を直接指定して値を読みとる
パイさん
「Excel VBA/マクロのCellsの行番号と列番号については三つの指定方法がありますが、
今回は、Cellsオブジェクトの引数となる行番号と列番号を直接指定する方法により、
多数のセルの値を読みとってみます。
Cellsオブジェクトの値を読みとって変数に格納する構文を紹介します。
最後に、変数の値を別のセルの値に格納します。
変数の値を読みとってRangeオブジェクトの値に格納する構文は次のようになります。
今回は、多数のセルの値を読みとることになるので、『ループ処理で多数行×多数列のセルに書きこむ』
のときにつくったマクロ『行番号と列番号をカウントアップするループ処理2』をつかって、
あらかじめ10行×10列のセルに値を書きこんでおきましょう。」
1. 1行・1列
パイさん
「1行目・1列目のセル値を読みとり、いったん変数『セル値』に格納。
その後、セルA12に変数『セル値』を設定しましょう。」
ソンくん
「変数『セル値』に格納する値は『X行Y列』といった文字列なので、『セル値』を文字列型として変数宣言。
変数『セル値』に、1行目・1列目のセル値、
最後に、セルA12に、変数『セル値』、を設定します。」
Sub 直接指定して読みとり1()
Dim セル値 As String
セル値 = Cells(1, 1).Value
Range("A12").Value = セル値
End Sub
パイさん
「それでは、そのマクロを実行してみましょう。」
ソンくん
「1行目・1列目のセル値『1行1列』が読みとられて、セルA12に書きこまれました。」
2. 1~3行・1列
パイさん
「列を1列目に固定して、行を1行目から3行目まで1行ずつカウントアップしていきながら、
そのつどセル値を読みとり文字連結し変数『セル値』に格納。
その後、セルA12に変数『セル値』を設定しましょう。」
ソンくん
「まず、『セル値』を文字列型として変数宣言。
変数『セル値』に、1行目・1列目のセル値を、
変数『セル値』に、2行目・1列目のセル値を、
変数『セル値』に、3行目・1列目のセル値を、
最後に、セルA12に、変数『セル値』を設定します」
Sub 直接指定して読みとり2()
Dim セル値 As String
セル値 = Cells(1, 1).Value
セル値 = Cells(2, 1).Value
セル値 = Cells(3, 1).Value
Range("A12").Value = セル値
End Sub
パイさん
「それでは、セルA12の値をクリアしてから、そのマクロを実行してみましょう。」
ソンくん
「3行目・1列目のセル値『3行1列』が読みとられて、セルA12に書きこまれました。
あっ、1行目・1列目のセル値と2行目・1列目のセル値が読みとられていません。」
パイさん
「その通りです。
『セル値 = Cells(1, 1).Value
セル値 = Cells(2, 1).Value
セル値 = Cells(3, 1).Value
と記述したマクロを実行したとき、
変数『セル値』に、1行目・1列目のセル値が格納され、
変数『セル値』に、2行目・1列目のセル値が格納され、
変数『セル値』に、3行目・1列目のセル値が格納されることになり、
結局、最後に変数『セル値』に格納されるのは、3行目・1列目のセル値だけになってしまいます。」
ソンくん
「どうしたら、1行目・1列目と2行目・1列目のセル値も格納されるようになるのですか?」
パイさん
「こんなときは文字連結をつかうと良いです。
左の文字列と右の文字列を結合する演算子『&』をつかって、変数『セル値』を連結していきます。
次のように、コードを書きかえてみてください。
セル値 = Cells(1, 1).Value
セル値 = セル値 & Cells(2, 1).Value
セル値 = セル値 & Cells(3, 1).Value
こうすれば、
変数『セル値』に、1行目・1列目のセル値が格納され、
変数『セル値』に、一つ前の変数『セル値』と2行目・1列目のセル値が文字連結されて格納され、
変数『セル値』に、一つ前の変数『セル値』と3行目・1列目のセル値が文字連結されて格納されることになります。」
ソンくん
「変数『セル値』を文字連結するようにコードを書きかえます。」
Sub 直接指定して読みとり3()
Dim セル値 As String
セル値 = Cells(1, 1).Value
セル値 = セル値 & Cells(2, 1).Value
セル値 = セル値 & Cells(3, 1).Value
Range("A12").Value = セル値
End Sub
パイさん
「3行に係る順次処理が記述されました。
それでは、セルA12の値をクリアしてから、そのマクロを実行してみましょう。」
ソンくん
「1~3行目・1列目のセル値が読みとられて文字連結されて、セルA12に書きこまれました。」
3. 1行・1~3列
パイさん
「行を1行目に固定して、列を1列目から3列目まで1列ずつカウントアップしていきながら、
そのつどセル値を読みとり文字連結し変数『セル値』に格納。
その後、セルA12に変数『セル値』を設定しましょう。」
ソンくん
「まず、『セル値』を文字列型として変数宣言。
変数『セル値』に、1行目・1列目のセル値を格納、
変数『セル値』に、一つ前の変数『セル値』と1行目・2列目のセル値を文字連結し格納、
変数『セル値』に、一つ前の変数『セル値』と1行目・3列目のセル値を文字連結し格納、
最後に、セルA12に変数『セル値』を格納します。」
Sub 直接指定して読みとり4()
Dim セル値 As String
セル値 = Cells(1, 1).Value
セル値 = セル値 & Cells(1, 2).Value
セル値 = セル値 & Cells(1, 3).Value
Range("A12").Value = セル値
End Sub
パイさん
「3列に係る順次処理が記述されました。
それでは、セルA12の値をクリアしてから、そのマクロを実行してみましょう。」
ソンくん
「1行目・1~3列目のセル値が読みとられて文字連結されて、セルA12に書きこまれました。」
4. 1~3行・1~3列
パイさん
「行を1行目から3行目まで1行ずつカウントアップしていきながら、
列も1列目から3列目まで1列ずつカウントアップしていき、
そのつどセル値を読みとり文字連結し変数『セル値』に格納。
その後、セルA12に変数『セル値』を設定しましょう。」
ソンくん
「まず、『セル値』を文字列型として変数宣言。
変数『セル値』に、1行目・1列目のセル値を格納、
変数『セル値』に、一つ前の変数『セル値』と1行目・2列目のセル値を文字連結し格納、
変数『セル値』に、一つ前の変数『セル値』と1行目・3列目のセル値を文字連結し格納、
変数『セル値』に、一つ前の変数『セル値』と2行目・1列目のセル値を文字連結し格納、
変数『セル値』に、一つ前の変数『セル値』と2行目・2列目のセル値を文字連結し格納、
変数『セル値』に、一つ前の変数『セル値』と2行目・3列目のセル値を文字連結し格納、
変数『セル値』に、一つ前の変数『セル値』と3行目・1列目のセル値を文字連結し格納、
変数『セル値』に、一つ前の変数『セル値』と3行目・2列目のセル値を文字連結し格納、
変数『セル値』に、一つ前の変数『セル値』と3行目・3列目のセル値を文字連結し格納、
最後に、セルA12に変数『セル値』を格納します。」
Sub 直接指定して読みとり5()
Dim セル値 As String
セル値 = Cells(1, 1).Value
セル値 = セル値 & Cells(1, 2).Value
セル値 = セル値 & Cells(1, 3).Value
セル値 = セル値 & Cells(2, 1).Value
セル値 = セル値 & Cells(2, 2).Value
セル値 = セル値 & Cells(2, 3).Value
セル値 = セル値 & Cells(3, 1).Value
セル値 = セル値 & Cells(3, 2).Value
セル値 = セル値 & Cells(3, 3).Value
Range("A12").Value = セル値
End Sub
パイさん
「3行×3列に係る順次処理が記述されました。
それでは、セルA12の値をクリアしてから、そのマクロを実行してみましょう。」
ソンくん
「1~3行目・1~3列目のセル値が読みとられて文字連結されて、セルA12に書きこまれました。」
パイさん
「今回は、Cellsオブジェクトの引数となる行番号と列番号を直接指定する方法により、
多数のセルの値を読みとる順次処理を紹介しました。
1. 1行・1列では1回のセルの値を読みとる順次処理、
2. 1~3行・1列では3回のセルの値を読みとる順次処理、
3. 1行・1~3列では3回のセルの値を読みとる順次処理、
4. 1~3行・1~3列では9回のセルの値を読みとる順次処理、を記述しました。
でも、セルの行番号と列番号を指定するとき、
Cellsオブジェクトの引数:行番号と列番号を直接記述するという手法は、
マジックナンバーと呼ばれるやり方で、プログラムのメンテナンス上あまりお勧めできません。
では、Cellsオブジェクトの引数となる行番号と列番号を間接的に指定する方法により、
多数のセルの値を読みとるにはどうしたらよいのでしょうか。
これについては、次回『多数のセル位置を変数と定数で指定して値を読みとる』で紹介します。