【ループ処理でセルからセルへ値を代入する】

 1 セルからセルへ値を代入

 2 行のループ処理でセルからセルへ値を代入

 3 列のループ処理でセルからセルへ値を代入

 4 行×列のダブルループ処理でセルからセルへ値を代入

行×列のダブルループ処理でセルからセルへ値を代入

パイさん

ループ処理をつかって、行番号列番号をカウントアップしながらセルからセルへ値を代入してみましょう。

 

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

 別の多数行×多数列のセルにその値を書きこむことができます

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

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

 セルの値を読みとり別のセルにその値を書きこむ順次処理をくり返し実行する

 二重Forは、次のようになります。

Img5_4_1

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

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

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

Img5_2_3

1. 1~3行・1~3列のセルから10行下・10列右のセルへ

Img5_4_2

パイさん

行を1行目から3行目まで1行ずつカウントアップしていきながら、

 列を1列目から3列目まで1列ずつカウントアップしていき、

 そのつどセルの値を読みとり、その1010のセルに書きこんでみましょう。

 このとき行番号を変数『読取行』と変数『書込行』、列番号を変数『読取列』と変数『書込列』としましょう。」

ソンくん

「『読取行』『書込行』『読取列』『書込列』を整数型として変数宣言

 行を1行目から3行目まで1行ずつカウントアップしていきながら、そのつどセルの値を読みとり、

 その10のセルに書きこむということを考えてみます。

 『読取行』を開始行『1』から終了行『3』まで1ずつカウントアップしていくループコード

 For 読取行 = 1 To 3

 Next

 『書込行』を『読取行』より10増やす処理コード

 書込行 = 読取行 + 10

 書込セル読取セルの値を代入する処理コード

 Cells(書込行, 書込列).Value = Cells(読取行, 読取列).Value

 そして、これら二つの処理コードを、読取行』をカウントアップしていくループコード組み合わせます。

 For 読取行 = 1 To 3

   書込行 = 読取行 + 10

   Cells(書込行, 書込列).Value = Cells(読取行, 読取列).Value

 Next

 

 次に、列を1列目から3列目まで1列ずつカウントアップしていきながら、そのつどセルの値を読みとり、

 その10のセルに書きこむということを考えてみます。

 『読取列』を開始列『1』から終了列『3』まで1ずつカウントアップしていくループコード

 For 読取列 = 1 To 3

 Next

 『書込列』を『読取列』より10増やす処理コード

 書込列 = 読取列 + 10

 書込セル読取セルの値を代入する処理コード

 Cells(書込行, 書込列).Value = Cells(読取行, 読取列).Value

 そして、これら二つの処理コードを、読取列』をカウントアップしていくループコード組み合わせます。

 For 読取列 = 1 To 3

   書込列 = 読取列 + 10

   Cells(書込行, 書込列).Value = Cells(読取行, 読取列).Value

 Next

 

 最後に、番号をカウントアップしながらセルからセルへ値を代入するループ処理と、

 番号をカウントアップしながらセルからセルへ値を代入するループ処理を、組み合わせます。

Sub 行と列のループ処理でセルからセルへ値をうつす1()

 Dim 読取行 As Integer

 Dim 書込行 As Integer

 Dim 読取列 As Integer

 Dim 書込列 As Integer

 For 読取行 = 1 To 3

   書込行 = 読取行 + 10

   For 読取列 = 1 To 3

     書込列 = 読取列 + 10

     Cells(書込行, 書込列).Value = Cells(読取行, 読取列).Value

   Next

 Next

End Sub

パイさん

1~3行×1~3に係るセルからセルへ値をうつす順次処理が、二つのForをつかうことで

 一つの順次処理にまとまりました。それでは、そのマクロを実行してみましょう。」

Img5_4_4

ソンくん

1~3行目1~3列目のセルの値が読みとられて、その101011~13行目11~13列目のセル

 に書きこまれました。」


2. 4~6行・4~6列のセルから10行下・10列右のセルへ

Img5_4_5

パイさん

4行目から6行目まで1行ずつカウントアップしていきながら、

 4列目から6列目まで1列ずつカウントアップしていき、

 そのつどセルの値を読みとり、その1010のセルに書きこんでみましょう。」

ソンくん

「今度の問題も、の二つのループ処理を利用できそうですね。」

パイさん

「その通りです。実は一つ前につくったマクロをか所書きかえるだけでいいのです。」

ソンくん

「一つ前の問題は、『1行目から3行目まで1行ずつカウントアップしていきながら、

 1列目から3列目まで1列ずつカウントアップ』するのに対して、

 今度の問題は、『4行目から6行目まで1行ずつカウントアップしていきながら、

 4列目から6列目まで1列ずつカウントアップ』するということで、

 カウントアップの開始行終了行開始列終了列が変わるだけですね。

 さきほどのマクロの、For 読取 = 1 To 3For 読取 = 4 To 6に、

 For 読取 = 1 To 3For 読取 = 4 To 6に書きかえます。」

Sub 行と列のループ処理でセルからセルへ値をうつす2()

 Dim 読取行 As Integer

 Dim 書込行 As Integer

 Dim 読取列 As Integer

 Dim 書込列 As Integer

 For 読取行 = 4 To 6

   書込行 = 読取行 + 10

   For 読取列 = 4 To 6

     書込列 = 読取列 + 10

     Cells(書込行, 書込列).Value = Cells(読取行, 読取列).Value

   Next

 Next

End Sub

パイさん

4~6行×4~6に係るセルからセルへ値をうつす順次処理が、二つのForをつかうことで

 一つの順次処理にまとまりました。それでは、そのマクロを実行してみましょう。」

Img5_4_7

ソンくん

4~6行目4~6列目のセルの値が読みとられて、その101014~16行目14~16列目のセル

 に書きこまれました。」


3. 7~10行・7~10列のセルから10行下・10列右のセルへ

Img5_4_8

パイさん

7行目から10行目まで1行ずつカウントアップしていきながら、

 7列目から10列目まで1列ずつカウントアップしていき、

 そのつどセルの値を読みとり、その1010のセルに書きこんでみましょう。」

ソンくん

「今度の問題も、一つ前につくったマクロをか所だけ書きかえます。

 一つ前の問題は、『4行目から6行目まで1行ずつカウントアップしていきながら、

 4列目から6列目まで1列ずつカウントアップ』するのに対して、

 今度の問題は、『7行目から10行目まで1行ずつカウントアップしていきながら、

 7列目から10列目まで1列ずつカウントアップ』するということで、

 カウントアップの開始行終了行開始列終了列が変わるだけですね。

 さきほどのマクロの、For 読取 = 4 To 6For 読取 = 7 To 10に、

 For 読取 = 4 To 6For 読取 = 7 To 10に書きかえます。」

Sub 行と列のループ処理でセルからセルへ値をうつす3()

 Dim 読取行 As Integer

 Dim 書込行 As Integer

 Dim 読取列 As Integer

 Dim 書込列 As Integer

 For 読取行 = 7 To 10

   書込行 = 読取行 + 10

   For 読取列 = 7 To 10

     書込列 = 読取列 + 10

     Cells(書込行, 書込列).Value = Cells(読取行, 読取列).Value

   Next

 Next

End Sub

パイさん

7~10行×7~10に係るセルからセルへ値をうつす順次処理が、二つのForをつかうことで

 一つの順次処理にまとまりました。それでは、そのマクロを実行してみましょう。」

Img5_4_10

ソンくん

7~10行目7~10列目のセルの値が読みとられて、その101017~20行目17~20列目のセル

 に書きこまれました。」


パイさん

「このように、二つのForをつかってループ処理を行えば、

 多数の行×列のセルから多数の行×列のセルへ一瞬で値を代入することができます。

 試しに、二つのForの開始行・終了行・開始列・終了列に設定する値を適当な数字に書きかえて、

 マクロを実行して、多数の行×列のセルから多数の行×列のセルへ値を代入できることを確かめてみましょう。

 (1) 1~6行目、2~7列目のセルの値を読みとり、その10行下・10行右のセルに

 (2) 2~7行目、3~8列目のセルの値を読みとり、その15行下・20行右のセルに

 (3) 3~8行目、4~9列目のセルの値を読みとり、その20行下・25行右のセルに値を書きこんでみましょう。

演習(1):マクロ『 行と列のループ処理でセルからセルへ値をうつす』

1~6行目、2~7列目のセルの値を読みとり、その10行下・10行右のセルに値を書きこむ

Sub 行と列のループ処理でセルからセルへ値をうつす()

 Dim 読取行 As Integer

 Dim 書込行 As Integer

 Dim 読取列 As Integer

 Dim 書込列 As Integer

 For 読取行 = 1 To 6

   書込行 = 読取行 + 10

   For 読取列 = 2 To 7

     書込列 = 読取列 + 10

     Cells(書込行, 書込列).Value = Cells(読取行, 読取列).Value

   Next

 Next

End Sub

 

演習(2):マクロ『 行と列のループ処理でセルからセルへ値をうつす』

2~7行目、3~8列目のセルの値を読みとり、その15行下・20行右のセルに値を書きこむ

Sub 行と列のループ処理でセルからセルへ値をうつす()

 Dim 読取行 As Integer

 Dim 書込行 As Integer

 Dim 読取列 As Integer

 Dim 書込列 As Integer

 For 読取行 = 2 To 7

   書込行 = 読取行 + 15

   For 読取列 = 3 To 8

     書込列 = 読取列 + 20

     Cells(書込行, 書込列).Value = Cells(読取行, 読取列).Value

   Next

 Next

End Sub

 

演習(3):マクロ『 行と列のループ処理でセルからセルへ値をうつす』

3~8行目、4~9列目のセルの値を読みとり、その20行下・25行右のセルに値を書きこむ

Sub 行と列のループ処理でセルからセルへ値をうつす()

 Dim 読取行 As Integer

 Dim 書込行 As Integer

 Dim 読取列 As Integer

 Dim 書込列 As Integer

 For 読取行 = 3 To 8

   書込行 = 読取行 + 20

   For 読取列 = 4 To 9

     書込列 = 読取列 + 25

     Cells(書込行, 書込列).Value = Cells(読取行, 読取列).Value

   Next

 Next

End Sub

 

 今回は、二つのループ処理をつかえば、多数の行×列のセルから多数の行×列のセルへ値を代入できる

 という話でした。

 

 ただ無条件にセルからセルへ値を移すだけでしたら、順次処理ループ処理だけでプログラムは完成します。

 しかし、Excel操作は、条件によって処理を分けることが必要になることもあります。」

ソンくん

Excel操作で、条件によって処理を分けることが必要になったときは、どうしたらよいのでしょうか。」

パイさん

「そのようなときは、プログラムの3つの基本構造の内、

 三つ目の基本構造である条件分岐処理の出番となります。

 条件分岐処理をつかえば、条件によって処理を分けることができます。

 

 条件分岐処理については、次回『もしA列がXのときはエックスを実行』で紹介します。」