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は、可能であれば、自動的に型変換が行われるからです。
なお、似たようなエラーに「プロシージャの呼び出し、または引数が不正です」があります。こちらは、型は合っているけど、内容的に値が不適切なときに発生します。