まえがき
プログラミングは条件分岐と繰り返し処理で出来上がってます。繰り返し処理の中でもfor next構文は使い勝手が良く、最も利用する構文です。
とても重要で理解してしまえば簡単なので、是非使い方を覚えて、何度も使って覚えてください。
基本形
まずは基本形です。i1が1ずつ増加する場合はこれだけの記載で大丈夫です。
for i1 = 10 to 100 |
処理 |
next i1 |
i1が変数で10から100までi1を1ずづ増やして繰り返し処理を実行します。処理としては
HENSUU = Cells(i1,1)
などとセルの位置をずらしながら処理を行ったりする事ができます。
STEP設定
初期値としては1ずつ増える設定ですがStepを使う事で任意で増加・減少をさせる事ができます。
2ずつ増やす場合
for i1 = 10 to 100 step 2 |
処理 |
next i1 |
1ずつ減らす場合
for i1 = 100 to 1 step -1 |
処理 |
next i1 |
式や変数を終了(または開始)の値として使う
数字だけではなく、変数を繰り返しの回数として使う事もできます。
よく利用されるのが、最初の行から、最後の行まで処理させる方法です。
詳しい説明は割愛しますが、1行目の最後の行は以下となります。
Cells(Rows.Count, 1).End(xlUp).low
1行目から、1行目の最終行まで実行する場合は
for i1 = 1 to Cells(Rows.Count, 1).End(xlUp).low |
処理 |
next i1 |
となります。上の例では式を使いましたが、変数も同様に設定できます。
入れ子設定
繰り返しを入れ子で設定する事で、膨大な量の処理を10数行で書くこともできます。例えば100データの繰り返しの中に、別の軸で100データであれば、10,000データを処理できて、更に別軸で100データの処理を加えると、1,000,000データという具合に指数関数的に増加します。
上の例では最終行まで処理させる繰り返し処理でしたが、今度は最終列まで繰り返す処理を実施して、その中に最終行まで繰り返す処理を入れてみます。
細かい説明は割愛して、1行目の最終列を表す数式はこのように表現します。
Cells(1, 1).End(xlToRight).Column
1行目がタイトル行で3行目の最終列を設定したい場合はこのように表現します。
Cells(3, 1).End(xlToRight).Column
3行目以降にデータがあるとして、1列目から最終列まで、繰り返す場合は
for i2 = 1 to Cells(3, 1).End(xlToRight).Column |
処理 |
next i2 |
となります。
それに、各列の最終行まで繰り返す処理を加えた場合は、次のようになります。
for i2 = 1 to Cells(3, 1).End(xlToRight).Column |
for i1 = 3 to Cells(Rows.Count, i2).End(xlUp).low |
処理 |
next i1 |
next i2 |
ポイントとしてはi2が列を表す変数として、i1の式に組み込まれているところです。これにより、常に1列目の最終行まで実施するのではなく、各行の最終行を毎回確認しながら、無駄なく処理が実行されます。
少し難しい内容となりましたが、重要なところなので理解できるまで読み返してください。
Gotoで次の繰り返し処理に移動する
繰り返し処理の中で、if文で処理をさせて次の繰り返し処理を実行するケースはよくあります。if文1つであれば、特に何もする必要は無いのです。しかし、複数のif文で分岐させる複雑な処理の場合は、プログラムは上から下の順にすべて実行されるので、後続の処理をさせずに次の繰り返しに移りるために、処理を飛ばす必要があります。
Label1(変数)までスキップさせる場合は [GoTo Label1 ]と記載します。
スキップさせたい先の行に[Label1: ]というように、自身で決めた変数の右に:(コロン)を付けます。
for i1 = 1 to Cells(Rows.Count, 1).End(xlUp).low |
If 条件1 then |
処理1 |
GoTo Label1 |
Endif |
If 条件2 then |
処理2 |
Endif |
Label1: ‘ GoTo の次はここから処理が行われる |
next i1 |
通常はこのように繰り返しの一番下にスキップしてi1を次の値にカウントアップさせます。
GoToでスキップさせる場合の注意点としては、プログラムは上から下に流れるので、上にスキップさせた場合は、他のラベルでスキップさせて、無限ループにならないようにしてください。
Exit Forで繰り返しを抜ける方法
特定の条件を満たして、繰り返し処理を抜ける場合のやり方を紹介します。
次の例では条件1に一致した場合に処理1を実行して繰り返し処理を抜けます。
for i1 = 1 to Cells(Rows.Count, 1).End(xlUp).low |
If 条件1 then |
処理1 |
Exit For |
Endif |
next i1 |
繰り返し処理を抜ける場所に[Exit For]と記載するだけで良いです。
エラーを検知して繰り返し処理を抜ける場合
繰り返し処理中にエラーで止まってしまう事を避けるために、エラー発生時に[On Error GoTo ]でエラー処理にスキップする事ができます。
サンプルではエラー処理後に繰り返し処理に戻り、最後の繰り返し処理が終わったら、エラー処理を飛ばすようにしていますが、単純にエラー処理をして繰り返し処理を抜けるだけであれば、Label2とLabel3は不要です。
for i1 = 1 to Cells(Rows.Count, 1).End(xlUp).low |
On Error GoTo Label1 ‘ エラーが発生したらLabel1 へ移動する |
If 条件1 then |
処理1 |
Endif |
処理 |
Label2: ‘ エラー処理が終わったらループに戻る |
next i1 |
GoTo Label3 |
Label1: ‘ エラーが発生したらここから処理が始まる |
‘ エラー処理 |
GoTo Label2 |
Label3: ‘ 繰り返し処理が終わったらエラー処理を飛ばす |
For nextを使った繰り返し処理の説明は以上です。急に難しくなったと感じる方も多いかと思いますが、ここを理解すればプログラム作成の幅が一気に広がり、プログラム作成が楽しくなるところですので、頑張って覚えましょう。