【VBA】ByRef 引数の型が一致しません。

【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 引数の型が一致しません。"

    • > 井上さん
      簡単なエラーメッセージだけが表示されると、原因の特定に意外と時間がかかったりしますよね。。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です