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

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

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

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

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

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

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

パイさん

ループ処理をつかって、多数行×多数列のセルの値を読みとってみましょう。」

ソンくん

多数行×多数列のセルの値を読みとるということは、多数行に係るFor多数列に係るFor

 組み合わせセルの値を読みとる順次処理を一つにまとめるということではないかな。」

パイさん

「その通りです。Excel VBA/マクロでは、二つ以上のループ処理を組み合わせることもできます

 Excel VBA/マクロのダブルループ処理をつかえば、
 一つの順次処理で多数行×多数列のセルの値を読みとることができます

 変数『行番号を、開始行から終了行になるまで1ずつカウントアップさせながら、

 併せて、変数『列番号を、開始列から終了列になるまで1ずつカウントアップさせて、

 セルの値を読みとる順次処理をくり返し実行する二重Forは、次のようになります。

Img4_5_1

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

 変数の値を読みとってセル番地のセルに格納する順次処理は次のようになります。

Img4_5_2

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

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

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

Img4_5_4

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

ソンくん

行×に係る順次処理が、二つの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

ソンくん

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

パイさん

行×に係る順次処理が、二つのForをつかうことで一つの順次処理にまとまりました。

 それでは、セルA12の値をクリアしてから、そのマクロを実行してみましょう。」

Img4_5_8

ソンくん

1行目から5行目で1列目から5列目のセル値が読みとられて

 『 』(スペース)区切りで文字連結されて、セルA12に書きこまれました。

 だけど、3行4列までしか見えないため、3行5列から5行5列までが本当に読みとられているのかが、

 よくわかりません。」

パイさん

「それでは、セルA12の行の高さと書式を変更してみましょう。

 行番号が『12』となっているマスをクリックしてください。」

Img4_5_9

ソンくん

「12行のセルが線で囲まれました。」

パイさん

「これは、12行のセルが選択されている状態です。

 この状態で、12行のセルにカーソルを置いたまま右クリックしてください。」

Img4_5_10

ソンくん

「下方向にたれ下がったメニューが現れました。」

パイさん

「これは、ドロップダウンメニューとよばれるもので、Excelのいろんな操作や設定ができます。

 このドロップダウンメニューの下から3番目の行の高さをクリックしてください。」

Img4_5_11

ソンくん

「『セルの高さ』というタイトルの小さな画面が現れました。」

パイさん

「この画面で、『行の高さ』を変更できます。

行の高さ』を120と書きかえてOKボタンをクリックしてください。」

Img4_5_12

ソンくん

「12行目の幅が大きくなりました。」

Img4_5_13

パイさん

「次に、セルA12を選択して、Ctrlキーと1キーを同時に打ってください。」

ソンくん

「『セルの書式設定』という画面があらわれました。」

Img4_5_14

パイさん

「そしたら、配置タブを選んで『文字の制御』の中の『折り返して全体を表示する』をクリックして

 チェックマークがついている状態にしてからOKボタンをクリックしてください。」

Img4_5_15

ソンくん

「折り返して全体を表示するようになったため、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

ソンくん

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

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

 では、セルからセルへ値を代入するときは、どうすればよいのでしょうか。

 これについては、次回『セルからセルへ値を代入』で紹介します。」