コンパイルエラーと実行時エラー

コンパイルエラーと実行時エラーの違いが分からない方がいるようです。
これもよくある初心者の質問です。 前ページで説明した「動かしたらダメでした。」というときの「ダメ」が何だったのかが判断できていないこともよくあるようです。
「実行したらエラーになってしまいました。」を「実行時エラーになりました。」という説明で質問してくるのですが、どういうエラーかをたずねると「コンパイルエラーです。」ということになるのです。
もちろん、何のエラーかの説明なく質問してくる段階で問題なのですが、マクロを身につけようという方にはこの違いもきちんと認識していただきたいものです。



「コンパイルエラー」
「コンパイルエラー」とは構文規則のチェックに関するエラーです。このエラーになる場合はマクロは実行されません。つまり、実行された結果エラーになったのではなく、コンパイラが実行できるコードではないと却下したということなのです。
「コンパイルエラー」はコードの文法レベルでの判断のエラーですからそれを修正しないと実行はできません。文法エラーですから、これが直せないのでは困りものです。ヘルプ等で正しい構文の書き方を確認して修正して下さい。
実行前に「VBAProjectのコンパイル」を行なうことでもエラー判定を行なうことができます。
VBAProjectのコンパイル
モジュールの先頭に「Option Explicit」を書いておくと、未宣言の関数や変数の記述ミスが「コンパイルエラー」として表示されるので、これを利用すると完成度が高いコード作成が可能になります。逆に「Option Explicit」を書かない場合は、変数は宣言しなくてもコンパイラが新しいキーワードを見つけると勝手に変数として判断します。このことにより単純な記述ミスが変数として扱われてエラーになってくれないため、コードの実行結果でしか不具合の発見に至らず、結果として記述ミスの発見を遅らせることになります。
もう一点、テスト段階で「コンパイルエラー」にならなかったものが、実行環境によっては「コンパイルエラー」になるケースがあります。これは、実行環境でのExcelのバージョンの違いや、インストールオプションの不一致によるものです。

「実行時エラー」
「実行時エラー」は構文チェックでは問題がでなかったものの、実行した段階で処理が継続できない問題が発生したためのエラーです。
型が一致しません。
通常、ロックしていないプロジェクトなら、エラーメッセージに「デバッグ」ボタンが表示されているはずですから、これをクリックするとコード上のエラー箇所が黄色く反転表示されて停止状態となります。
エラー処理を行なわない例
これはステップ実行などと同じ状態なので、変数にマウスをポイントしたり、イディミエイトウィンドウ等を利用すれば格納値の参照などができるので、これらを参考にして問題を解決する必要があります。
ですが、「実行時エラー」でも単純なものもあれば、記述ミスが原因でもコード上の違うところでエラーになる場合などもあります。原因が見つけにくいこともありますが、前後の記述や変数値などを確認しながら原因を見つけます。複数のオブジェクトを1行にまとめて書いてしまう方法では、どのオブジェクトでエラーになっているかが判らなくなりますから、面倒でも1オブジェクトごとに変数に取り込んで別行になるように記述するようにすれば明確になります。

動作確認前から「On Error
実際の運用時のためのエラー処理まで初期のコード作成時に盛り込んでおくのは決して悪いことではありませんが、使い方を誤ると「デバッグ」の作業をやりにくくしてしまいます。

'***************************************************************************************************
'* 処理名 :TEST2
'* 機能  :テストA
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2016年11月19日
'* 作成者 :井上 治
'* 更新日 :2019年12月30日
'* 更新者 :井上 治
'* 機能説明:エラー表記を独自にコントロールする例
'* 注意事項:
'***************************************************************************************************
Sub TEST2()
    '-----------------------------------------------------------------------------------------------
    Const cnsTitle As String = "TEST2"
    Dim vrnINPUT As Variant                                         ' 入力値WORK
    Dim intNUM As Integer                                           ' 転記先変数(整数)
    Dim strMSG As String                                            ' メッセージWORK

    vrnINPUT = "a"                                          ' 入力データ
    On Error GoTo TEST2_ERR                                 ' ←この行!
    intNUM = vrnINPUT                                       ' 整数型変数に転記(エラー発生)
    GoTo TEST2_EXIT

'===================================================================================================
' エラー時の飛び先(行ラベル)
TEST2_ERR:
    ' エラーメッセージを編集
    strMSG = "実行時エラー:" & Err.Number & " " & Err.Description & vbCr & _
             "入力データは「" & vrnINPUT & "」です。"
    ' エラーメッセージを表示
    MsgBox strMSG, vbCritical, cnsTitle

'===================================================================================================
' 終了
TEST2_EXIT:
    On Error GoTo 0
End Sub
On Errorステートメントは、「実行時エラー」の発生時の処理を行なうためのものですが、記述上の問題がない状態で実現させるべきもので、「デバッグ」段階でOn Errorステートメントが機能してしまうと、エラー発生箇所が判らなくなったり、エラーの発生自体がうやむやになってしまいます。
記述上で当初から用意しておく場合は、「デバッグ」段階ではOn Errorステートメントの行はコメントにしておいて下さい。