「ByRef引数の型が一致しません」の原因

エラー

はじめに

 「ByRef引数の型が一致しません」というエラーは、引数に渡すべき変数型が適切でない時に発生します。
 引数でLong型を指定しているにも関わらずString型を渡してしまった場合などです。

Sub macro()
    Dim s As String
    s = 100
    Call setNum(s)
End Sub

Sub setNum(n As Long)
    MsgBox n
End Sub

 この例では、文字列変数 s に整数の 100 を代入していますが、s はあくまで文字列型なので、setNum関数の引数に渡した事で上記のエラーが発生します。
 対処方法としては、引数が整数となるように整数型を渡すか、送り先のsetNum関数の引数の型を変更する必要があります。

引数にVariant型を渡した場合の失敗

 下の例では、変数をバリアント型にして整数を代入して、setNum関数の引数に渡していますが、ここでも同じようにエラーが発生します。

Sub macro2()
    Dim v As Variant
    v = 100
    Call setNum(v)
End Sub

 Variant型は代入後に変数型が変化しますが、受け付けてくれないようです。
 対処法としては、CInt を使って Integer 型に型変換してやれば良いでしょう。

Sub macro2a()
    Dim v As Variant
    v = 100
    Call setNum(CInt(v))
End Sub

引数にArrayの配列要素を渡した場合の失敗

 同じようなことが Arrayの配列要素でも起こります。

Sub testByRefError()
    Dim val As Variant
    Dim i As Integer
    Dim arr As Variant
    
    arr = Array(1, 2, 3, 4, 5)
    For i = 0 To 4
        Call setMyCell(i + 1, arr(i))
    Next i
End Sub

Sub setMyCell(r As Long, i As Integer)
    Cells(r, "A") = i
End Sub

 下線部分は、ローカルウインドウで確認すると Variant/Integer となっているのがわかります。
 対処方法は、Variant型の時と同じく、CIntで型変換してやればOKです。

   Call setMyCell(i + 1, CInt(arr(i)))

まとめ

 バリアント型は代入後型が変化しますが、引数として渡す場合はエラーとなるようです。Arrayの要素に関しては盲点となりますので注意しましょう。
 原因が解れば適切に型変換する事で回避できますので特に難しくはありません。

コメント

タイトルとURLをコピーしました