【ループ処理でセルからセルへ値を代入する】
1 セルからセルへ値を代入
2 行のループ処理でセルからセルへ値を代入
3 列のループ処理でセルからセルへ値を代入
4 行×列のダブルループ処理でセルからセルへ値を代入
行×列のダブルループ処理でセルからセルへ値を代入
パイさん
「ループ処理をつかって、行番号と列番号をカウントアップしながらセルからセルへ値を代入してみましょう。
Excel VBA/マクロのダブルループ処理をつかえば、
一つの順次処理で多数行×多数列のセルの値を読みとり
別の多数行×多数列のセルにその値を書きこむことができます。
変数『行番号』を、開始行から終了行になるまで1ずつカウントアップさせながら、
併せて、変数『列番号』を、開始列から終了列になるまで1ずつカウントアップさせて、
セルの値を読みとり別のセルにその値を書きこむ順次処理をくり返し実行する
二重For文は、次のようになります。
今回も、多数のセルの値を読みとることになるので、『ループ処理で多数行×多数列のセルに書きこむ』
のときにつくったマクロ『行番号と列番号をカウントアップするループ処理2』をつかって、
あらかじめ10行×10列のセルに値を書きこんでおきましょう。」
1. 1~3行・1~3列のセルから10行下・10列右のセルへ
パイさん
「行を1行目から3行目まで1行ずつカウントアップしていきながら、
列を1列目から3列目まで1列ずつカウントアップしていき、
そのつどセルの値を読みとり、その10行下・10列右のセルに書きこんでみましょう。
このとき行番号を変数『読取行』と変数『書込行』、列番号を変数『読取列』と変数『書込列』としましょう。」
ソンくん
「『読取行』『書込行』『読取列』『書込列』を整数型として変数宣言
行を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文をつかうことで
一つの順次処理にまとまりました。それでは、そのマクロを実行してみましょう。」
ソンくん
「1~3行目・1~3列目のセルの値が読みとられて、その10行下・10列右の11~13行目・11~13列目のセル
に書きこまれました。」
2. 4~6行・4~6列のセルから10行下・10列右のセルへ
パイさん
「行を4行目から6行目まで1行ずつカウントアップしていきながら、
列を4列目から6列目まで1列ずつカウントアップしていき、
そのつどセルの値を読みとり、その10行下・10列右のセルに書きこんでみましょう。」
ソンくん
「今度の問題も、行と列の二つのループ処理を利用できそうですね。」
パイさん
「その通りです。実は一つ前につくったマクロを4か所書きかえるだけでいいのです。」
ソンくん
「一つ前の問題は、『行を1行目から3行目まで1行ずつカウントアップしていきながら、
列を1列目から3列目まで1列ずつカウントアップ』するのに対して、
今度の問題は、『行を4行目から6行目まで1行ずつカウントアップしていきながら、
列を4列目から6列目まで1列ずつカウントアップ』するということで、
カウントアップの開始行と終了行、開始列と終了列が変わるだけですね。
さきほどのマクロの、For 読取行 = 1 To 3をFor 読取行 = 4 To 6に、
For 読取列 = 1 To 3をFor 読取列 = 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文をつかうことで
一つの順次処理にまとまりました。それでは、そのマクロを実行してみましょう。」
ソンくん
「4~6行目・4~6列目のセルの値が読みとられて、その10行下・10列右の14~16行目・14~16列目のセル
に書きこまれました。」
3. 7~10行・7~10列のセルから10行下・10列右のセルへ
パイさん
「行を7行目から10行目まで1行ずつカウントアップしていきながら、
列を7列目から10列目まで1列ずつカウントアップしていき、
そのつどセルの値を読みとり、その10行下・10列右のセルに書きこんでみましょう。」
ソンくん
「今度の問題も、一つ前につくったマクロを4か所だけ書きかえます。
一つ前の問題は、『行を4行目から6行目まで1行ずつカウントアップしていきながら、
列を4列目から6列目まで1列ずつカウントアップ』するのに対して、
今度の問題は、『行を7行目から10行目まで1行ずつカウントアップしていきながら、
列を7列目から10列目まで1列ずつカウントアップ』するということで、
カウントアップの開始行と終了行、開始列と終了列が変わるだけですね。
さきほどのマクロの、For 読取行 = 4 To 6をFor 読取行 = 7 To 10に、
For 読取列 = 4 To 6をFor 読取列 = 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文をつかうことで
一つの順次処理にまとまりました。それでは、そのマクロを実行してみましょう。」
ソンくん
「7~10行目・7~10列目のセルの値が読みとられて、その10行下・10列右の17~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のときはエックスを実行』で紹介します。」