プロシージャの呼び出し、または引数が不正です。(エラー番号:5)


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

このエラーは「引数には数値を指定してください」のように決まっている関数に、ルール通り数値を指定した(引数の型は合っている)けど、その指定した値が不適切だったようなときに発生します。これとよく似たエラーに「型が一致しません」があります。そちらは、「引数には数値を指定してください」の関数に文字列(引数の型が違う)を指定したようなときに起こります。

「型が一致しません」の解説