ゆるおたノート

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

      配列の利用(VBA)その2 – GANASYS研修室

連載目次

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