Excel VBA の実行時エラー辞典
実行時エラー '13':型が一致しません
文字列・セルのエラー値・配列を数値として扱っていないか確認します。
よくある原因
- 数量欄の文字列を数値変数へ代入しています。
- #N/A などのセルのエラー値を数値に変換しています。
- 複数セルから得た配列を、一つの数値変数へ代入しています。
直し方
- 受け取る変数の型と、セルから取得した値の型を比べます。
- IsError でセルのエラー値を先に除外し、次に IsNumeric で数値か確認します。
- 有効な値だけを CDbl などで変換します。無効な値を黙って 0 にせず、入力元を確認できるようにします。
元のブックや入力ファイルを残し、コピーで試してください。以下は一つの原因を扱う例です。Sub 全体を示していないコードは、練習用の Sub の中に記述します。
最初のシートの A1 を読む例です。VBA の And は短絡評価しないため、エラー値の判定を別の分岐にしています。
修正前
Dim amount As Double
amount = ThisWorkbook.Worksheets(1).Range("A1").Value2
修正後
Dim value As Variant, amount As Double
value = ThisWorkbook.Worksheets(1).Range("A1").Value2
If IsError(value) Then
MsgBox "A1 の数式エラーを確認してください"
ElseIf IsNumeric(value) Then
amount = CDbl(value)
Debug.Print amount
Else
MsgBox "A1 に数値を入力してください"
End If
調べ方
- エラー画面の「デバッグ」が使える場合は押し、黄色で止まった行とメッセージ全文を記録します。Windows では Alt+F11 で VBE を開けます。
- 停止行の少し前を選び、F9 でブレークポイントを設定します。再実行して止めたら、F8 で一行ずつ進めます。
- 代入直前の値を Variant で受け、TypeName と IsError を確認します。
- Ctrl+G でイミディエイトウィンドウを開き、下の式を入力して Enter を押します。例の変数があるプロシージャ内で停止し、変数名は自分のコードに合わせてください。
? TypeName(value), IsError(value)
Err の情報はエラーが起きた直後に確認します。修正後は、正常な入力と問題が起きた入力の両方で結果を照合してください。