この記事で分かること
- 実行時エラー5「プロシージャの呼び出しまたは引数が不正です」が発生する根本的な原因
- 文字列操作関数(MidやLeftなど)でエラー5が起きる具体的なパターンと修正コード例
- エラー箇所を瞬時に特定するためのデバッグ方法と、再発を防ぐためのバリデーション実装手法
実行時エラー5「プロシージャの呼び出しまたは引数が不正です」とは
Excel VBAにおける「実行時エラー5:プロシージャの呼び出しまたは引数が不正です」は、プログラム内で呼び出した関数(プロシージャ)やメソッドに渡したパラメータ(引数)の値が、その処理の仕様や許容範囲から著しく外れているときに発生するエラーです。
VBAの関数やメソッドには、あらかじめ「この引数にはこれくらいの範囲の数値を指定してください」「この引数にマイナスの値を入れてはいけません」といったルールが厳密に定められています。そのルールを破るような無効な値をプログラムが渡してしまった結果、システムが処理を継続できなくなり、エラー5を出して強制終了してしまいます。VBAの「引数が不正です」というメッセージは、まさに『指示された方法や値が間違っているため、これ以上処理を続けられません』というVBAからの警告なのです。
実行時エラー5が起こる主な原因と具体的な対策
実行時エラー5は、多種多様な場面で発生します。ここでは、実務の現場で特に頻出する4つの原因パターンと、それぞれの具体的な修正方法についてコードを交えて詳しく解説します。
1. 文字列操作関数(Mid, Left, Right)の引数が無効になっている
実行時エラー5の発生原因として最も多いのが、Mid関数、Left関数、Right関数などの文字列を切り出す関数の引数に、想定外の数値が渡されているケースです。
例えば、Mid関数の第2引数である「開始位置」に0やマイナスの値を指定したり、第3引数の「文字数」にマイナスの値を指定したりすると、即座にエラー5が発生します。以下は、エラーが発生する関数と、その引数の正しいルール、エラーを誘発する無効な値の一覧表です。
| 関数名 | 主な引数の構成 | エラー5が発生する代表的なケース |
|---|---|---|
| Mid | Mid(文字列, 開始位置, [文字数]) | 「開始位置」が0以下(0やマイナス)、または「文字数」がマイナスの値 |
| Left | Left(文字列, 文字数) | 「文字数」がマイナスの値 |
| Right | Right(文字列, 文字数) | 「文字数」がマイナスの値 |
| Space | Space(文字数) | 「文字数」がマイナスの値 |
| Chr / ChrW | Chr(文字コード) | 文字コードが 0〜255(ChrWは -32768〜65535)の範囲外の値 |
以下に、実際にエラーが発生するコードと、正しく修正したコードの例を示します。
【エラーが発生するコード例】
Sub ErrorExample_Mid()
Dim targetText As String
targetText = "ExcelVBA"
' 開始位置に「0」を指定しているため、実行時エラー5が発生します
Dim resultText As String
resultText = Mid(targetText, 0, 5)
End Sub
【修正後の正しいコード例】
Sub CorrectExample_Mid()
Dim targetText As String
targetText = "ExcelVBA"
Dim startPos As Long
startPos = 1 ' 開始位置は1以上の整数にする必要があります
' 安全な値を指定することでエラーを防ぎます
Dim resultText As String
resultText = Mid(targetText, startPos, 5)
End Sub
2. 動的な値の計算結果(InStrとの併用など)が範囲外になっている
プログラムの中で引数を固定値ではなく、「数式や別の関数の実行結果」として動的に渡している場合に、計算ミスから実行時エラー5が発生することが多々あります。特によくあるのが、InStr関数で特定の文字を検索し、その位置を基準にしてMidやLeft関数で切り出すケースです。
【エラーが発生するコード例】
Sub ErrorExample_InStr()
Dim targetText As String
targetText = "あいうえお" ' 「ハイフン」が含まれていない文字列
' 「-」の位置を検索。存在しないため「0」が返されます
Dim hyphenPos As Long
hyphenPos = InStr(targetText, "-")
' hyphenPosが0のため、0 - 1 = -1 となり、Left関数の文字数に「-1」が渡されエラー5が発生します
Dim resultText As String
resultText = Left(targetText, hyphenPos - 1)
End Sub
上記のように、InStr関数で検索した文字が見つからないと「0」が返されます。これに対して「検索位置から1文字手前までを切り出す」という意図でhyphenPos - 1と記述すると、計算結果が-1になり、Left関数の引数制限(0以上)に違反してしまいます。これを防ぐためには、以下のように値の判定(バリデーション)を挟む必要があります。
【修正後の正しいコード例】
Sub CorrectExample_InStr()
Dim targetText As String
targetText = "あいうえお"
Dim hyphenPos As Long
hyphenPos = InStr(targetText, "-")
Dim resultText As String
' 検索文字が見つかった場合(0より大きい場合)のみ切り出し処理を行う
If hyphenPos > 1 Then
resultText = Left(targetText, hyphenPos - 1)
Else
' 見つからなかった場合の代替処理
resultText = targetText
End If
End Sub
3. オブジェクトやコレクションに不正なパラメータを指定している
エラー5は、Excelのシートやセルの操作、図形(Shape)の操作、Dictionaryオブジェクト、ピボットテーブルの操作などでも発生します。特に、引数の順序が間違っていたり、必須の引数が不足していたり、引数として渡すデータの型が間違っていたりするとこのエラーになります。
例えば、Dictionaryオブジェクトのキーに対して、Null値や不正なオブジェクト型を渡しようとしたとき、あるいは、ピボットテーブルやグラフを作成するメソッド(Add2やCreatePivotTableなど)で、引数に指定した範囲やソースデータ形式が間違っている場合に実行時エラー5が投げられます。
4. WindowsとMacのOS間の互換性問題
社内でWindows版のExcelで作られたマクロを、Mac版のExcelで実行した際に「実行時エラー5」が発生することがあります。これは、Windows専用のAPI(Application Programming Interface)を呼び出す Declare文や、Windowsにしか存在しないActiveXコントロール、COMオブジェクト、またファイルパスの区切り文字(Windowsは「\」、Macは「/」)の違いなどが原因です。OSを判定して処理を分岐させることで、この問題を解決できます。
実務で役立つ実行時エラー5のデバッグ手順
実際に実行時エラー5が発生してマクロが止まってしまった場合、焦らずに以下の手順でデバッグを行うことで、どの変数が悪さをしているかを正確に特定できます。
ステップ1:「デバッグ」ボタンをクリックする
エラーダイアログが表示されたら、[終了]ではなく、迷わず[デバッグ]ボタンをクリックしてください。これにより、VBE(Visual Basic Editor)が開き、エラーの原因となっているコード行が黄色くハイライトされます。まずは「どの命令で止まっているのか」を正確に把握することが重要です。
ステップ2:黄色い行の変数の値を「ローカルウィンドウ」で確認する
エラーが発生している行に含まれる変数に、どのような値が入っているかを調べます。黄色くハイライトされた行の変数(例:startPosやcharCountなど)の上にマウスカーソルを合わせると、現在の値がポップアップで表示されます。
また、メニューの[表示] > [ローカルウィンドウ] を開くと、現在実行中のプロシージャ内のすべての変数の状態を一覧で確認できます。ここで変数の値が「0」や「マイナス値」になっていないかをくまなくチェックしましょう。
ステップ3:「イミディエイトウィンドウ」で引数の計算結果をテストする
エラーが起きている関数の引数が複雑な数式になっている場合、メニューの[表示] > [イミディエイトウィンドウ] を開き、引数の計算結果をその場でテストします。例えば、イミディエイトウィンドウに以下のように入力してEnterキーを押します。
? hyphenPos - 1
これによって出力された値が、関数の制限を満たしているかどうかを確認することで、コードのどこを修正すべきかが一目でわかります。
ステップ4:エラーハンドリング(On Error GoTo)を導入して異常を検知する
実務で他人にマクロを配布して使ってもらう場合、エラー5で画面がフリーズするのを避けるために、エラーハンドリングを記述してエラー内容をログに出力できるようにしておくのが定石です。
Sub SafeProcedure()
On Error GoTo ErrorHandler
' --- ここに通常の処理を記述 ---
Dim text As String
text = "VBA"
MsgBox Mid(text, 0, 1) ' 意図的にエラーを発生させる
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました。" & vbCrLf & _
"エラー番号: " & Err.Number & vbCrLf & _
"エラー内容: " & Err.Description, vbCritical, "システムエラー"
End Sub
実行時エラー5を未然に防ぐプログラミングのコツ
デバッグを繰り返すよりも、最初からエラーが起きにくい「堅牢なコード」を書くことが、実務における生産性を飛躍的に高めます。以下の2つの設計原則を意識しましょう。
1. 事前のバリデーション(値の整合性チェック)を徹底する
関数の引数に変数を渡す前に、その変数が期待される範囲内の値であるかを If 文で判定します。例えば、「文字列の長さより大きい開始位置を指定しようとしていないか」「引数がマイナスになっていないか」をチェックします。
If startPos > 0 And startPos <= Len(targetText) Then
resultText = Mid(targetText, startPos, 5)
Else
' 範囲外だった場合の安全なデフォルト処理
resultText = ""
End If
2. 適切なデータ型と初期値を設定する
変数には必ず適切なデータ型を宣言してください(例:文字の位置や件数には Long型を使用する)。また、プログラムの開始時に変数が予期せぬ初期値(0など)のまま処理に回されないよう、適切な初期値を明示的に代入するクセをつけましょう。
自力でマクロのバグ・エラー5を解決できない場合の対処法
どれだけデバッグを行っても、「他人が作った複雑なマクロでコードの意味がわからない」「仕様書がなくてブラックボックス化している」「修正すると他の場所で別のエラーが出てイタチごっこになる」という場合は、無理に自力で修正しようとせず、プロの開発会社やVBAの専門家に相談することをおすすめします。
特に、以下のような状況では外部委託が非常に有効です。
- 業務で使用している基幹マクロが動きを止め、一刻も早く復旧させる必要がある場合
- マクロを作成した担当者が既に退職しており、社内にVBAがわかる人間が一人もいない場合
- エラーの解消だけでなく、今後エラーが発生しにくいようにプログラムの全体的な構造改革(リファクタリング)を行いたい場合
マクトシステム(Mactism)では、既存のExcelマクロやAccessツールのエラー調査、修正、改修を1画面・1機能といったスモールステップから対応しています。まずは現状のお悩みをお気軽にご相談ください。
質問:実行時エラー5と、実行時エラー9「インデックスが有効範囲にありません」の違いは何ですか?
回答:エラー5は「渡した引数の値や呼び出し方法そのものが、その関数のルールに違反している(例: 文字数にマイナスを指定した)」場合に発生します。一方、エラー9は「指定した名前や番号の要素が、コレクションや配列の中に存在しない(例: 存在しないシート名『Sheet99』を指定した)」場合に発生します。どちらも非常によくあるエラーですが、対処アプローチが異なります。
質問:エラー5が特定のパソコン(ユーザー)だけで発生する原因は何ですか?
回答:ExcelのバージョンやOSの違い(WindowsとMac)、または「システムのロケール(地域言語設定)」や「インストールされているOfficeのビット数(32bit / 64bit)」の違いが原因である可能性が高いです。特にWindows/Mac間でのパス表記の差異や、外部連携するライブラリ(参照設定)の有無などが影響します。それぞれのパソコンの環境を確認し、環境依存のコード(APIやファイルパス)を適切に切り分ける必要があります。
質問:ピボットテーブルの作成マクロでエラー5が出た場合のチェックポイントは?
回答:ピボットテーブル作成時の SourceData(元データ範囲)の指定が正しい形式になっているか確認してください。例えば、R1C1形式の文字列で範囲を指定する必要があるメソッドに「A1:C10」のような通常のセル範囲(A1形式)をそのまま渡すと、引数が不正とみなされてエラー5になります。また、作成先シートの名前が間違っている場合にも発生します。
質問:エラー5を防ぐために、On Error Resume Next を使うのは推奨されますか?
回答:一時的な回避手段として使われることがありますが、原則として非推奨です。On Error Resume Next を使うと、エラーが発生してもそれを無視して強引に次の行に進むため、本来エラーになるべき「おかしな状態」のまま処理が続行され、最終的にデータが破損したり、予期せぬ計算バグに気づかないまま業務が進んでしまうリスクがあります。必ず If 文などによる事前チェック(バリデーション)でエラーを回避しましょう。