型が一致しません。(エラー番号:13)


Sub Sample1()
    Dim N As Long
    N = "tanaka"
End Sub

とても多いエラーです。

整数型に文字列型を代入しようとしたり、文字列型にオブジェクトを指定するような"型違い"で発生するエラーです。

ほかにも、次のようなケースで発生します。

Sub Sample2()
    Dim buf As String
    buf = InputBox("日付を入力してください")
    ActiveCell = DateValue(buf)
End Sub

DateValue関数は、引数に"日付を表す文字列"を指定します。InputBoxで[キャンセル]ボタンがクリックされると空欄("")が返ります。空欄は"日付を表す文字列"ではありませんので、DateValue関数にとって「値が違います」となります。

もちろん、次のように独自のプロシージャに渡す引数でもエラーになります。

Sub Sample3()
    Call myProc("tanaka")   ''文字列型を渡した
End Sub

Sub myProc(n As Long)       ''長整数型を受け取る
    ActiveCell = n
End Sub

ただ、VBAは"型の自動変換"が特徴のひとつです。本来は数値を指定しなければいけないところに、文字列型のデータが入る(ように見える)こともあります。たとえば、次のようなコードです。

Sub Sample4()
    Dim N As Long, Str As String
    Str = "100"
    N = Str
    MsgBox N
End Sub

データ型に厳しいプログラミング言語を学んだ方なら、信じられないようなコードでしょう。でも、VBAでは正常に実行できます。「N = Str」は「長整数型 = 文字列型」ですし、「MsgBox N」も言語道断です。MsgBoxの引数は文字列型を受け取るはずです。ここは「MsgBox CStr(N)」か、.Netなら「MsgBox N.ToString」みたいにやりたくなるところです。でも、VBAでは正常に実行できます。VBAは、可能であれば、自動的に型変換が行われるからです。

なお、似たようなエラーに「プロシージャの呼び出し、または引数が不正です」があります。こちらは、型は合っているけど、内容的に値が不適切なときに発生します。

「プロシージャの呼び出し、または引数が不正です」の解説