前回はVBAでコピー&ペーストの方法を書きました。
で、次もVBAでの常套句【繰り返し処理】の書き方です。
では早速今回やりたいことから確認しておきましょう。
この記事でやりたいこと
今回やりたいことはいたって単純です。
この列名をコピー、別シートにリストにして貼り付けます。
これを力技でVBAで書くとこうなります。
Sub 列名取得_ダメなパターン()
Sheets(1).Cells(1, 1).Copy Sheets(2).Cells(2, 1)
Sheets(1).Cells(1, 2).Copy Sheets(2).Cells(3, 1)
Sheets(1).Cells(1, 3).Copy Sheets(2).Cells(4, 1)
Sheets(1).Cells(1, 4).Copy Sheets(2).Cells(5, 1)
Sheets(1).Cells(1, 5).Copy Sheets(2).Cells(6, 1)
Sheets(1).Cells(1, 6).Copy Sheets(2).Cells(7, 1)
Sheets(1).Cells(1, 7).Copy Sheets(2).Cells(8, 1)
Sheets(1).Cells(1, 8).Copy Sheets(2).Cells(9, 1)
Sheets(1).Cells(1, 9).Copy Sheets(2).Cells(10, 1)
End Sub
いやいやいやいや、これは無い。笑
まず書くのがめんどくさいし、列が増えたら対応できないですよね。
しかもよく見ると、コピー元の列インデックスとコピー先の行インデックスしか変わってません。
そして次の関係が成り立っていることも分かります。
- コピー元列インデックスは1~9で1ずつ増加。
- コピー先行インデックス = コピー元列インデックス+1
であればコピー元列インデックスだけ1~9で繰り返す処理ができれば、いちいちこんなに書かなくてもいいわけです。
そこで出てくるのが[For~Next]です。
次から、繰り返し処理の具体的な書き方を見ていきましょう。
[For~Next]の使い方
変数宣言
まず、繰り返す過程で変わるもの変わらないものを確認しましょう。
- 変わるもの:コピー元列インデックスとコピー先行インデックス
- 変わらないもの:Sheets(1).Cells(1, 変).Copy Sheets(2).Cells(変, 1)
このコピー元列インデックスとコピー先行インデックスは都度変化し、これ以外は固定ということになります。
ですので、まずこの変わる部分について変数宣言します。
Dim i As Long
これが変数宣言です。
「ここに i は数値型の変数であることを宣言する!」
こんなところでしょうか。これがあることで、変数であることが明示されました。
次にFor~Nextについてみていきましょう。
繰り返し処理
ここで繰り返す処理はFor~Nextの内側に書きます。
書き方はこちら。
For [変数] = 開始 To 終了
繰り返す処理内容
Next
これで意味は[変数]を[開始]から[終了]まで[処理]を繰り返すです。
今回のやつにあてはめるとこうなります。
For i = 1 To Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
Sheets(1).Cells(1, i).Copy Sheets(2).Cells(i + 1, 1)
Next
これで、今回のマクロは完成です。
まとめ
今回作ったマクロはこうです。
Sub 列名取得()
Dim i As Long
For i = 1 To Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
Sheets(1).Cells(1, i).Copy Sheets(2).Cells(i + 1, 1)
Next
End Sub
整数型の変数 i を宣言し、For~Nextでiが1から[列数]までコピー&ペーストし、最後はEnd Subで締めました。
これを実行すると最初に示したように、Sheet1の列名をSheet2に列名リストとしてコピーするのです。
ここまでがFor~Nextの使い方でした。
次回、じゃあ二重に繰り返す場合は?条件に応じて処理を変えたい場合は?そんなことを書きますのでお楽しみに。
最後までお読みいただき、ありがとうございました。