ゆるおたノート

Tomorrow is another day.

【VBA】どこがダメ? - エラー発生時のチェックリスト(コンパイルエラー編)

同じエラー文に繰り返し遭遇してはGoogle先生にお聞きする日々。

原因の詳しい説明は、既にネットの海に広がっているのでそちらにお任せするとして、「で、どこを直せばいいの?」のヒントをもう少し具体的に列挙していきます。
※あくまでも自分の体験ベースなので、かなり偏りがあると思います。あらかじめご了承ください。

変数が定義されていません。

チェック!

  • スペル間違ってない?

修飾子が不正です。

どういう意味?

メンバーにないものを指定したとき。

チェック!

  • 参照するメンバの名前はあってる?
    • コピペで確認してみた?

functionまたは変数が必要です

チェック!

  • プロシージャの種類は合ってる?
    • 戻り値があるのにSubプロシージャになってたりしない?

参照が不正または不完全です。

チェック!

  • 呼び出したいメンバーがWithブロックからはみ出てない?
  • オブジェクトのメンバーなのにオブジェクトを指定してなかったりしない?

同じプロパティに対するプロパティ プロシージャの定義が一致していません。または、プロパティ プロシージャに省略可能な引数またはParamaArrayが含まれているか、Property Setの最後の引数が不正です。

(なんか珍しく具体的ですねw)

チェック!

  • Property Get/Let/Setプロシージャ同士で型は合ってる?
  • ParamaArrayキーワード使ってない?
  • Property Setプロシージャの引数の型は正しい?

定数式が必要です。

チェック!

  • それまで問題なく動いてたのに、突然このエラーが出てる?

対処方法

  • ソースコードは新しいモジュールにコピペして、モジュール名を上書きすると直るみたいです。

    • こちら↓が参考になりました。

パブリック オブジェクト モジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数に渡すことができます。

チェック!

  • ユーザー定義型をDictionary型Collection型Itemプロパティに代入しようとしてない?

対処方法

  • 丸ごとクラス化して、それを代入すると良いようです。

    • 下記2点が参考になりました。

配列には割り当てられません。

チェック!

  • Array関数で配列を作るときに、変数の宣言時点で要素数を指定しちゃってない?

    Sub test()

    '要素数つきで宣言している
    Dim test(0 To 5) As Variant
    test = Array("クサ", "ツチ", "ジン", "カイ", "ビー", "イー")

    Dim m As String: Const SPACE = " "
    m = m & test(0) & SPACE
    m = m & test(1) & SPACE
    m = m & test(2) & SPACE
    m = m & test(2) & SPACE
    m = m & test(3) & SPACE
    m = m & test(0) & SPACE
    m = m & test(4) & SPACE
    m = m & test(5)

    Debug.Print m

    End Sub

対処方法

  • Array関数を使う時は、Variant型で要素数は指定せずに使うと良いようです。

    Sub test()

    Dim test() As Variant '()は無くてもOK
    test = Array("クサ", "ツチ", "ジン", "カイ", "ビー", "イー")

    Dim m As String: Const SPACE = " "
    m = m & test(0) & SPACE
    m = m & test(1) & SPACE
    m = m & test(2) & SPACE
    m = m & test(2) & SPACE
    m = m & test(3) & SPACE
    m = m & test(0) & SPACE
    m = m & test(4) & SPACE
    m = m & test(5)

    Debug.Print m

    End Sub

    • こちら↓が参考になりました。

      変数はVariant型で宣言し、また変数の後ろに要素数を入れることはしません。

      仮にString型で宣言すると「配列がありません」というエラーになり、変数の後にカッコをつけてその中に要素数を入れると「配列には割り当てられません」というエラーになります。

連載目次

  1. 【VBA】なにか忘れてる? - エラー発生時のチェックリスト(実行時エラー編) - ゆるおたノート
  2. 当記事【VBA】どこがダメ? - エラー発生時のチェックリスト(コンパイルエラー編) - ゆるおたノート