ExcelVBAマクロで実行時エラーが発生した時、エラーとなった個所が表示されてもその場所はエラーが発生したところで原因とは限らない事があります。
そんな時に原因を特定するために必要な機能の呼び出し履歴を確認する方法について紹介します。
エラー発生個所
マクロで実行時エラーが発生するとエラーが発生したところでマクロが止まります。
上の例ではReDimで配列の再定義を行うところで最大値として使っている変数「lLineMaxIndex」に「-1」の値が入っているため「インデックスが有効範囲にありません。」となってしまいました。
それではなぜ変数「lLineMaxIndex」にマイナスの値が入ってしまったのでしょうか?
プログラムをたどっていくと「lLineMaxIndex」はプロシージャ「extractValueFromImgString()」の第一引数を改行(Line Feed)で分割した数が代入されます。
つまり プロシージャ「extractValueFromImgString()」 の呼び出し元で指定した引数の値に改行が含まれていない事が想定できます。
呼び出し元を調べる
そんな時に役立つ機能が呼び出し履歴です。
呼び出し履歴は以下のいずれかの方法で表示する事が出来ます。
- [Ctrl]キー+[L]キー
- [表示(V)]-[呼び出し履歴(K)…]
- 「ローカル」ウィンドウの閉じるボタン下の「…」ボタン
「呼び出し履歴」を確認する事でそれまでどこを経由して呼び出されたのかを知る事が出来ます。
上の例では「Worksheet_Change」「execScaling」「extractValueFromImgString」の順番で呼び出されている事が分かります。
※「[<非 Basic コード>]」はBasic以外の処理のために中身は確認できません。
今回はプロシージャ「extractValueFromImgString()」を呼び出したプロシージャ「execScaling」を確認する事で引数の内容を確認する事が出来ます。
「呼び出し履歴」ウィンドウの「execScaling」をダブルクリックまたは選択状態で「表示」ボタンをクリックする事で呼び出し場所へ移動します。
プロシージャ「extractValueFromImgString()」呼び出し時に引数として使っている変数「sInputImg」の中身を見てみると空白(0バイト)である事が分かりました。
そして変数「sInputImg」はワークシートのA2の値を代入しています。
これでシート「入出力」のA2が空白になっているために実行時エラーが発生していた事を突き止める事が出来ました。
まとめ
今回、例としたマクロは「ビットマップ倍率変換ツール」で前の記事で紹介したマクロを使いました。
自身でゼロからマクロを作っている場合にはあまりこの恩恵を受ける場面は少ないかもしれないです。
ですが前任者などほかの人が作ったマクロを引き継いだ場合には設計思想の違いなどでエラー原因を特定するには大変な時があります。
今回紹介した「呼び出し履歴」はこれらを手助けする強力な機能になります。
ちなみにどこから呼び出されたか調査する方法としてプロシージャ名で検索する方法もありますが共通関数などで複数個所から呼び出されている場合にはその特定も難しくなります。
更に検索で呼び出し元を見つけても「ローカル」ウィンドウのターゲットは現在止まっているプロシージャになっており、呼び出し履歴から移動した場合は呼び出し元がターゲットになります。
まずは使ってみて便利さを体験してみましょう。
ちなみにMicrosoftのドキュメントは以下に説明があります。
コメント