実行時エラー13「型が一致しません」の原因と直し方
数値を期待した場所に文字列や空白、エラー値(#N/A など)が入っていると出る実行時エラー 13 について、よくある原因と、値を確認してから計算する書き方を解説します。
どんなエラーか
実行時エラー 13「型が一致しません」は、変数の型と代入しようとした値の種類が合わないときに出ます。たとえば、Long 型の変数に「abc」という文字列を代入したり、文字列と数値を足し算しようとしたりした場合です。
実務では、セルの値を計算に使うときに、そのセルに想定外の値(文字列、空白、#N/A などのエラー値)が入っていて起きることがほとんどです。マクロを作ったときのデータでは問題がなくても、別の月のデータで突然止まる、という形で表れます。
よくある原因
次のような値が、数値の列に紛れ込んでいるケースが代表的です。
- 数式の結果がエラー値(#N/A、#DIV/0!、#VALUE! など)
- 「-」「なし」「未定」などの文字が入力されている
- 全角の数字「123」や、カンマ付きの文字列「1,234円」
- 日付の列に「2026.10.5」のような日付として認識されない文字列
原因の見つけ方
デバッグで止まった行を確認し、その行で使っているセルの値を、イミディエイトウィンドウで表示します。TypeName 関数を使うと、値の種類が分かります。エラー値の場合は「Error」と表示されます。
Debug.Print TypeName(ws.Cells(i, "E").Value), ws.Cells(i, "E").Text
' 例:Double 1,234 / String 未定 / Error #N/A / Empty(空白)値を確認してから使う書き方
セルの値を数値として使う前に、エラー値でないか、数値として扱えるかを確認する関数を用意しておくと便利です。数値にできない場合は 0 を返し、どの行に問題があったかを記録します。
Function ToNum(ByVal v As Variant, Optional ByRef ok As Boolean) As Double
ok = False
If IsError(v) Then Exit Function ' #N/A などのエラー値
If IsEmpty(v) Then Exit Function ' 空白
v = Replace(Replace(StrConv(CStr(v), vbNarrow), ",", ""), "円", "")
If IsNumeric(v) Then
ToNum = CDbl(v)
ok = True
End If
End Function
Sub SumAmount()
Dim ws As Worksheet, i As Long, total As Double, ok As Boolean, bad As String
Set ws = ThisWorkbook.Worksheets("明細")
For i = 2 To ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
total = total + ToNum(ws.Cells(i, "E").Value, ok)
If Not ok Then bad = bad & i & " "
Next i
MsgBox "合計:" & Format(total, "#,##0") & vbCrLf & "数値でない行:" & bad
End Subポイント
IsError の確認は、ほかの判定より先に行う必要があります。エラー値に対して CStr や比較を行うと、その時点で型の不一致エラーになるためです。
また、数値にできなかった行を黙って 0 として足すと、合計が少なく出てしまいます。この記事のように問題のあった行を記録して知らせるか、処理を止めて利用者に直してもらうかを、業務に合わせて選んでください。
※全角数字の変換には StrConv(値, vbNarrow) を使っています。
ほかの記事
基本・高速化最終行を正しく取得する方法(End(xlUp)・UsedRange・CurrentRegion の違い)データの最終行を取得する代表的な3つの方法と、空白行や書式だけ残ったセルで結果がずれる原因、実務で安全な書き方を解説します。基本・高速化マクロを速くする基本(画面更新の停止・計算の手動化・配列での一括処理)セルを1つずつ読み書きする遅いマクロを、画面更新の停止・計算方法の切り替え・配列での一括処理で速くする方法を、元に戻し忘れを防ぐ書き方とあわせて解説します。基本・高速化日付の扱い方(文字列の日付の変換・月末日・締め日の計算)CSV から取り込んだ文字列の日付を日付型に変換する方法、DateSerial を使った月末日や締め日の計算、和暦の表示など、日付で間違えやすい点をまとめます。データ集計・抽出複数シートのデータを1枚のシートに集約する支店別・月別など同じ形式の複数シートを、1枚の集計用シートにまとめるマクロです。見出しの扱い、元シート名の記録、集計シートの作り直しまで解説します。