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

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

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

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

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

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

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

パイさん

Excel VBA/マクロのCells行番号列番号については三つの指定方法がありますが、

 今回は、Cellsオブジェクトの引数となる行番号列番号直接指定する方法により、

 多数のセルの値を読みとってみます。


 Cellsオブジェクトの値を読みとって変数に格納する構文を紹介します。

Img4_1_1

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

 変数の値を読みとってRangeオブジェクトの値に格納する構文は次のようになります。

Img4_1_2

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

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

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

Img4_1_4

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

パイさん

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

Img4_1_6

ソンくん

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の値をクリアしてから、そのマクロを実行してみましょう。」

Img4_1_8

ソンくん

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の値をクリアしてから、そのマクロを実行してみましょう。」

Img4_1_10

ソンくん

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の値をクリアしてから、そのマクロを実行してみましょう。」

Img4_1_12

ソンくん

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の値をクリアしてから、そのマクロを実行してみましょう。」


Img4_1_14

ソンくん

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オブジェクトの引数となる行番号列番号間接的に指定する方法により、

 多数のセルの値を読みとるにはどうしたらよいのでしょうか。

 これについては、次回『多数のセル位置を変数と定数で指定して値を読みとる』で紹介します。