エクセルに限らず、プログラミングの世界で最も強力で破壊的な威力を発揮するのがループ(繰り返し)処理です。
慣れれば誰でもサラサラっと書けてしまうのですが、覚え始めやど忘れしてしまったときなどに役立てていただくため、基本的なループ処理構文の雛形をご紹介しますので、コピペして使ってください。
また、サンプルファイルもダウンロードしてご確認いただけます。
<ループ処理のサンプルファイルはこちらです>
loop-template.xls
サンプルファイルのシートには何も書いていませんが、Alt+F11キーを押していただくとマクロのコードをご確認いただけます。
この記事はExcel2002、Excel2003、Excel2007、Excel2010、Excel2013を対象にしています。
目次
ループ処理の入門は迷わずFor~Next
Excel VBAにおけるループ処理構文は何種類かありますが、その中でも最もスタンダードで入門用として扱いやすいのがFor~Nextステートメントです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'For~Next構文のコピペ用マクロ Sub For_Next_Sample() '変数の宣言 Dim i As Long '<== 行数をカウントアップするための変数 '↓ここからループのスタートです(変数iが1から1000になるまでループします) For i = 1 To 1000 'ループ内で繰り返し処理される内容です Cells(i, 1) = i '<== A列に行番号を振ります Next i '<== iを省略してNextだけ書くこともできます '↑ここまでがループです End Sub |
以下かんたんに解説します。
ちなみに、変数の宣言部分でLong型を使っていますが、Variant型でも良いですし、型を宣言せずに「Dim i」だけでも構いません。
変数の型については別の記事で取り上げますので、今回は深く考えないでください。
For~Next構文の最大の特徴はなんといっても始まりと終わりの値を自分で決めるところにある
数字を繰り上げていくためのカウンターとして使う変数(今回のサンプルではi)の始まりと終わりの数値を明確に指定できるので、とてもシンプルです。
1 |
For i = 1 To 1000 |
上記は変数iが1から1000になるまでという意味になります。
あらかじめ始まりと終わりが決まっている(わかっている)場合に向いていて、逆にループ処理の結果を待たなければ何件になるかわからない場合などには向いてません。そういう場合は後述のDo Loopを使った方が楽です。
Do Loopと違ってFor Nextは範囲が明確に決まっていますので、書き方を間違えて永久ループになってしまうこともありません。
条件に応じて処理件数が変わる(件数がわからない)場合はDo~Loop
あらかじめ処理対象の件数がわかっていない場合は、「一定の条件であり続ける限り」あるいは「一定の条件に達するまで」処理をし続けるDo~Loopステートメントを使います。
一定の条件が続く限り処理を続けるサンプル(Whileキーワードで判定)
先ほどのFor~Next構文のコピペ用マクロ(For_Next_Sample)を実行した後に下記のマクロを実行すると、今セルに入っている数字にそれぞれ1を足します。
For Nextと違ってあらかじめ範囲を指定せず、1列目(A列)になにか値が入っている限りループ処理が続きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
'Do Loop構文のコピペ用マクロ【Whileキーワード編】 Sub Do_While_Loop_Sample() '変数の宣言 Dim i As Long '<== 行数をカウントアップするための変数 '↓ここからループのスタートです i = 1 '<== まずは変数の初期値を設定しておきます(1行目の意) Do While Cells(i, 1) <> "" '<== 1列目(A列)が【空でない間】ループ処理を続行します(Whileキーワードで判定) 'ループ内で繰り返し処理される内容です Cells(i, 1) = Cells(i, 1) + 1 '<== A列の数値に1を足します '変数iを1つ繰り上げ i = i + 1 '<== これを忘れると永久ループになってしまいます Loop '↑ここまでがループです End Sub |
次のUntilキーワードを使って条件判定する場合との違いは【~である間】処理を続けるというところです。
一定の条件に達するまで処理を続けるサンプル(Untilキーワードで判定)
先ほどと同様、今セルに入っている数字にそれぞれ1を足します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
'Do Loop構文のコピペ用マクロ【Untilキーワード編】 Sub Do_Until_Loop_Sample() '変数の宣言 Dim i As Long '<== 行数をカウントアップするための変数 '↓ここからループのスタートです i = 1 '<== まずは変数の初期値を設定しておきます(1行目の意) Do Until Cells(i, 1) = "" '<== 1列目(A列)が【空になるまで】ループ処理を続行します(Untilキーワードで判定) 'ループ内で繰り返し処理される内容です Cells(i, 1) = Cells(i, 1) + 1 '<== A列の数値に1を足します '変数iを1つ繰り上げ i = i + 1 '<== これを忘れると永久ループになってしまいます Loop '↑ここまでがループです End Sub |
前のWhileキーワードを使って条件判定する場合との違いは【~になるまで】処理を続けるというところです。
オブジェクトの集まり(コレクション)をひと周りループするならFor Each~Next
今まで書いてきたFor~NextやDo~Loopは数値をもとに判定することが多いのですが、これに対してFor Each~Nextはオブジェクトの集まりを片っ端から処理するときに役立ちます。
簡単な例を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
'For Each~Next構文のコピペ用マクロ Sub For_Each_Next() '変数の宣言 Dim c As Range '<== 処理対象のセルを格納するための変数 '↓ここからループのスタートです(セルA1からA1000の範囲内を順にループします) For Each c In Range("A1:A1000") 'ループ内で繰り返し処理される内容です c = c + 1 '<== 処理対象セルの数値に1を足します Next c '<== cを省略してNextだけ書くこともできます End Sub |
上の例ではセルの集まりを処理していますが、例えば他にもシートの集まりなどに対してもループ処理することができます。
駆け足で書いてきましたけれども、いかがでしたでしょうか。
今日のExcelスキルアップ
ループ処理は超強力なプログラミング手法です。
これに手を出し始めたあなたはもう立派なプログラマーです。
私もなれるまでの間はよくど忘れして本を開いたりネット検索したりしました。また、Do~Loopの最後で変数を繰り上げるのを忘れて永久ループを実行してしまったりという失敗は今でもたまにやります。。。
これからも、もしループの構文をうっかり忘れしてしまったら、この記事のことを思い出してくださいね。
ではまた。
コメント