【ループ処理でセルの値を読みとる】
1 多数のセルの行番号と列番号を直接指定して値を読みとる
2 多数のセルの行番号と列番号を変数と定数で指定して値を読みとる
3 ループ処理で多数行のセルの値を読みとる
4 ループ処理で多数列のセルの値を読みとる
5 ダブルループ処理で多数行×多数列のセルの値を読みとる
ダブルループ処理で多数行×多数列のセルの値を読みとる
パイさん
「ループ処理をつかって、多数行×多数列のセルの値を読みとってみましょう。」
ソンくん
「多数行×多数列のセルの値を読みとるということは、多数行に係るFor文と多数列に係るFor文を
組み合わせてセルの値を読みとる順次処理を一つにまとめるということではないかな。」
パイさん
「その通りです。Excel VBA/マクロでは、二つ以上のループ処理を組み合わせることもできます。
Excel VBA/マクロのダブルループ処理をつかえば、
一つの順次処理で多数行×多数列のセルの値を読みとることができます。
変数『行番号』を、開始行から終了行になるまで1ずつカウントアップさせながら、
併せて、変数『列番号』を、開始列から終了列になるまで1ずつカウントアップさせて、
セルの値を読みとる順次処理をくり返し実行する二重For文は、次のようになります。
![Img4_5_1](./img/Cpt104/Img4_5_1.jpg)
二重For文の後に、変数の値を別のセルに格納します。
変数の値を読みとってセル番地のセルに格納する順次処理は次のようになります。
![Img4_5_2](./img/Cpt104/Img4_5_2.jpg)
今回も、多数のセルの値を読みとることになるので、『ループ処理で多数行×多数列のセルに書きこむ』
のときにつくったマクロ『行番号と列番号をカウントアップするループ処理2』をつかって、
あらかじめ10行×10列のセルに値を書きこんでおきましょう。」
![Img4_5_4](./img/Cpt104/Img4_5_4.jpg)
1. 1~3行・1~3列
パイさん
「行を1行目から3行目まで1行ずつカウントアップしていきながら、
列を1列目から3列目まで1列ずつカウントアップしていき、
3行×3列のセル値を読みとり『 』(スペース)区切りで文字連結し変数『セル値』に格納。
その後、セルA12に変数『セル値』を設定しましょう。
このとき行番号を変数『行』、列番号を変数『列』としましょう。」
ソンくん
「今度の問題は、『行番号と列番号を変数と定数で指定して読みとるの 4.1~3行・1~3列と
ほぼ同じ問題ですね。」
パイさん
「そのときにつくったマクロ『変数と定数で指定して読みとり4』を記載します。」
Sub 変数と定数で指定して読みとり4()
Dim セル値 As String
Dim 行 As Integer
Dim 列 As Integer
行 = 1
列 = 1
セル値 = Cells(行, 列).Value
列 = 2
セル値 = セル値 & Cells(行, 列).Value
列 = 3
セル値 = セル値 & Cells(行, 列).Value
行 = 2
列 = 1
セル値 = セル値 & Cells(行, 列).Value
列 = 2
セル値 = セル値 & Cells(行, 列).Value
列 = 3
セル値 = セル値 & Cells(行, 列).Value
行 = 3
列 = 1
セル値 = セル値 & Cells(行, 列).Value
列 = 2
セル値 = セル値 & Cells(行, 列).Value
列 = 3
セル値 = セル値 & Cells(行, 列).Value
Range("A12").Value = セル値
End Sub
ソンくん
「行×列に係る順次処理を9回も書いています。ここは、ループ処理の出番ですね。」
パイさん
「『セル値』・『行』・『列』の変数宣言、セルA12への変数『セル値』の格納、はそのままのこして、
For文をつかって、9回の順次処理を一つにまとめてみましょう。」
Sub 行番号と列番号をカウントアップするループ処理で読みとり1()
Dim セル値 As String
Dim 行 As Integer
Dim 列 As Integer
For 行 = 1 To 3
For 列 = 1 To 3
セル値 = セル値 & " " & Cells(行, 列).Value
Next
Next
Range("A12").Value = セル値
End Sub
ソンくん
「3行×3列に係る順次処理が、二つのFor文をつかうことで一つの順次処理にまとまりました。」
パイさん
「今回のコードを解説します。
行を1行目から3行目まで1行ずつカウントアップするということから、
開始行は『1』、終了行は『3』となり、行に関するFor文は、
For 行 = 1 To 3
-----
Next
になります。
列を1列目から3列目まで1列ずつカウントアップするということから、
開始列は『1』、終了列は『3』となり、列に関するFor文は、
For 列 = 1 To 3
-----
Next
になります。
変数『セル値』に対して、一つ前の変数『セル値』と " " と変数『行』と変数『列』のセル値を
文字連結した値を設定するということから、処理は、
セル値 = セル値 & " " & Cells(行, 列).Valueになります。
次に、『行と列の二つのループ処理を行うための構文』を参考にしながら、
二つのFor文と順次処理を組み合わせていきます。
For 行 = 1 To 3
For 列 = 1 To 3
セル値 = セル値 & " " & Cells(行, 列).Value
Next
Next
と記述します。
それでは、そのマクロを実行してみましょう。」
![Img4_5_6](./img/Cpt104/Img4_5_6.jpg)
ソンくん
「1行目から3行目で1列目から3列目のセル値が読みとられて
『 』(スペース)区切りで文字連結されて、セルA12に書きこまれました。」
2. 1~5行・1~5列
パイさん
「行を1行目から5行目まで1行ずつカウントアップしていきながら、
列を1列目から5列目まで1列ずつカウントアップしていき、
5行×5列のセル値を読みとり『 』(スペース)区切りで文字連結し変数『セル値』に格納。
その後、セルA12に変数『セル値』を設定しましょう。
このとき行番号を変数『行』、列番号を変数『列』としましょう。」
ソンくん
「今度の問題も、二つのループ処理を利用できそうですね。
For文では、『To』の次に、終了値を記述することになっているから、
さきほどのマクロの
『For 行 = 1 To 3』を、『For 行 = 1 To 5』に
『For 列 = 1 To 3』を、『For 列 = 1 To 5』に
書きかえるだけですね。」
Sub 行番号と列番号をカウントアップするループ処理で読みとり2()
Dim セル値 As String
Dim 行 As Integer
Dim 列 As Integer
For 行 = 1 To 5
For 列 = 1 To 5
セル値 = セル値 & " " & Cells(行, 列).Value
Next
Next
Range("A12").Value = セル値
End Sub
パイさん
「5行×5列に係る順次処理が、二つのFor文をつかうことで一つの順次処理にまとまりました。
それでは、セルA12の値をクリアしてから、そのマクロを実行してみましょう。」
![Img4_5_8](./img/Cpt104/Img4_5_8.jpg)
ソンくん
「1行目から5行目で1列目から5列目のセル値が読みとられて
『 』(スペース)区切りで文字連結されて、セルA12に書きこまれました。
だけど、3行4列までしか見えないため、3行5列から5行5列までが本当に読みとられているのかが、
よくわかりません。」
パイさん
「それでは、セルA12の行の高さと書式を変更してみましょう。
行番号が『12』となっているマスをクリックしてください。」
![Img4_5_9](./img/Cpt104/Img4_5_9.jpg)
ソンくん
「12行のセルが線で囲まれました。」
パイさん
「これは、12行のセルが選択されている状態です。
この状態で、12行のセルにカーソルを置いたまま右クリックしてください。」
![Img4_5_10](./img/Cpt104/Img4_5_10.jpg)
ソンくん
「下方向にたれ下がったメニューが現れました。」
パイさん
「これは、ドロップダウンメニューとよばれるもので、Excelのいろんな操作や設定ができます。
このドロップダウンメニューの下から3番目の行の高さをクリックしてください。」
![Img4_5_11](./img/Cpt104/Img4_5_11.jpg)
ソンくん
「『セルの高さ』というタイトルの小さな画面が現れました。」
パイさん
「この画面で、『行の高さ』を変更できます。
『行の高さ』を120と書きかえてOKボタンをクリックしてください。」
![Img4_5_12](./img/Cpt104/Img4_5_12.jpg)
ソンくん
「12行目の幅が大きくなりました。」
![Img4_5_13](./img/Cpt104/Img4_5_13.jpg)
パイさん
「次に、セルA12を選択して、Ctrlキーと1キーを同時に打ってください。」
ソンくん
「『セルの書式設定』という画面があらわれました。」
![Img4_5_14](./img/Cpt104/Img4_5_14.jpg)
パイさん
「そしたら、配置タブを選んで『文字の制御』の中の『折り返して全体を表示する』をクリックして
チェックマークがついている状態にしてからOKボタンをクリックしてください。」
![Img4_5_15](./img/Cpt104/Img4_5_15.jpg)
ソンくん
「折り返して全体を表示するようになったため、3行5列から5行5列までが本当に読みとられていることが、
よくわかるようになりました。」
パイさん
「このように、セルを折り返して全体を表示するようにすれば、右はしの値が見えなくなるということがなくなり、
見やすい表をつくることができます。」
3. 1~10行・1~10列
パイさん
「行を1行目から10行目まで1行ずつカウントアップしていきながら、
列を1列目から10列目まで1列ずつカウントアップしていき、
10行×10列のセル値を読みとり『 』(スペース)区切りで文字連結し変数『セル値』に格納。
その後、セルA12に変数『セル値』を設定しましょう。
このとき行番号を変数『行』、列番号を変数『列』としましょう。」
ソンくん
「今度の問題も、二つのループ処理を利用できそうですね。
For文では、『To』の次に、終了値を記述することになっているから、
さきほどのマクロの
『For 行 = 1 To 5』を、『For 行 = 1 To 10』に
『For 列 = 1 To 5』を、『For 列 = 1 To 10』に
書きかえるだけです。」
Sub 行番号と列番号をカウントアップするループ処理で読みとり3()
Dim セル値 As String
Dim 行 As Integer
Dim 列 As Integer
For 行 = 1 To 10
For 列 = 1 To 10
セル値 = セル値 & " " & Cells(行, 列).Value
Next
Next
Range("A12").Value = セル値
End Sub
パイさん
「10行×10列に係る順次処理が、二つのFor文をつかうことで一つの順次処理にまとまりました。
それでは、セルA12の値をクリアしてから、そのマクロを実行してみましょう。」
![Img4_5_17](./img/Cpt104/Img4_5_17.jpg)
ソンくん
「1行目から10行目で1列目から10列目のセル値が読みとられて
『 』(スペース)区切りで文字連結されて、セルA12に書きこまれました。」
パイさん
「このように、For文をつかってループ処理を行えば、多数行×多数列のセルの値を一瞬で読みとることができます。
試しに二つのFor文の開始値と終了値を適当な数字に書きかえて、マクロを実行して、
多数行×多数列のセルの値が読みとれることを確かめてみましょう。
(1) 2行目から10行目まで、1列目から9列目までのセルの値を読みとり、
(2) 1行目から9行目まで、2列目から10列目までのセルの値を読みとり、
(3) 4行目から8行目まで、5列目から7列目までのセルの値を読みとり、
スペース区切りで文字連結し、セルA12に代入してみましょう。
-
演習(1):マクロ『行番号と列番号をカウントアップするループ処理で読みとり』
2行目から10行目まで、1列目から9列目までのセルの値を読みとり、
スペース区切りで文字連結し、セルA12に代入
-
Sub 行番号と列番号をカウントアップするループ処理で読みとり()
Dim セル値 As String
Dim 行 As Integer
Dim 列 As Integer
For 行 = 2 To 10
For 列 = 1 To 9
セル値 = セル値 & " " & Cells(行, 列).Value
Next
Next
Range("A12").Value = セル値
End Sub
-
演習(2):マクロ『行番号と列番号をカウントアップするループ処理で読みとり』
1行目から9行目まで、2列目から10列目までのセルの値を読みとり、
スペース区切りで文字連結し、セルA12に代入
-
Sub 行番号と列番号をカウントアップするループ処理で読みとり()
Dim セル値 As String
Dim 行 As Integer
Dim 列 As Integer
For 行 = 1 To 9
For 列 = 2 To 10
セル値 = セル値 & " " & Cells(行, 列).Value
Next
Next
Range("A12").Value = セル値
End Sub
-
演習(3):マクロ『行番号と列番号をカウントアップするループ処理で読みとり』
4行目から8行目まで、5列目から7列目までのセルの値を読みとり、
スペース区切りで文字連結し、セルA12に代入
-
Sub 行番号と列番号をカウントアップするループ処理で読みとり()
Dim セル値 As String
Dim 行 As Integer
Dim 列 As Integer
For 行 = 4 To 8
For 列 = 5 To 7
セル値 = セル値 & " " & Cells(行, 列).Value
Next
Next
Range("A12").Value = セル値
End Sub
今回は、行数×列数がどんなに増えたとしても、For文をつかえば、多数行×多数列に係る順次処理が、
一つの順次処理にまとめられて、多数行×多数列のセルの値を読みとることができるという話でした。
では、セルからセルへ値を代入するときは、どうすればよいのでしょうか。
これについては、次回『セルからセルへ値を代入』で紹介します。」