みなさんこんにちは!
ラピードアクトでインフラエンジニアの仕事をしております、ITソリューション事業部の林です。
VBA学習初級編も今回で3回目となりました。
前回までの内容を復習したい方は以下のリンクからどうぞ。
初級編第1回
初級編第2回
■学習トピック■
- VBAでエラーが表示された場合の対処方法
- 繰り返し処理とは
- 繰り返し処理の構文
- Forステートメントを用いたプロシージャ作成-その①
- Cellsを用いたセルの指定方法
- Forステートメントを用いたプロシージャ作成-その②
- 終わりに
今回は、実用的なプログラムには欠かせない「繰り返し処理」について解説いたします。
前回までの内容と比較すると、プログラミングを始めて間もない方にとっては少々難しい内容になります。
ですが、繰り返し処理の理解はプログラミング上達のために避けて通れません。
ひとつひとつ理解していくことでスキルは確実に上達していきますので、頑張っていきましょう!
【VBAでエラーが表示された場合の対処方法】
繰り返し処理の解説を始める前に、VBAのエラーの種類とその対処方法について解説します。
実行時エラーについて
プロシージャを実行すると、以下のようなポップアップが表示されることがあります。

これは「実行時エラー」というもので、プロシージャの実行開始後にエラーが発生した、という旨の通知です。
ポップアップの「終了」を押下すると、プロシージャの実行は終了します。
ポップアップの「デバッグ」を押下すると、エディタは「デバッグモード」に移行します。
デバッグモードでは、エラー発生箇所で処理が中断された状態になっています。
黄色で表示された部分がエラーを起こした箇所です。

エラーの原因はさまざまで、変数に不正な値が代入されたり、オブジェクトの指定が間違っていたりと、一概には言えません。
ポップアップの「ヘルプ」ボタンを押すと、エラーに関連する情報が表示されますので、エラー解決の糸口が見つかるかもしれません。
先ほどの実行時エラーでは、Rangeの参照先指定が間違っているので、その箇所を修正する必要があります。

エラー部分を修正した後は実行(F5キー)するか、エディタの実行ボタンを押します。
エラーを修正せずにデバッグモードを解除するには、エディタのリセットボタンを押下してください。

コンパイルエラーについて
コード入力中に「コンパイルエラー」が発生することがあります。これは、VBAの自動構文チェック機能が通知するエラーです。

コンパイルエラーが起きたらOKを押し、エラーの原因を探ります。
赤く表示された箇所を観察して、誤字脱字のないこと、書き方に問題が無かったか確認します。
上記のコンパイルエラーでは、Rangeのとじ括弧が抜けているので、その箇所を修正する必要があります。
エラーの原因が解消されたら、赤表示は解除されます。
【繰り返し処理とは】
プログラムに「処理を繰り返し実行させる」ことを繰り返し処理と言います。
例えば、A1セルからA10セルまで連続した数値を入れる場合で考えてみましょう。

Excelシート上ならマウスでドラッグすれば連続データを入力できますが、それをVBAでやるにはどのようにすればよいでしょうか。
単純に考えれば、「セルに数値を入力する処理を10行書く」という発想になります。

しかし、この発想をもとに書かれたソースコードには柔軟性に欠けるという問題点があります。
柔軟性に欠けるとは、処理要件の変更に対応するのが困難である、という意味です。
最初は「A1からA10セルまで入力」でよかったものが、後になって「A1からA100セルまで入力」に変わるかもしれません。
そうなってしまったら大変です。10行だけだったソースコードが、一気に100行に膨れ上がってしまいます。

さらに、そのような変更が頻繁に発生したら……と考えると、柔軟性に欠けたソースコードは良いとは言えません。
このようなケースで使えるのが、繰り返し処理です。
繰り返し処理を用いれば、セルに数値入力する回数が100に変わっても1000に変わっても、ソースコードの書き換えを最小限に済ませられます。
【繰り返し処理の構文】
VBAでは繰り返し処理を記述する方法は複数ありますが、今回は代表的な「Forステートメント」のみ解説します。
ステートメントとは、いくつかの句で構成された制御文を指します。
Forステートメントの構文(指定された回数繰り返す場合)
For カウンタ = 開始値 To 終了値
処理A
Next
Forステートメントには他の書き方もあるのですが、今回は使用頻度の高いものを載せています。
これがどのように動くのか、実際にプロシージャを作って確認していきましょう。
【Forステートメントを用いたプロシージャ作成-その①】
Excelを起動してエディターを立ち上げたら、標準モジュールに任意の名前でプロシージャを定義してください。
下記の画像では、「ExcelVBA003」という名前でプロシージャを作っています。

最初に、プロシージャに「カウンタ」を用意します。
このカウンタというのは、変数のことで、データ型は整数型(Long)を定義します。
以下のように変数定義をしてください。画像では「Idx」という変数を用意しました。

次に、Forステートメントの構文どおりに記述していきます。
構文にあった「カウンタ」「開始値」「終了値」は、それぞれ「Idx」「1」「10」に置き換えます。

続いて、「For」と「Next」の行の間に、以下のようにMsgboxを記述します。

ここまで入力したら、プロシージャを実行(F5キー)してみましょう。
ポップアップが10回表示され、メッセージ部分は1から10に変化しています。

なぜこのような動きになるのかというと、このForステートメントは、カウンタ(変数Idx)の値変更を行っているからです。
値変更の範囲は、開始値(1)から終了値(10)になるまでです。
繰り返し回数は、1から10までのカウントアップなので、10回となります。
変数Idxの値は変更されていますので、Msgboxで表示される値は1,2,3,・・・,9,10と、変化します。
カウントアップで増える値は変更可能ですが、まずはデフォルトである1ずつのカウントアップについて理解しておきましょう。
★Forステートメントの動作 まとめ★
・カウンタが開始値から終了値になるまで処理を繰り返す
・カウンタは1ずつ増えていく
・カウンタには整数型の変数を使用する
【Cellsを用いたセルの指定方法】
Forステートメントの動きを理解したところで、セルの値書き換えに進みたいところですが、こちらを先に解説します。
前回、Rangeを用いてセル(オブジェクト)を参照する方法を解説しましたが、実はもう一つ参照方法があります。
それは、「Cells」を用いたセル参照です。
Cellsを使用した参照方法
Cells(行番号, 列番号)
RangeでB3セルを参照する場合、「Range("B3")」と書きましたが、Cellsでは「Cells(3, 2)」となります。

括弧内には、Rangeでは文字列、Cellsでは数値が使用されます。
Cellsでセル指定する際の注意点としては、「行番号, 列番号」の順であるというところです。
Rangeの場合とは逆ですので、気を付けましょう。
このCellsでのセル参照方法は、Forステートメントのように数値を変化させる繰り返し処理と非常に相性が良いです。
【Forステートメントを用いたプロシージャ作成-その②】
ここでは、ForステートメントとCellsを使ったプロシージャを作成します。
先ほど作成したプロシージャをそのまま流用しますので、一から作らなくてもOKです。
Msgboxの行を、以下のように書き換えてください。

プロシージャを実行すると、Excelシートの値が書き換わります。

ここでは、繰り返し処理中にカウンタの値が書き換わる特性を利用して、書き換え対象セルを毎回変化させています。
Cellsの括弧内、「行番号」にカウンタ(変数Idx)を指定すると、処理が繰り返されるたびに書き換えられる行が変わります。
さらに、セルのValueプロパティにはカウンタの値を代入していますので、各行の値には連番が入力されます。
繰り返し処理を使用することで、連続データを入力する対象セルが100でも1000でも、ソースコードを書き換える箇所は1か所で済みます。

また、繰り返す回数をユーザー入力させることでより柔軟性を持たせる方法もあります。
プロシージャの以下①~④の箇所を追記、書き換えてください。

Sub ExcelVBA003() Dim Idx As Long Dim EndIdx As Long EndIdx = InputBox("数値を入力してください") Cells.Clear For Idx = 1 To EndIdx Cells(Idx, 1).Value = "A" & Idx Next End Sub
新しく用意した変数(①)に、Inputboxから入力した値を代入しています(②)。
ワークシートに残っていた値を削除するために、Clearメソッドを使用しています(③)。「Cells.Clear」はワークシート上の全セルの値と書式をクリアします。
Inputboxで入力された値をForステートメントの終了値に使用しています(④)。
このプロシージャを実行すると、Inputboxで入力した数と同じ数のセルに値が入力されます。

入力する数を変更して、結果が変わることを確認してみてください。
【終わりに】
繰り返し処理について解説しましたが、いかがだったでしょうか。
書き方にルールがあり、最初のうちはなかなか覚えられないと思います。
特にForステートメントのような構文は、目で見て覚えるのは難しいので、実際に入力してみるのがおすすめです。
1回入力しただけでやめず、何度か繰り返してみましょう。
そして、学んだ内容が理解できてきたら、発想を活かしていろんなパターンでプログラムを作ってみましょう。
そうすることで、応用する力が鍛えられていきます。
次回は「条件分岐」について解説いたします。
それでは、また次回お会いしましょう!