【VBA】ByRef 引数の型が一致しません。
VBAで開発した際に、よく見るエラーです。
何気に悩まされたエラーですが、メッセージが分かりやすいので修正が簡単ですね。
通常であれば、引数の型を見比べればすぐに原因が分かります。
しかし、こんなコードでも出るのです。
' ただ呼び出すだけのプロシージャ Public Sub hoge() Dim list1, list2 As Collection hogehoge list1 End Sub ' ただ呼び出されるだけのプロシージャ Private Sub hogehoge(ByRef paramList As Collection) End Sub
hogeからhogehogeを呼び出しているだけです。
引数の型も一致していて大丈夫そうに見えます。
しかし、エラーが発生します。
なんじゃこりゃと思って調べてみると、賢い方はいるものです。
http://tsuchida0815.blogspot.com/2008/03/excelvba.html
変数の宣言時、複数宣言して引数に渡すとこのエラーが発生するとのこと。
つまり、こうすれば問題ないということだそうです。
' ただ呼び出すだけのプロシージャ Public Sub hoge() ' Dim list1, list2 As Collection Dim list1 As Collection Dim list2 As Collection hogehoge list1 End Sub ' ただ呼び出されるだけのプロシージャ Private Sub hogehoge(ByRef paramList As Collection) End Sub
1行で宣言していたものを、複数行に分けました。
確かに、エラーが出なくなりました。
ちなみに、複数宣言した場合でも最後に記述されているものは大丈夫だったりします。
' ただ呼び出すだけのプロシージャ Public Sub hoge() Dim list1, list2 As Collection hogehoge list2 End Sub ' ただ呼び出されるだけのプロシージャ Private Sub hogehoge(ByRef paramList As Collection) End Sub
処理をとめて中身を見てみると、後ろで宣言されたlist2はCollectionになっていますが、list1はVariant/Emptyになっています。
型がちゃんと定義されていないのですね。
呼び出しの直前でlist1をインスタンス化すれば良いのかとも思いましたが、そもそもコンパイルが通らないのですね。
VBAは難しいです。
2 Responses to "【VBA】ByRef 引数の型が一致しません。"
同じ理由でエラーになってしまい、困っていたのですが、原因がわかって助かりました!
ありがとうございます!
というか、一行で変数を宣言する場合には、変数一個ずつに型を書かないといけないということを忘れてました。。
https://www.relief.jp/docs/vba-declaring-multiple-variable-in-single-line.html
> 井上さん
簡単なエラーメッセージだけが表示されると、原因の特定に意外と時間がかかったりしますよね。。