【ExcelVBA】呼び出し履歴
呼び出し履歴
今回は呼び出し履歴について紹介します。
プロシージャはその処理の中から別のプロシージャを呼び出すことができます。しかし、何らかの問題が発生したとき(エラーが発生してデバッグモードになったとき)に、そのプロシージャがどこから呼び出されたか一見すると分かりにくくなってしまいます。この時に便利なのが「呼び出し履歴」です。
プログラムが小さいうちはそれほど効果が実感できないかもしれませんが、大きく複雑になってくるととても重宝する機能です。
プロシージャからプロシージャを呼び出す
では、サンプルプログラムを作ってみましょう。
Sub VBA基礎第18回_1() Range("B1").Value = Percent(Range("A1").Value) Range("B2").Value = Percent(Range("A2").Value) Range("B3").Value = Percent(Range("A3").Value) End Sub Function Percent(n) As String Percent = n / 100 & "%" End Function
シートはこのようにA1からA3に3つの値を設定します。
今回は2つのプロシージャを作成します。1つは今までのように「VBA基礎第18回_1」というものになります。
もう1つは「Percent」というプロシージャで、引数に「n」を渡すとその値を100で割って後ろに「%」を付けて呼び出し元(このケースではプロシージャ「VBA基礎第18回_1」)に値を返します。
この処理はA1からA3の3つのセルに対して行います。プロシージャ「Percent」を3回呼び出していることになります。
このように同じ処理を何度も行う場合には、その処理の部分を切り出し別のプロシージャにすることでプログラムをシンプルに効率よく作っていくことができます。
図示するとこのようになります。
呼び出し履歴を表示する
では、今まで通り「VBA基礎第18回_1」プロシージャを実行してみましょう。
(マウスカーソルの位置に気を付けてください。「Percent」プロシージャ内にカーソルがあるとうまく実行することができません。)
実行すると次のようなエラーメッセージが表示されてしまうかと思います。
また、シートの方はセル「B1」と「B2」には値が設定されますが、「B3」に値が入っていないことが分かります。
エラーウィンドウでは「デバッグ」をクリックしてエラー個所を表示しましょう。
この黄色の網掛け部分をみると、プロシージャ「Percent」のところでエラーが発生したことはわかりますが、そのプロシージャがどこから呼び出されたかは不明です。
ここで呼び出し履歴を使用します。
呼び出し履歴を表示するには、VBE(Visual Basic Editor)の「表示」メニュー→「呼び出し履歴」を実行します。
※「呼び出し履歴」は、マクロが一時停止してデバッグモードになった時だけ表示することができます。
呼び出し履歴をみると、一番上にプロシージャ「Percent」が表示され、その下(赤いアンダーライン)にプロシージャ「VBA基礎第18回_1」が表示されています。
このように呼び出し元のプロシージャが下に、呼び出し先のプロシージャが上に表示されます。
では、赤いアンダーラインのプロシージャを選択して「表示」ボタンをクリックしてみましょう。
呼び出し履歴ウィンドウが閉じて、VBEに戻ってきます。欄外に緑の三角マークが表示され、この部分からプロシージャ「Percent」が呼び出されその結果としてエラーとなっていることがわかります。
すなわち、セル「A3」の処理に失敗したということです。
セル「A3」の値を確認すると、「abc」となっていますね。この文字に対して「100で割る」という数値計算を行おうとしたため、割り算を行うことができずエラーとなってしまったということです。
まとめ
プロシージャはその処理の中から別のプロシージャを呼び出すことができます。
「呼び出し履歴」は、このようなプログラムでエラーが発生し、デバッグするときに便利な機能です。
呼び出し履歴は、デバッグ中でないと表示することができないため、エラーが発生したときは「デバッグモード」にしてから使用します。ブレークポイントを設定して一時停止にしてから使用することも可能です。
確認問題
以下の「○○○」に当てはまる文言を解答してください。
プロシージャはその処理の中から○○○を呼び出すことができる。
「呼び出し履歴」は、このようなプログラムでエラーが発生し、デバッグするときに便利な機能である。
呼び出し履歴ウィンドウで上に表示されているプロシージャは○○○、下に表示されているプロシージャは○○○のプロシージャを表す。
次回は、「他のプロシージャを呼び出す方法」についてです。