VBAで実行前に必ずコンパイルしなければいけないケース

VBAは、コンパイルの操作をしなくても実行前に必ずコンパイルが動きエラーチェックしてくれます。

VBAのエラーの種類は2種類あって、エラーがあれば実行時にそこで止まるエラーと、コンパイルした時に実行前に出るエラーです。

コンパイルした時にはエラーが出ずに実行したときに初めてエラーが出るものは次のようなものがあります。

  • メソッドのタイプミス、名称間違い
Range("A1").Valeu = 1
  • 変数に違うデータ型の値を入力する
Dim x as Integer
X = ""

などです。VBAは、これらを実際に実行されてはじめてそのエラーに気付きます。

実行してみないとチェックできないので、その前に全体に影響するような変更する操作があったとしてもそれは動いてしまいます。しかし、それを防ぐには実行前にきちんと目で確認するしか方法がありません。このエラーはコンパイルするしないに関わらずそういうものだと捉え対応していくしかありません。

実行前にコンパイルの時点でエラーが出るものは次のようなものがあります。

  • 変数宣言が必須の設定において宣言されていない変数名
Sub A()
Range(A1).Value=1
End if
  • メソッドの使い方の間違い
Range("A1").Value
  • EndやNextがない
Sub a()
Dim x As Integer
For x = 1 To 10
  Cells(1,x)=x
End Sub

などです。VBAはこれらのエラーがあった時は1行も実行することはありません。

こちらは実行前に分かるので対処しようがあります。

VBAは、どんなエラーにおいてもコンパイルしたらエラーが表示されエラーが直るまでは実行できないというものであればコンパイルすることは必要になってきます。

しかし、上記のようにコンパイルで検出されるエラーと検出されないエラーがあるということと、VBAのコードを変更した後に実行時すると実行前に必ずコンパイルされることを考えると、わざわざ実行前にコンパイルする必要があるのかどうか、少し疑問があるのです。

VBAのコンパイルをしよう
コンパイルしたことによってメリットがあるという記事を以前に書きました。

そこで書いたことは、コンパイルは、メリットはあるけどもしなくてもいいもののようなニュアンスにもなっています。

しかし、今回、必ずコンパイルしなければいけないケースを見つけたのでそのお話をします。

次のようなサブルーチンを呼び出すVBAがあったとします。

Sub a()
Range("a1").Value = 5
Call b
End Sub

Sub b()
Range(A1).Val = 1
End Sub

Sub bではダブルコーテーションが抜けていることでセル指定が未定義変数だと勘違いされてしまうようなエラーがあります。

コンパイルすればVBA全体を対象としてこのエラーに気づくことができるので実行する前に修正することができるのですが、Sub aをコンパイルせずに実行するとSub aでセルA1に5と書き込むところまでは実行されてしまいます。その後Sub bに入ったところで、エラーで止まります。

セルの値を書き換えるのであればそれほど影響はないのかもしれませんが、ファイルを消すとか全体的に影響の大きい操作の後にエラーで止まってしまうと取り返しがつかないことになりかねません。

このようにサブルーチンを使っている場合、実行前に起こる自動コンパイルでは、実行するルーチンのみのチェックをするようなので、エラーが出ないままその前の動作が実行されてしまい、エラーで止まるということがおきます。

実行前にコンパイルを行えば、VBAのプロジェクト全体をチェックするのでこのエラーに気づくことができます。

今回はサブルーチンがある場合においてコンパイルは必要と考えたのですが、より高度な使い方においてはこのようなVBAの特性から実行時にコンパイルされるからわざわざコンパイルする必要はないとコンパイルをしないことによって思わぬ何かが起きるかもしれません。

それが実行前に必ずコンパイルしようという理由です。

コメント

タイトルとURLをコピーしました