Excel VBA の実行時エラー辞典
実行時エラー '450':引数の数が一致していません。または無効なプロパティを指定しています
呼び出しで渡した引数の数が定義と合っているか、読み取り専用のプロパティに代入していないか確認します。
よくある原因
- 自作の Sub や Function の引数を増減したのに、呼び出し側を直していません。
- 引数を取らないプロパティに (1) のような番号を付け、引数として解釈されています。
- 読み取り専用のプロパティ(自作クラスなら Property Let のないプロパティ)に値を代入しています。
直し方
- 停止した行の呼び出しとプロシージャの定義を並べ、引数の数と順番を照合します。
- 定義を変更した場合は、Ctrl+F でそのプロシージャ名を検索し、すべての呼び出しを直します。
- プロパティへの代入で止まる場合は、資料やオブジェクトブラウザーで読み取り専用でないか確認します。自作クラスなら Property Let を定義するか、代入をやめます。
元のブックや入力ファイルを残し、コピーで試してください。以下は一つの原因を扱う例です。Sub 全体を示していないコードは、練習用の Sub の中に記述します。
ログの種類を表す引数を追加した例です。この例は実行前にコンパイル エラーとして表示される場合があります。
修正前
Sub WriteLog(message As String)
Debug.Print Format(Now, "yyyy-mm-dd hh:nn"), message
End Sub
Sub Main()
WriteLog "開始", "INFO"
End Sub
修正後
Sub WriteLog(message As String, Optional level As String = "INFO")
Debug.Print Format(Now, "yyyy-mm-dd hh:nn"), level, message
End Sub
Sub Main()
WriteLog "開始", "INFO"
WriteLog "終了"
End Sub
調べ方
- エラー画面の「デバッグ」が使える場合は押し、黄色で止まった行とメッセージ全文を記録します。Windows では Alt+F11 で VBE を開けます。
- 停止行の少し前を選び、F9 でブレークポイントを設定します。再実行して止めたら、F8 で一行ずつ進めます。
- 呼び出し先の名前の上で Shift+F2 を押して定義へ移動し、引数の数を確認します。
- Ctrl+G でイミディエイトウィンドウを開き、下の式を入力して Enter を押します。例の変数があるプロシージャ内で停止し、変数名は自分のコードに合わせてください。
WriteLog "テスト"
Err の情報はエラーが起きた直後に確認します。修正後は、正常な入力と問題が起きた入力の両方で結果を照合してください。
関連エラー
- 実行時エラー '5':プロシージャ呼び出しが正しくありません
- 実行時エラー '438':オブジェクトは、このプロパティまたはメソッドをサポートしていません
- 実行時エラー '449':引数はオプションではないか、プロパティの割り当てが無効です