
Excel VBAで便利なループ処理はネスト(入れ子)にすることで複雑な処理を行なうことが可能です。
今回はFor Nextステートメントでループ処理をネスト(入れ子)する方法について解説していきます。
For Nextステートメントの基本をおさらい
For Nextステートメント自体に馴染みがない方は過去記事のこちらをまずはご参照ください。
【Excel VBA】For Nextステートメントで同じ処理を指定した回数分繰り返す方法 | Excelを制する者は人生を制す ~No Excel No Life~
ネストとは?
ネストの一般的な定義も確認しておきましょう。
構造化プログラミングにおける、プログラムの構築手法のひとつ。複数の命令群をひとまとまりの単位にくくり、何段階にも組み合わせていくことでプログラムを構成する。このまとまりをネストという。主なネストの種類は、条件分岐(C言語などでは「if」文)、一定回数の繰り返し(同「for」文)、および条件つき繰り返し(同「while」文)である。ネストの内部に別のネストを何段階にも重ね、入れ子構造にしていくことを指して「ネスト」「ネスティング」と呼ぶことがある。
参照元:ネストとは 〔 入れ子 〕 【 nest 】 – 意味/解説/説明/定義 : IT用語辞典
使用例
A1セルの値を”1-1″とし、A1セルを起点に値の左の数字は行、右の数字は列が増えるに従い、それぞれ1ずつ加算されていき、最終的には”5-5″になるようにします。
1 2 3 4 5 6 7 8 9 10 |
Sub ループネスト() Dim i As Integer Dim j As Integer For i = 1 To 5 For j = 1 To 5 Cells(i, j).Value = "'" & i & "-" & j Next j Next i End Sub |
2・3行目でカウンタ変数をInteger型で設定します。変数名は”i”と”j”としています。
今回の開始値はA1セルから5回繰り返し処理を行なうので5・6行目のどちらも開始値は1、終了値は5となります。
今回の条件は「A1セルを起点に値の左の数字は行、右の数字は列が増えるに従い、それぞれ1ずつ加算されていき」なので7行目は「Cells(i, j).Value = “‘” & i & “-” & j」となります。
「Cells(i, j).Value」でA1~E5列の値を示し、代入演算子(=)で行数と”1-1″~”5-5″の値が代入されるように設定しています。
Excelの設定上単純に”1-1″と入力すると日付情報として認識されてしまうため、「 ‘ 」[アポストロフィ]を頭に入れて文字列扱いにしています。
8行目に「Next j」、9行目で「Next i」で締めて終了になります。
マクロの動作イメージ
A1:E5の範囲にそれぞれ”●-○”という形式の値が代入されました。
●が行番号でiの変数の処理、○が列番号(Aが1、Eが5)でjの変数の処理となります。
なお、処理の優先順位は上図の通りVBAのコードの中の内側の処理(今回であればjの処理)が優先されます。
ネストをやりすぎると繰り返し処理の回数が膨大になってコードの実行に時間がかかる要因になる場合がありますので注意しましょう。
まとめ
規則性がある繰り返し処理を行なう際に今回のループをネストすることで対応できる可能性があります。
コードが複雑になりがちですが、少しずつコードを実行しながら適宜修正することで希望の結果を得られますので、ぜひ試してみてください。