和風スパゲティのレシピ

日本語でコーディングするExcelVBA

エラー・デバッグ

OnError中にCallした関数内でエラーが起きると即呼出元に戻る

On Error Resume Next下においては、Callしたプロシージャ内でエラーが発生すると即座にCall元に戻ります。エラー発生コードからEndSubまでのコードは一切実行されませんのでご注意ください。

プロシージャのCall元/先でのOnError挙動まとめ

プロシージャをCallする際、親子どちらでOnErrorを設定したかによって、どのように処理内容が変化するかをまとめました。エラー処理を行う際の参考にして下さい。

ブレークポイントとStopステートメントの違い

ブレークポイントとStopステートメントの違いを解説します。どちらもマクロの実行を任意の位置で一時停止する機能ですが、保存できるかどうか、条件を設定できるか、設定の簡単さ

マクロを一時停止する - ブレークポイント/Stop

マクロを任意の行で一時停止させる方法を解説します。ブレークポイントとStopステートメントの2種類の方法があります。ブレークポイントは気軽に設定できるのが利点で、対してStopは停止条件を設定できるのが利点です。

Dictionaryを新規シートに出力して中身を確認する

Dictionaryは中身の確認が難しい欠点があります。ローカルウィンドウでKeyは見れますがItemは見ることができません。この対策として「Dictionaryを新規シートに出力する」マクロを用意するのがおすすめです。

値・状態の変更を検知する - ウォッチウィンドウ

マクロの不具合検証やバグ取り(デバッグ)を行っているとき、「その不具合がいつ起きたか」を知りたいことがよくあります。そんなとき、値や状態の変更を検知できる「ウォッチウィンドウ」が活躍します。

テスト用コードの実行をフラグ定数で管理する

マクロをテストする際、Debug.Printなど表示機能を使ったり、作業シートを削除せず残したりします。これをPublic定数を使って「If Isデバッグモード Then」で分岐することで、一括で実行管理することができます。

配列を新規シートに出力して中身を確認する

配列をマクロに利用する際、中身を確認するのにひと手間かかるのですが、「新規シートに配列を出力する」マクロを用意することで対策ができます。フィルターを設置することでデバッグ作業の効率が上がります。

イミディエイトウィンドウをクリアする方法

イミディエイトウィンドウをクリアする方法を紹介します。専用のプロパティ、組込関数はありませんので、イミディエイトウィンドウの限界行数である200行分、Debug.Printを実行することで疑似的に行います。

確認メッセージを非表示にする - DisplayAlerts

マクロが中断しないようExcelからの確認メッセージを非表示にする、DisplayAlertsプロパティの使い方を解説します。Application.DisplayAlerts=Falseを実行すると以降確認メッセージが表示されなくなり、Trueにすると再度表示されるようになります。

DisplayAlertsを常時Falseにしてはいけない

Application.DisplayAlertsプロパティはExcelからの確認メッセージを非表示にする機能で、削除や閉じる処理に使います。これを常時OFFにしていると、予期せぬ確認メッセージに自動返答されてしまい、マクロのバグが迷宮入りしてしまいます。

通常の実行ではエラーが出るのに1行ずつ実行すると上手くいく原因

マクロがエラーで止まったのに「デバッグ」から1行ずつ実行したら上手くいってしまう。マクロの結果がおかしいので、ステップイン(F8)で1行ずつ実行してみたら正しい結果が出てしまうなどにお悩みの方はこの記事に目を通してみて下さい。

邪魔な通知「コンパイルエラー:修正候補」を切る

コードを書いている途中で、Cells(R, ここでEnterを押したり、別の行を選択したりすると、「コンパイルエラー: 修正候補: 式」のような表示が出ます。この表示は邪魔なので、ツール→オプション→自動構文チェックをOFFにして消すことができます。

変数の宣言を強制(Option Explicit)は必ず設定すべし

マクロを作るとき、コード画面VBEはいろいろとオプションをいじることができますが、まずは真っ先に「変数の宣言を強制する」にチェックを入れておきましょう。この機能はいわば「自動スペルミス検知器」で、最も重要なオプションです。

エラーメッセージを(ググるために)コピーする方法

エラーが発生した際に、そのエラーメッセージをコピーする方法を紹介します。まずはエラー画面で[デバッグ]を押し、イミディエイトウィンドウに移動します。そこに?Err.Descriptionと入力することで、エラーメッセージを取得することができます。

OnErrorResumeNextはIfの分岐をTrueとみなす

Ifの判定部分がOn Error Resume Nextでスキップされた場合、IfステートメントはTRUE側に分岐します。実はIfステートメントはTrueなら通ってよしという処理ではなく、FalseならEndIfまでジャンプという処理なので、それがスキップされるという理屈です。