エラーの原因

「ByRef 引数の型が一致しません」と表示された時の対処法です。
このエラーは引数に渡す変数の型が指定されたものと異なる場合に発生するエラーです。
以下の点を確認してください。
エラーとなる例
関数の引数を指定している場合、セルやバリアント型の様に都合よく自動変化はしてくれません。
いくつか例を見ていきましょう。
Variant型を渡そうとしていないか?
典型的なのが、以下のような例です。
Sub dPrint(d As Long)
Debug.Print d
End Sub
Sub testCode()
Dim a, b As Long
a = 1
b = 2
dPrint a
dPrint b
End Sub
一見、正しそうに見えますが、
Dim a, b As Long
この書き方がダメなのです。
これですと、a はバリアント型として宣言した事になってしまいます。
正しくは、以下の様に書きます。
Dim a As Long, b As Long
整数型と浮動小数点数型を取り違えていないか?
Sub dPrint(d As Long)
Debug.Print d
End Sub
Sub testCode2()
Dim a As Double, b As Long
a = 1
b = 2
dPrint a
dPrint b
End Sub
これは完全に変数型を取り違えています。
dPrintの引数は Long型ですので、そこに Double型の変数を入れてはいけません。
a = 1 はエラーとはなりませんが、 a は Double型で宣言していますのでエラーとなります。
文字列の数値でもエラーとなる
もちろん文字列型でもダメです。
Sub dPrint(d As Long)
Debug.Print d
End Sub
Sub testCode3()
Dim a As String, b As Long
a = 1
b = 2
dPrint a
dPrint b
End Sub
リテラルの場合は成功する場合もある
計算結果などを直接渡す場合は、自動変換が起こってエラーが出ない場合もあります。
もちろん文字列などはダメです。
Sub dPrint(d As Long)
Debug.Print d
End Sub
Sub testCode4()
Dim b As Long
b = 2
dPrint 1 / 3 '整数型に変換され 0 と表示される
dPrint b
End Sub
安易な引数変更はケガのもと
上記の場合、dPrint の引数をバリアント型にしてしまえば、全てうまくいくと考えるのは当然でしょう。
今回の場合は、その通りですが、呼び出される関数側にも、引数がその型でないと後で不都合な場合があるかもしれません。
関数の引数に限らず、変数を宣言する時は、どの型にするかをよく考えて選択するべきです。
エラーが出ないようにするのではなく、エラーを起こして間違いに気付けるようなプログラミングが正攻法と言えるでしょう。
まとめ
「ByRef 引数の型が一致しません」と表示された時は、まずは型を省略したバリアント型の変数でないか確認してみましょう。
それでも違う場合は、呼び出す関数の引数と、代入する変数型を確認してみます。
実行時エラーとは、異なりブレークポイントが使えない事が多いので、変数型を意識して読み解くようにしましょう。
以下のコンテンツも参照してみてください。
・Variant型を使う時・使わない時
コメント