同じエラー文に繰り返し遭遇してはGoogle先生にお聞きする日々。
原因の詳しい説明は既にネットの大海に広がっているのでそちらにお任せするとして、「で、どこを直せばいいの?」のヒントをもう少し具体的に列挙していきます。
※あくまでも自分の体験ベースなので、かなり偏りがあると思います。あらかじめご了承ください。
- 変数が定義されていません。
- 修飾子が不正です。
- functionまたは変数が必要です
- 参照が不正または不完全です。
- 同じプロパティに対するプロパティ プロシージャの定義が一致していません。または、プロパティ プロシージャに省略可能な引数またはParamaArrayが含まれているか、Property Setの最後の引数が不正です。
- 定数式が必要です。
- パブリック オブジェクト モジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数に渡すことができます。
- 配列には割り当てられません。
- 連載目次
変数が定義されていません。
チェック!
- スペル間違ってない?
修飾子が不正です。
どういう意味?
メンバーにないものを指定したとき。
チェック!
- 参照するメンバの名前はあってる?
- コピペで確認してみた?
functionまたは変数が必要です
チェック!
- プロシージャの種類は合ってる?
- 戻り値があるのに
Subプロシージャ
になってたりしない?
- 戻り値があるのに
参照が不正または不完全です。
チェック!
- 呼び出したいメンバーが
Withブロック
からはみ出てない? - オブジェクトのメンバーなのにオブジェクトを指定してなかったりしない?
同じプロパティに対するプロパティ プロシージャの定義が一致していません。または、プロパティ プロシージャに省略可能な引数またはParamaArray
が含まれているか、Property Set
の最後の引数が不正です。
(なんか珍しく具体的ですねw)
チェック!
Property Get/Let/Setプロシージャ
同士で型は合ってる?ParamaArrayキーワード
使ってない?Property Setプロシージャ
の引数の型は正しい?
定数式が必要です。
チェック!
- それまで問題なく動いてたのに、突然このエラーが出てる?
対処方法
ソースコードは新しいモジュールにコピペして、モジュール名を上書きすると直るみたいです。
- こちら↓が参考になりました。
- こちら↓が参考になりました。
パブリック オブジェクト モジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数に渡すことができます。
チェック!
- ユーザー定義型を
Dictionary型
やCollection型
のItemプロパティ
に代入しようとしてない?
対処方法
丸ごとクラス化して、それを代入すると良いようです。
- 下記2点が参考になりました。
どっちが良いという事はなく、最終的には使い分けになると思います。
— エクセルの神髄 (@yamaoka_ss) 2019年11月3日
大きな配列に使用するとクラスの場合インスタンス作成がある分重くなりますし、逆にcollectionやdictionaryにはユーザー定義型は入れられませんので。
- 下記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型で宣言すると「配列がありません」というエラーになり、変数の後にカッコをつけてその中に要素数を入れると「配列には割り当てられません」というエラーになります。