Sub Sample()
Dim buf As String
buf = Left("tanaka", -1)
End Sub
これは、よく起こるエラーです。
プロシージャや関数を呼び出すとき、引数に誤った値を指定したときに起こります。たとえば上のコードでは、Left関数の第2引数に「-1」を指定しています。Left関数の第2引数は、左側から抜き出す文字数を指定する引数で、当然プラスの数値でなければなりません。そこにマイナスの数値を指定したためにエラーが発生しました。
このように、すぐ分かる明らかなミスばかりでなく、たとえば次のようなケースでも要注意です。図のように、A列に名前が入力されているとします。姓と名の間は半角スペースで区切られていますので、スペースの位置で前後に区切り、姓と名をB列とC列に入力する…と、そんな、よくあるケースです。
Sub Sample2() Dim i As Long For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row Cells(i, 2) = Left(Cells(i, 1), InStr(Cells(i, 1), " ") - 1) Cells(i, 3) = Mid(Cells(i, 1), InStr(Cells(i, 1), " ") + 1) Next i End Sub
A列に入力された名前が間違いなく半角スペースで区切られていれば問題ないのですが、もし「田中亨」のように、スペースを入れ忘れていると
Sub Sample2()
Dim i As Long
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
Cells(i, 2) = Left(Cells(i, 1), InStr(Cells(i, 1), " ") - 1)
Cells(i, 3) = Mid(Cells(i, 1), InStr(Cells(i, 1), " ") + 1)
Next i
End Sub
「田中亨」のように、区切りの半角スペースがなかったら、
Left(Cells(i, 1), InStr(Cells(i, 1), " ") - 1) ----------------------- ↓ スペースがないので、InStr関数は0を返す Left(Cells(i, 1), 0 - 1) -------- ↓ Left(Cells(i, 1), -1)
ね、最初にお見せした"明らかなミス"と同じになったでしょ。こういうバグは本当に多いです。InStr関数の返り値で文字列を区切るようなときは、まずその区切り文字が存在するかどうかを判定した方がいいです。
Sub Sample2() Dim i As Long, n As Long For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row n = InStr(Cells(i, 1), " ") If n > 0 Then Cells(i, 2) = Left(Cells(i, 1), n - 1) Cells(i, 3) = Mid(Cells(i, 1), n + 1) End If Next i End Sub
このエラーは「引数には数値を指定してください」のように決まっている関数に、ルール通り数値を指定した(引数の型は合っている)けど、その指定した値が不適切だったようなときに発生します。これとよく似たエラーに「型が一致しません」があります。そちらは、「引数には数値を指定してください」の関数に文字列(引数の型が違う)を指定したようなときに起こります。