Developer

【ExcelVBA】エラー処理:コンパイルエラー
2022.08.31
Lv1

【ExcelVBA】エラー処理:コンパイルエラー

コンパイルエラーとは

前回に引き続き、VBAのエラーについて学習していきます。
まずは前回説明したVBAのエラーの種類について確認しておきましょう。
VBAのエラーは下記の種類がありました。

VBA_エラーの種類
エラーの種類

今回は、この中のコンパイルエラーについて見ていきます。

コンパイルとは、プログラムで記述したファイルを、システム(VBAの場合はExcel)が実行できるような形式に変換することを言います。
つまり、実行するためには、その前にコンパイルが成功していなければなりません。

VBEでは実行ボタンを押すと、コンパイルしてから実行するという一連の作業を実行しますが、
メニューの「デバッグ」>「VBAプロジェクトのコンパイル」を選択すると、コンパイルのみ行うこともできます。

コンパイルは、元となるプログラムが正しく記述されていないと行うことができません。
前回見た文法エラーがある場合は、当然コンパイルを行うことができませんが、
文法的に正しく記述していた場合でも論理的なエラーがある場合、エラーになります。これをコンパイルエラーといいます。

コンパイルエラーの例

では、コンパイルエラーの代表的な例である、変数が未定義であることによって発生するコンパイルエラーを見てみましょう。
まず、下記のVBAを作成してください。

Option Explicit
Sub Sample1()
    x = 10
    Debug.Print (x)
End Sub

実行してみると、下記のエラーが表示されると思います。
VBA_エラーポップアップ_コンパイルエラー具体例1

文法的には誤っていないのですが、コンパイルエラーとなるのはなぜでしょうか。

1行目に記述されている「Option Explicit」という記述に注目してみましょう。
これは、VBAのOption設定で「変数の宣言を強制する」という意味になります。
このOption設定がある状態で変数「x」を宣言せずに使用しているため、
「変数が定義されていません」というエラーが発生しているのです。

このように文法的には誤っていないが論理的に誤りがある場合のエラーをコンパイルエラーと言います。

では、1行目を削除してから再度実行してみましょう。
※下記のメッセージが表示される場合は「OK」で構いません。
VBA_エラーポップアップ_コンパイルエラー_プロジェクトリセット確認
今度はエラーが出ずに実行できたと思います。

このOption Explicitの設定はVBEの画面上でも行うことができます。
メニューの「ツール」>「オプション…」から下記の画面を開き、
「変数の宣言を強制する」にチェックを入れると、以降のコードには先ほどの「Option Explicit」が追加されるようになります。
VBA_エラーポップアップ_コンパイルエラー_オプション画面

ちなみに、Option Explicitがある場合、下記のように変数を宣言しておけば、エラーは発生しません。

Option Explicit
Sub Sample1()
    Dim x As Integer
    x = 10
    Debug.Print (x)
End Sub

まとめ

・コンパイルエラーはコンパイルする際に発生するエラー。
・文法エラーがない場合でも、コンパイルエラーとなる場合もある。

確認問題

確認問題1

次の記述でコンパイルは成功しますか、失敗しますか?
失敗する場合は、理由も答えなさい。

Option Explicit
Sub Test1()
    Debug.Print("test")
End Sub
答え
成功する。

変数の宣言を強制する「Option Explicit」の記述はありますが、
Test1内では変数を使用していないため、問題ありません。

確認問題2

次の記述でコンパイルは成功しますか、失敗しますか?
失敗する場合は、理由も答えなさい。

Sub Test2()
    Dim x As Int
    x = 10
    Debug.Print (x)
End Sub
答え
失敗する。

「Int」という型は存在しないので文法エラーとなり、コンパイルは失敗します。
次のように記述すればOKです。
[vb] Sub Test2()
Dim x As Integer
x = 10
Debug.Print (x)
End Sub
[/vb]

確認問題3

次の記述でコンパイルは成功しますか、失敗しますか?
失敗する場合は、理由も答えなさい。

Option Explicit
Sub Test3()
    Dim x As Integer
    x = "test"
    Debug.Print (x)
End Sub
答え
成功する。

これはちょっとひっかけ問題です。
この関数は、xをInteger型で指定しているにも関わらず、「x=”test”」とStringを代入しているという部分に問題があります。
そのためこの関数を実行するとエラーが発生します。
しかし、コンパイル自体は行われます。

このように実行をした際に発生するエラーを、もう1つの論理エラーである「実行時エラー」と言います。

次回は、「実行時エラー」についてです。

 

連載目次リンク

ExcelVBA 入門 連載目次