「VBAのIF文は使えるようになったけど、FOR文は難しくてまだ使えないです。」
「VBAで繰り返し文について調べたところ、いくつもの例文があります。まずどれを覚えたらよいか分かりません。」
今回は、繰り返し文について触れていきます。
この記事を書いている私は、過去にExcel VBAに挑戦してきましたが、何度も挫折してきました。
今では中級者程度までマスターできましたが、それまでに乗り越えなければいけない壁がいくつかありました。
そのうちの一つが繰り返し文です。
繰り返し文を使えるようになることで、自分のVBAプログラミングスキルが飛躍的に伸びたのを実感できました。
VBAをマスターしたい方には、是非繰り返し文までは頑張って使えるようになって頂きたいです。
繰り返し文法などの説明は他にも様々なサイトで見ることが出来ますので、ここでは習得するコツに特化します。
繰り返し文を習得したい人に立ちはだかる壁
繰り返し文を習得しようとする方にとって、立ちはだかる壁がいくつかあります。それは以下の通りです。
VBA入門者にとって繰り返し文は未体験ゾーン
セルや範囲の選択などのワークシートで行う操作は、マクロ記録ですぐに体験出来ます。
条件分岐の代表格であるIF文も、ワークシートでIF関数を何度か使えば自然と身に付いてきます。
一方、繰り返しを行えるワークシートの機能はありません。
VBAを使ったことのない人にとっては、繰り返し文は未体験なのです。
未体験なので、どんなメリットがあるのか、何に使えるのかイメージがつきにくいのです。
頭では理解出来ない
頭で理解しようと思うと、繰り返し文をマスターすることは出来ません。
頭で理解出来ないので、手も動かせない、といった悪循環に陥ってしまいます。
繰り返し文はいくつかある
繰り返し文は一つだけではありません。
VBAで使える繰り返し文を大きく分けると、FOR NEXT文とDO LOOP文に分かれます。
また、FOR NEXT文にはForEach文というものがあったり、DO LOOPにはUNTILやWHILEがあったりなど、更に細分化されます。
どの文を使ったら良いか分からないという方も多いのではないでしょうか?
これから、上で挙げた壁を取り払っていきます。
繰り返し文を使うメリットは何?
繰り返し文を習得することで得られるメリットについてこれから紹介していきます。
システムのデータを活用する
一番実務でよく使われるのは、システムやWEBのデータをワークシートに反映させる時です。
件数が少ない時は、手入力やコピペで対応できるのですが、10件を超えるとつらくなってきます。
そんな時に繰り返し文を使うとExcelにデータを一瞬で移すことが出来ます。
通常のコピペで反映出来る場合もありますが、表の書式が変わって再調整しないといけなくなります。
VBAの繰り返し文を使うと、表の書式を変えずに、一瞬でデータを反映させることが出来ます。
更にボタンを設置し、作ったマクロと関連付けば、ワンクリックで作業が反映します。
データ件数によっては、手入力の数百倍か数千倍以上の時短効果を得られます。
Access VBAの場合は、Excel以上に繰り返し文を使う頻度が増えます。
プログラム文がスッキリする
順次処理のみでコーディングすると、どうしてもコード文が長くなります。
繰り返し文を使った場合は、コード文を大きく減らすことができます。
例えば、10回の反復動作を繰り返し文にすると、順次処理の10分の1の行数で済みます。
データ件数が大きくなるほど、効果は大きくなります。
他のプログラム言語でも使える
繰り返し文が使えるようになると、他のプログラム言語にも応用できます。
プログラミングは、順次処理・条件分岐・繰り返しの組み合わせで出来ています。
言語によって文法は違いますが、組み合わせ方は同じですので、他の言語の習得にも大きく役立ちます。
例えば、Visual Studioで作るVB.NETフォームについては、ほぼ同じ文法を使えます。
また、Javascript やPHPなどのWEB向けの言語にも繰り返し文がありますので、文法に配慮すれば、そのままVBAでの使い方を活かす事が出来ます。
デバッグ機能をフル活用して身体に染み込ませる
実際に手を動かすために、まずはVBAの解説サイトに記載している繰り返し文をそのままコピペして動作させてみましょう。
実際に実行してみると、一瞬で動作が終わってしまいます。
繰り返しの動きを把握するために、デバッグ機能を徹底して活用しましょう。
ネットに掲載されているコードをコピペし、コマ送りすることで動作が分かるようになります。
更にコードを少しずつ書き換えて動作を変えると、繰り返し文のコツが分かってきます。
デバッグについては、過去に記事を書いていますので、よかったらこちらをご覧ください。
VBAではどの繰り返し文を使えばよいか
入門者の方が繰り返し文を使うには、変数で回数を指定するFOR NEXT文のみ一択で十分です。
下の文は最も基本的なFor文です。For文を作る時は、必ず数値型の変数が必要になります。
Sub For_Statement1()
Dim i As Integer
'100回繰り返し
For i = 1 To 100
'A列に数値を連番で入力
Cells(i, 1).Value = i
Next
End Sub
動作を確認するために、モニターの左側にワークシート、右側にVBEを表示させておきましょう。
実行すると、A列に1行目から100行目まで数値がセルに入力されます。
この文と動きを身体に覚え込ませれば、一気にプログラミングスキルが伸びます。
変数の100を10,000にすると、10,000回繰り返されます。
他の繰り返し文を覚えなくても、全く支障はありません。
逆にDO LOOP文は、無限ループに陥るリスクがありますので、初心者の場合は控えた方がよいです。
私の場合は、覚えたてのうちはDO LOOP文を使っていましたが、プログラミング自体のコツが分かってきたのは、FOR NEXT文を意識して使うようになってからです。
それからは、ほとんどの繰り返し文はFOR NEXT文で済ませています。
更に基本のFOR NEXT文に慣れてきたら、IF文を繰り返し文の中に入れたり、2重ループを作ったりしてみましょう。
プログラミングっぽい、いろいろな複雑な処理を行うことが出来ます。
下に例文を挙げておきます。
Sub For_Statement2()
Dim i As Integer, j As Integer
'縦を10回繰り返し
For i = 0 To 9
'横を20回繰り返し
For j = 1 To 20
'セルに入力される数値を計算
Cells(j, i + 1).Value = i * 10 + j
If (i * 10 + j) Mod 7 = 0 Then '7で割り切れる
Cells(j, i + 1).Interior.Color = RGB(255, 220, 220)
ElseIf (i * 10 + j) Mod 13 = 0 Then '13で割り切れる
Cells(j, i + 1).Interior.Color = RGB(220, 255, 220)
Else 'その他
Cells(j, i + 1).Interior.Color = RGB(220, 220, 255)
End If
Next j
Next i
End Sub
数値を行と列に入力し、7や13で割った時には他のセルとは塗りつぶしの色を変えるようにしています。
コピペして実行するだけでなく、繰り返し回数やIF文の式をなどの条件をいろいろ変えてみましょう。
注意:Do Loopが必要になる場合
For Next文で正常に作動しない場合もありましたので、追記します。
それは、64BitでADOを使う場合です。RecordCountプロパティを正しく表示することが出来ず、コンパイルエラーが発生します。
For Next文で回数を指定することが出来ませんので、Do Loopで制御する必要があります。
EOFが繰り返しを継続する条件になります。
最近は、64BitのOfficeを使う機会も増えてきましたので注意が必要です。
詳細は、後日にまとめます。
無限ループを防ぐ方法
無限ループとは、プログラミングの設計が悪いために繰り返し文が終わらないことです。
キーボードやマウスをいくら触っても、Excelファイルの編集が出来ない状態になっています。
そんな時は、タスクマネージャーを使って一旦Excelを終了させるしかありません。
無限ループによる実害を防ぐための方法は以下の通りです。
- FOR NEXT文を優先して使う
- こまめに上書き保存
- テスト前はブレークポイントを設定する
一番安全で確実なのは、繰り返し文の中にブレークポイントを設けておくことです。
万が一編集したプログラム文が無限ループだったとしても、途中で実行を止めることが出来ます。
まとめ
今回は繰り返し文をマスターするためのコツについて触れました。
繰り返し文を覚えると、VBAプログラミングスキルが飛躍的に伸びます。
様々な複雑な処理もできるようになります。
繰り返し文を使いこなせるようになると、プログラミング的考え方が身についてきます。
今行っている単純作業を無くし、格段に効率を上げることができます。
また、他のプログラミング言語を習得する敷居も下がり、新しいことにも挑戦しやすくなってきます。
VBAを使えるようになりたい方は、繰り返し文までは頑張って覚えましょう。
覚えてしまえば、Excelを使ったいろいろな自動化が出来るようになります。
本日もありがとうございました。