まとめ
VBAのFor文で、2つ以上の変数を同時に変化させていきたい。1つ目の変数については、For文内の1行目に書くべき i = 1 to 10 とかをそのまま使えばよい。2つ目以降の変数については、予めFor文の前に初期値を入れておいて(j = 1 など)、For文の中に例えば j = j + 2 と書いてカウントアップさせていき、For文の中の最後の方に例えばIf分で j = 10 になったら exit するというような行を入れる。こうすることで、2つ以上の変数をFor文の中で同じタイミングで変化させていける。
やりたいこと
VBAのForステートメントで、2つ以上の変数を同時に変化させていきたい。
しかし、Forステートメントの基本的な書き方だけだと、一度に1つの変数しか変化させていけない。このため、少し工夫してみたい。
なお、Forステートメントの入れ子構造だと、2つ以上の変数を段階的に変化させることはできるが、全く同じタイミングごとには変化させられないので、この場合は使えない。
試した環境
- Excel:
Microsoft Excel for Microsoft 365 MSO (バージョン 2407 ビルド 16.0.17830.20056) 64 ビット - VBE:
Microsoft Visual Basic for Applications 7.1
やったこと
縦に並ぶセルを1つ飛ばしずつオブジェクトに入れていくというコードを、以下のように書いてみた。
このとき、1つ目の変数にはセルの行番号が入り、2つ目の変数にはそれらを入れる先のオブジェクト配列のインデックス(添え字)の数値が入るようにした。
Option Explicit Sub counttest() 'i が1つ目の変数。j が2つめの変数。 Dim i As Long, j As Long Dim obj1(11) As Object '2つ目の変数の初期値を入れる。 j = 1 '1つめの変数(セルの縦列の行番号)を1つ飛ばしでカウントしていく For i = 5 To 100 Step 2 'obj1オブジェクトにセルを入れていく。 Set obj1(j) = Cells(i, 1) '2つ目の変数をカウントアップ j = j + 1 '2つ目の変数の必要数の最後まで達したら、この繰り返しから脱出する。 If j = 10 Then Exit for End If Next i End Sub
2つ目の変数の始めとカウントアップ間隔と終わりの指定
2つ目の変数については、Forステートメントの1行目に書いた “i = 5 To 100 Step 2” のような開始番号と、カウントアップ(またはダウン)の間隔、および最後の番号を、簡単に指定することができない。
よってその代わりとして、開始番号としてはForステートメントの前に予め j = 1 と書いた。カウントアップについては、For文の中に j = j + 1 と書いた。そして最後の番号については、Forステートメントの最後の方で If ステートメントを使い、その中で最後にしたい番号になったらForステートメントを脱出するという流れにした。
まあ2つ目の変数の最後の番号については、別に指定しなくてもよいことが多いと思う。1つ目の変数のカウントの終りに合わせて自動的に2つ目の変数のカウントも終わらせるという場合が多いと思うので。