エクセルVBA超入門講座(第10回)ループ処理(For文)の使い方

excel-vba-lecture10 Excelマクロ

今回の第9回VBA超入門講座ではループ処理(For文)について解説します。

ループ処理を使えば、マクロの醍醐味である繰り返し作業を自動化することが出来ます。

前回講座の変数(Dim)と併せて使う事で様々な処理が出来るようになります。

また、ループ処理にはFor文(For~Next)の他にDo~Loop文、Do~Until文があります。

それぞれメリットがあり、使い分けを行うことで柔軟に処理を分ける事ができます。

次回の講座でDo~Loop文について解説します。

今回の講座でFor文についてマスターしましょう!

ループ処理とは

For文の使い方について解説する前に、ループ処理とはどういうものかについて解説します。

ループ処理とは、繰り返し決まった処理を行うことを言います。

例えば、次のような売上表を作る場合などです。

sales-chart

A列に日付を埋めるとき、1日、2日・・・30日と1列ずつ入力する必要がありますが、マクロを使うと簡単に埋める事ができます。

また、この表を1年分作るとなると、4月分のシートを作って・・・シートを複製してシート名を「5月」に変更して・・・これを12回繰り返して・・・。と大変面倒です。

これもマクロを使えば比較的簡単に作ることができます。

天馬先生
天馬先生

これは簡単な一例だけど、複雑で面倒な処理が増えるほど、ループ処理の有難さを実感できるよ。

複雑な処理になれば、より力を発揮します。

  • 繰り返し処理を開始
  • 条件で判断
  • 条件①を満たしていたら処理A
  • 条件②を満たしていたら処理B
  • これを1000回繰り返す

なんてことも、数行の処理を記載するだけで実行できるようになります。

ooda-loop

For文(For~Next)の使い方

まずはFor文の基本的な使い方について解説します。

For文は、30回までなど、繰り返す回数が決まっている時に使います。

For文(For~Next)は前回講座で解説した変数を使って次のように使います。

For 変数 = 開始数値 To 終了数値
    繰り返し処理
Next
  • Forを最初の行、Nextを最後の行に記載します。
  • 変数を用いて、ループの開始数値終了数値を記載します。
  • ForとNextの間に実際に行う処理を記載します。

処理の順番としては

  1. For文から始まり、
  2. 繰り返し処理
  3. NextでFor文に戻る

これを終了数値になるまで繰り返します。

loop-process

具体的な例を使って見てみましょう。

先ほどの売上表を作ってみましょう。

まず、次のように日付が埋まってない状態の表があったとします。

sales-chart2

この表に日付を埋めていきます。

VBAでは次のように記載します。

make-saleschart

このマクロを実行すると、表の日付が次のように30日まで埋まります。

sales-chart3

それでは一つずつ見ていきましょう。

For 変数 = 開始数値 To 終了数値

まずは、1行目の「For i = 1 To 30」についてです。

これは、「変数 i を1から開始し30になるまで繰り返す」という事を表わしています。

処理を30回分繰り返すという事です。

天馬先生
天馬先生

For文などのループ処理の変数では「i」や「j」をよく使うよ。

覚えておこう。

繰り返し処理

続いて、2行目の「Range(“A” & i + 1).Value = i & “日”」についてです。

これは、「A列の(i+1)行目を値を”i 日”にする」という事を表わしています。

「i」は変数のため都度変化していきます。

例えば、i=10のとき、

  • Range(“A” & i + 1)は、セルA列の(i+10)行目 = Range(“A11”)
  • i & “日”は、”10日”

となります。

天馬先生
天馬先生

このように「&」を使うことで文字列と数値を組み合わせることが出来るよ。

では、処理を具体的に見ていきましょう。

ループ処理によって、変数「i」は1から始まります。

まず「i=1」のときの処理です。

変数 i の値 1
行の位置 2行目(i=1なので、1+1=2)
日付 1日

これで、まず2行目が次のように埋まります。

sales-chart4

次に、iの値が1つ進んでi = 2となります。

変数 i の値 2
行の位置 3行目(i=1なので、2+1=3)
日付 2日

これで、3行目が次のように埋まります。

sales-chart5

このように変数「i」の値が1つずつ増えていき、「30」まで到達すると30日まで埋まり、処理が完了となります。

sales-chart3

Next

最後の行のNextは変数「i」が1,2,3,・・・30と次に進むために必要な決まった文字となります。

For文の最後に必ず必要です。

記載を忘れて処理実行するとエラーとなります。

忘れずに記載しましょう。

next-error

一定間隔置きに処理をする方法(Step)

基本的なFor文について学んだところで、次に一定間隔置きに処理をする方法について解説します。

一定間隔置きの処理を行う場合はStepを使います。

VBAでは次のように記載します。

For 変数 = 開始数値 To 終了数値 Step 増減値
    繰り返し処理
Next

例えば、次のように1日置きに日付を埋める場合の処理を作成してみます。

sales-chart6

VBAでは次のように記載します。

make-sales-chart-step

それでは一つずつ見ていきましょう。

For 変数 = 開始数値 To 終了数値 Step 増減値

まず、1行目の「For i = 1 To 30 Step 2」についてです。

これは、「変数 iを1から開始し30になるまで1ずつ増やしながら繰り返す」という事を表わしています。

変数「i」は1,3,5,・・・と1つおきに増えていきます。

増減値にはマイナスを指定することも出来ます。

30から1つ置きに減らしていく場合には次のように記載します。

For i = 30 To 1 Step -2

繰り返し処理

続いて、2行目の「Range(“A” & i + 1).Value = i & “日”」についてです。

これは、先ほどの例と同じで「A列の(i+1)行目を値を(i 日)にする」という事を表わしています。

しかし、Stepを使っているため、変数「i」が2ずつ増えていきます。

そのため、1日、3日、5日・・・と1日おきに増えていきます。

3行目の「intRow = intRow + 1」で行数を表わす変数「intRow」が1ずつ増えていきます。

まず「i=1」のときの処理です。

変数 i の値 1
行の位置 2行目(intRow=2)
日付 1日

これで、まず2行目が次のように埋まります。

sales-chart4

次に、変数「i」の値が「3」となります。

変数 i の値 3
行の位置 2行目(intRow=3)
日付 3日

これで3行目が次のように埋まります。

sales-chart7

このように変数「i」の値が1つずつ増えていき、「30」まで到達すると処理が完了となります。

※変数i=29の次にi=31となり、終了数値の「30」を超えるため、実際には30の手前の29で処理が終了します。

For文を入れ子にする(ネスト)

For文は複数重ね合わせることができます。

For文の中に、更にFor文を入れることを、入れ子にする(ネスト)といいます。

外側のFor文の処理から始まり、内部のFor文の処理が全て完了したら、外側の処理に戻ります。

multiple-loop

マクロではこのネスト処理をよく使います。

たとえば、10行×20行の表を作るときなど、2次元の処理をする時によく使います。

では具体例で見ていきましょう。

入れ子(ネスト)の使い方

次のような1月から12月までの、各月10日までの表を作ってみます。

day-table

VBAでは次のように記載します。

make-date-table

まず、外側のFor文「For i = 1 To 12」から始まります。

make-date-table3

ここでまず、変数「i」に「1」が入ります。

単純なループ処理であれば変数「i」が1,2,3・・・と進んでいきます。

しかし、入れ子(ネスト)の場合、内側に更に別のFor文が存在しているため、先にそちらのループ処理が完了するまで実行します。

make-date-table4

内側の処理では、変数「j」が「1」から「10」まで処理されます。

「Cells(i, j).Value = i & “月” & j & “日”」によって、i行目・j列目のセルの値に「i月j日」が記入されます。

まず「i=1」のときの処理です。

変数 i の値 1
変数 j の値 1,2,3,・・・10
行の位置 1行目(i=1)
セルの値 1月1日,1月2日,1月3日,・・・1月10日

これで1行目が次のように埋まります。

day-table2

内側のFor文が完了したので、また、内側の処理に戻ります。

make-date-table3

このとき、変数「i」の値が1つ増え、「2」となります。

そしてまた内側の処理に入っていきます。

make-date-table4

「i=2」のときの処理が次のようになります。

変数 i の値 2
変数 j の値 1,2,3,・・・10
行の位置 2行目(i=2)
セルの値 2月1日,2月2日,2月3日,・・・2月10日

これで2行目が次のように埋まります。

day-table3

このように処理を繰り返すことによって、最初の表が完成します。

day-table

入れ子(ネスト)使用時の注意点

入れ子(ネスト)は複数組み合わせが可能で、複雑な処理を行うときに便利ですが、注意点があります。

それはたくさん入れ子を作ってしまうという事です。

あまり多く書いてしまうと大変見づらくなってしまいます。

また、処理の内容を見直す場合にも、どこを修正したら良いのか、大変分かりづらくなってしまいます。

multiple-nest

ネストは概ね3段階までが推奨されています。

ループ処理を抜ける(Exit For)

ループ処理は終了数値に達する前に途中で抜けることが可能です。

数十件や数百件程度のデータなら問題ありませんが、数千~数万件のデータを処理する場合、終了数値まで処理を待っていると大変処理が遅くなってしまいます。

ループ処理の途中で目的の処理が完了したら、ループ処理を抜けるようにしましょう。

ループ処理を抜けるにはExit Forを使います。

条件分岐If文を使ってループ処理を抜ける処理を記載します。

具体例で見てみましょう。

日付が5日を過ぎたらループ処理を抜けるマクロを作ってみます。

VBAでは次のように記載します。

exit-for

「If i > 5 Then」によって「変数 iの値が5より大きくなったら」という判断ができます。

次の行で「Exit For」が記載されています。

これにより、「変数 iの値が5より大きくなったらループ処理を抜ける」という処理になります。

天馬先生
天馬先生

余計な処理をしないよう、ループを抜ける判断をする癖をつけよう。

まとめ

ループ処理として、For文の使い方について解説しました。

  • For~Nextでループ処理を行う
  • Stepで一定間隔で増減を指定する事が可能
  • 複数のFor文を入れ子にすることが可能(ネスト
  • 入れ子(ネスト)は概ね3段階までが推奨
  • Exit Forでループ処理を抜ける癖をつけよう

入れ子(ネスト)についても解説し、やや混乱された方もいるかも知れませんが、For文はマクロを作るうえで必須のスキルです。

簡単なマクロを作ってみてFor文をマスターしましょう。

次回の講座で別のループ処理(Do~Loop文)について解説します。

最後までお読みいただき、ありがとうございました!

~天然マクロ学校~

コメント

タイトルとURLをコピーしました