【この記事について】本記事は 2026年9月5日 時点で確認した内容です。対象環境:Windows 版 Excel(Microsoft 365 / Excel 2021・2019)の VBA(Visual Basic for Applications)。Mac 版・Web 版では画面の名称や一部の挙動が異なります。コードはご自身のブックのコピーで試してください。掲載しているエラーの意味と関数の仕様は、Microsoft の公式ドキュメント(記事末尾に出典)にもとづいています。本記事の内容の利用は、ご自身の判断と責任でお願いします。
「マクロを動かしたら『実行時エラー 13 型が一致しません』で止まった」
「昨日まで動いていたのに、今日そのファイルで動かした瞬間に止まる」
「エラーの意味を調べても『型が違う』としか書いていなくて、どこを直せばいいのか分からない」
先に結論です。実行時エラー13は、ほとんどの場合「コードのバグ」ではなく「セルの中身」が原因で出ます。数値を入れるつもりの変数に、文字・空白・エラー値(#N/A など)・複数セルのかたまりが入ってきた瞬間に、VBAが「その入れ物には入りません」と止めているだけです。ですから、まず疑うのはコードではなくデータの側です。
この記事では、原因を7つに整理しました。どれも[デバッグ]で止まった黄色い行を見れば30秒で切り分けられるように順番を組んでいます。上から順に確認していけば、たいていは3番目までで見つかります。最後に「二度と13で止まらない書き方」も置きました。
- まず[デバッグ]を押して「黄色い行」を見る(症状別 早見表)
- そもそも「実行時エラー13」とは何が起きているのか
- 原因1:セルの中身が「数字ではない文字」なのに、数値型の変数へ入れている(最多)
- 原因2:セルがエラー値(#N/A・#VALUE! など)になっている
- 原因3:Application.Match / Application.VLookup が「見つからない」を返している
- 原因4:複数のセルをまとめて1つの変数に入れている(中身が配列)
- 原因5:値が必要な場所に「オブジェクト」を渡している
- 原因6:日付として読めない文字列を Date 型に入れている
- 原因7:InputBox やテキストボックスの入力を、そのまま計算に使っている
- 「ByRef 引数の型が一致しません」は、実行時エラー13とは別物
- 二度と13で止まらないための書き方(ここが本当の解決です)
- よくある質問(Q&A)
- まとめ:13は「入れ物と中身が合っていない」の合図
まず[デバッグ]を押して「黄色い行」を見る(症状別 早見表)
エラーのダイアログが出たら、[終了]ではなく[デバッグ]を押してください。止まった行が黄色く反転します。この1行がすべてです。その行に出てくる変数の上にマウスを重ねると、いま入っている値が小さな吹き出しで表示されます。
| 黄色い行に書いてあること | もっとも疑わしい原因 | この記事の該当箇所 |
|---|---|---|
セルの値を変数に入れている(x = Cells(...).Value など) |
セルの中身が文字・エラー値・空白 | 原因①② |
Application.Match や Application.VLookup がある |
「見つからない」が返ってきている | 原因③ |
Range("A1:A10").Value のように範囲を指定している |
中身が配列になっている | 原因④ |
MsgBox や & の中にシート名・Range が直接ある |
オブジェクトを値として渡している | 原因⑤ |
As Date の変数に代入している |
日付として読めない文字列 | 原因⑥ |
InputBox や テキストボックス(.Text)がある |
キャンセル・空欄・全角文字 | 原因⑦ |
| 実行前に出た/黄色くならず青く反転した | 実行時エラーではなくコンパイルエラー | 後半の専用セクション |
複数当てはまることもあります。その場合は上の行から順に片づけてください。
そもそも「実行時エラー13」とは何が起きているのか
VBAの変数には「入れ物の種類」があります。Long なら整数、Double なら小数、String なら文字、Date なら日付、といった具合です。これをデータ型と呼びます。
Microsoft の公式ドキュメントは、エラー13の原因をこう説明しています。「変数またはプロパティの型が正しくない。たとえば、整数値を必要とする変数は、文字列全体が整数として認識されない限り、文字列値を受け取ることはできません」(出典は記事末尾)。
つまり VBA は、けっこう親切に変換してくれます。文字列の "123" を数値の変数に入れても、全体が数字として読めるので通ります。Integer は Long に、Single は Double に、そのまま入れられます。Variant にはほぼ何でも入ります。
その親切さでも変換できなかったときに出るのが13です。だから「入れ物が悪い」のではなく「中身が想定外だった」と読むのが正解です。よくある想定外は、次の4つです。
- 数字ではない文字が混じっている(「12個」「約50」「―」)
- セルがエラー値になっている(#N/A、#VALUE!、#REF! など)
- 1つの値だと思っていたら配列(複数の値のかたまり)だった
- 値だと思っていたらオブジェクト(シートやセルそのもの)だった

原因1:セルの中身が「数字ではない文字」なのに、数値型の変数へ入れている(最多)
いちばん多いのがこれです。次のようなコードで止まります。
Dim n As Long
n = Cells(2, 1).Value ' ← A2 に「12個」と入っていると 13 で止まる
A2 が 12 なら通ります。"12"(文字列として保存された数字)でも通ります。しかし 12個・約12・ー・該当なし のように数字以外の文字が1つでも混じると通りません。
直し方:入れる前に「数値として読めるか」を確認する
Dim n As Long
Dim v As Variant
v = Cells(2, 1).Value
If IsNumeric(v) Then
n = CLng(v)
Else
n = 0 ' 数値でなければ 0 とみなす
' MsgBox "A2 が数値ではありません: " & CStr(v)
End If
IsNumeric は「その値が数値として評価できるか」を True / False で返す公式の関数です。いったん Variant で受けてから判定するのがコツです。Long で直接受けると、判定する前に代入で止まってしまうからです。
犯人のセルを一発で見つける方法
止まった行が Cells(i, 1) のようにループの中なら、イミディエイトウィンドウ(Ctrl + G)に次の1行を打ち込んで Enter を押してください。いま何行目で止まったかが分かります。
? i, Cells(i, 1).Value, TypeName(Cells(i, 1).Value)
TypeName は中身の種類を文字で教えてくれます。Double なら数値、String なら文字、Error ならエラー値、Empty なら空欄です。これが原因の切り分けで一番速い道具です。
原因2:セルがエラー値(#N/A・#VALUE! など)になっている
見た目には #N/A と書いてあるだけですが、VBAから見るとこれは「エラー値」という特殊な中身です。文字でも数値でもないので、Long にも String にも入りません。
Dim s As String
s = Range("B2").Value ' ← B2 が #N/A だと 13 で止まる
厄介なのは、比較するだけでも止まることです。
If Range("B2").Value > 100 Then ' ← B2 が #N/A だとここで 13
直し方:IsError で先にはじく
Dim v As Variant
v = Range("B2").Value
If IsError(v) Then
' エラー値のセルは飛ばす
ElseIf v > 100 Then
' 通常の処理
End If
IsError は「式がエラー値かどうか」を判定する公式の関数です。順番が大事です。IsError を先に書かないと、v > 100 の側で止まります。
なお、シート側で =IFERROR(元の式, "") にしてエラーを出さないようにするのも有効な手です。マクロを直すより速い場合があります。
原因3:Application.Match / Application.VLookup が「見つからない」を返している
これは業務マクロで本当によく踏みます。
Dim r As Long
r = Application.Match("田中", Range("A:A"), 0) ' ← 「田中」が無いと 13
Application.Match は、見つからなかったときにエラーで止まるのではなく、エラー値を返します。そのエラー値を Long の変数に入れようとした瞬間に13が出る、という流れです。Application.VLookup も同じです。
直し方:Variant で受けて IsError で判定する
Dim res As Variant
Dim r As Long
res = Application.Match("田中", Range("A:A"), 0)
If IsError(res) Then
MsgBox "見つかりませんでした"
Exit Sub
End If
r = CLng(res)
MsgBox r & " 行目にありました"
覚え方はこうです。Application.Match は「見つからない」を値として返すので受け皿は Variant。WorksheetFunction.Match は「見つからない」でその場で止まるので On Error が必要。用途で使い分けます。探し物が見つからない可能性があるなら Application. の方が扱いやすいと覚えておいてください。
原因4:複数のセルをまとめて1つの変数に入れている(中身が配列)
Dim d As Double
d = Range("A1:A10").Value ' ← 13。中身は 10行×1列の「配列」
Range("A1").Value は値が1つですが、Range("A1:A10").Value は10個の値のかたまり(配列)になります。かたまりは1つの数値の入れ物には入りません。
意図せずこうなるパターンもあります。Range("A1:A10") のつもりで書いた変数に、実は範囲が入っていた、というケースです。
直し方:1つだけ欲しいのか、全部欲しいのかを決める
' (a) 1つだけ欲しい場合
Dim d As Double
d = Range("A1").Value
' (b) まとめて速く処理したい場合(配列として受ける)
Dim arr As Variant
Dim i As Long
arr = Range("A1:A10").Value ' 2次元配列になる
For i = 1 To UBound(arr, 1)
Debug.Print arr(i, 1) ' 列番号「1」を忘れると別のエラーになる
Next i
(b) の書き方はセルを1つずつ読むより大幅に速いので、行数が多いマクロでは覚えておく価値があります。ただし arr(i, 1) と2つの番号で指定する点に注意してください。
原因5:値が必要な場所に「オブジェクト」を渡している
Microsoft の公式ドキュメントは、エラー13の原因のひとつとして「1つのプロパティまたは値が必要なプロシージャにオブジェクトが渡された」を挙げています。具体的にはこういう書き方です。
Dim s As String
s = Worksheets("売上") ' ← シートそのものを文字変数に入れている
MsgBox "対象:" & Worksheets("売上") ' ← 同じ理由で止まることがある
シートやセルは「モノ(オブジェクト)」であって「値」ではありません。モノから値を取り出す一言を足すのが直し方です。
Dim s As String
s = Worksheets("売上").Name ' シートの名前が欲しい
MsgBox "対象:" & Range("A1").Value ' セルの中身が欲しい
.Name なのか .Value なのか、「何が欲しいのか」を書き足す。これだけで通ります。
原因6:日付として読めない文字列を Date 型に入れている
Dim d As Date
d = Range("C2").Value ' ← C2 が「2026年13月45日」「未定」だと 13
Date 型は日付として成立する値しか受け取れません。「未定」「―」「2026/13/45」のような文字列は日付として解釈できないので止まります。年月日が全角で入っている台帳でも起きます。
直し方:IsDate で確認してから入れる
Dim v As Variant
Dim d As Date
v = Range("C2").Value
If IsDate(v) Then
d = CDate(v)
Else
MsgBox "C2 は日付として読めません:" & CStr(v)
Exit Sub
End If
IsDate は「日付に変換できるかどうか」を返す公式の関数です。人が手入力する日付欄には、ほぼ必ず付けておくべきチェックだと思ってください。
原因7:InputBox やテキストボックスの入力を、そのまま計算に使っている
Dim n As Long
n = InputBox("件数を入力してください") ' ← キャンセル・空欄・「あ」で 13
InputBox が返すのは常に文字列です。ユーザーが[キャンセル]を押すと空文字(””)が返ります。空文字は数値として読めないので、そのまま Long に入れると13です。ユーザーフォームのテキストボックス(TextBox1.Text)もまったく同じ理屈です。
直し方:文字列で受けて、空とチェックを通してから変換する
Dim inp As String
Dim n As Long
inp = InputBox("件数を入力してください")
If inp = "" Then
Exit Sub ' キャンセル or 未入力
End If
If Not IsNumeric(inp) Then
MsgBox "数字で入力してください"
Exit Sub
End If
n = CLng(inp)
「文字列で受ける → 空を見る → IsNumeric を見る → 変換する」。この4段構えにしておけば、入力欄まわりで13が出ることはほぼ無くなります。
「ByRef 引数の型が一致しません」は、実行時エラー13とは別物
同じ「型が一致しません」という言葉でも、実行前に出るものがあります。見分け方は簡単です。
| 実行時エラー 13 | コンパイルエラー(ByRef 引数の型が一致しません) | |
|---|---|---|
| 出るタイミング | マクロが動いている途中 | 動き出す前 |
| ダイアログの表示 | 「実行時エラー ’13’:」と番号が出る | 番号が出ない |
| 行の見え方 | [デバッグ]で黄色く反転 | 該当箇所が青く反転 |
| 原因 | 入ってきたデータが想定外 | 呼び出し側と受け取り側の宣言が違う |
後者は、たとえば受け取る側が ByRef n As Long なのに、呼び出す側が Integer の変数を渡している、といった場合に出ます。データではなく Dim の書き方の問題なので、両側の型をそろえれば直ります。急いでいるときは、受け取る側を ByVal にすると通ることもあります(値のコピーが渡るため)。
二度と13で止まらないための書き方(ここが本当の解決です)
原因を1つずつ潰すのも大事ですが、同じ事故を繰り返さない仕組みを先に入れてしまうほうが結局は速いです。次の4つをおすすめします。
1. モジュールの1行目に Option Explicit を書く
Option Explicit
これを書くと、Dim していない変数を使ったときに教えてくれます。タイプミスで作られてしまった「幽霊変数」が消えるので、型まわりの事故が目に見えて減ります。VBE の[ツール]→[オプション]→[変数の宣言を強制する]にチェックを入れると、新しいモジュールに自動で入ります。
2. 外から来た値は、いったん Variant で受ける
セル・InputBox・テキストボックス・Application.Match ── 自分のコードの外から来るものは、すべて「想定外が来る」と考えて Variant で受けます。受けてから IsNumeric / IsDate / IsError で選別し、通ったものだけ本来の型へ変換します。
3. 判定に使う3つの関数を覚える
| 関数 | 何を判定するか | 使いどころ |
|---|---|---|
IsNumeric(v) |
数値として読めるか | 金額・件数・数量の列 |
IsDate(v) |
日付として読めるか | 日付欄・期限欄 |
IsError(v) |
エラー値かどうか | 数式が入っている列、Match / VLookup の戻り値 |
4. 調べるときは TypeName と VarType
Debug.Print TypeName(v) ' "String" "Double" "Date" "Error" "Empty" "Range" など
Debug.Print VarType(v) ' 種類を番号で返す
TypeName は「思い込みを壊してくれる関数」です。数値だと思っていた列が String だった、という発見はこれで一瞬です。イミディエイトウィンドウ(Ctrl + G)に打ち込むだけで使えます。
まとめて使う「安全な読み取り」の型
Option Explicit
Sub 安全に読み取る()
Dim i As Long
Dim v As Variant
Dim goukei As Double
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
v = Cells(i, 1).Value
If IsError(v) Then
' エラー値のセルは飛ばす
ElseIf IsNumeric(v) Then
goukei = goukei + CDbl(v)
Else
Debug.Print i & " 行目は数値ではありません:" & CStr(v)
End If
Next i
MsgBox "合計:" & goukei
End Sub
この形をひな形として持っておくと、13で止まる場面がほとんど無くなります。「エラー値を飛ばす → 数値なら足す → それ以外は記録する」。3つに分けているだけです。
よくある質問(Q&A)
Q. On Error Resume Next を入れれば止まらなくなりますか?
止まらなくはなります。ただしおすすめしません。13は「データが想定と違う」という警告なので、握りつぶすと間違った集計結果が黙って出てきます。止まってくれるほうが、まだ安全です。どうしても使う場合は、対象の1行だけを挟み、直後に On Error GoTo 0 で必ず戻してください。
Q. 変数を全部 Variant にすれば解決しますか?
13は減りますが、別の問題が増えます。文字と数値が混ざったまま計算に流れ込み、合計が合わない・並び替えが変になる、といった形で後から表面化します。受け取りは Variant、判定してから本来の型へという使い分けが現実的です。
Q. 「実行時エラー6(オーバーフロー)」との違いは?
13は種類が違うとき、6は種類は合っているが大きすぎるときです。たとえば Integer に 100000 を入れると6が出ます(Integer は約±3万2千まで)。この場合は Long に変えれば直ります。
Q. 特定のファイルでだけ13が出ます。コードは同じなのに、なぜ?
それがまさに13の性格です。コードではなくデータが原因なので、ファイルが変われば結果も変わります。そのファイルの該当列を選択して、Excel の画面下部(ステータスバー)に「平均」や「合計」が出るか見てください。出なければ、その列は文字列として入っています。
Q. セルは数字に見えるのに13になります
先頭にアポストロフィ(’)が付いている、末尾に空白が入っている、全角で入力されている、といったケースです。TypeName(Cells(i,1).Value) で確認するのが確実です。まとめて直すなら、Excel 側で[データ]→[区切り位置]を開いてそのまま[完了]を押すと、文字列の数字が数値に戻ることがあります。
Q. デバッグで止まった行を直したあと、途中から再開できますか?
できます。黄色い行を直したあと F5 で続行できます。ただし途中の変数の状態が中途半端なことがあるため、集計を伴うマクロは最初からやり直すほうが安全です。
まとめ:13は「入れ物と中身が合っていない」の合図
- まず[デバッグ]で黄色い行を見る。話はそこからしか始まらない
- 最多の原因はセルに数字以外の文字が入っていること。
IsNumericではじく - #N/A などのエラー値は代入も比較も止まる。
IsErrorを先に書く Application.Match/Application.VLookupは「見つからない」を値で返す。受け皿はVariantRange("A1:A10").Valueは配列。1つの数値の変数には入らない- シートやセルはオブジェクト。
.Nameや.Valueを足して値にする - 日付欄は
IsDate、入力欄は文字列で受けてから変換する - 青く反転したら実行時エラーではなくコンパイルエラー。
Dimの型をそろえる
実行時エラー13は、エラーの中でもいちばん理不尽に見えるタイプだと思います。コードは1文字も変えていないのに、ファイルを差し替えた途端に止まるからです。けれど理由が分かってしまえば、むしろ話は単純です。VBAは「このデータ、想定と違いますよ」と教えてくれているだけで、あなたの書き方を否定しているわけではありません。
そして今日あなたが手に入れたのは、7つの原因だけではありません。「外から来た値は、いったん Variant で受けて、確かめてから使う」という考え方です。これはVBAに限らず、人が手で入力したデータを扱うすべての場面で効きます。ひな形を1つ持っておけば、次に似たエラーが出ても、落ち着いて黄色い行を見にいけます。焦らなくて大丈夫です。1つずつで、十分に前へ進めます。
次に読む
同じマクロで別の番号のエラーが出るときは、番号ごとに原因がまったく違います。「実行時エラー9(インデックスが有効範囲にありません)」はこちら。

「実行時エラー438(オブジェクトはこのプロパティまたはメソッドをサポートしていません)」はこちら。

「実行時エラー91(オブジェクト変数またはWithブロック変数が設定されていません)」はこちら。

そもそもマクロが起動しない・ボタンを押しても無反応というときは、こちら。

参考にした一次情報(2026年9月5日確認)
型が一致しません (エラー 13)|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/type-mismatch-error-13
データ型の概要|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/data-type-summary
IsNumeric 関数|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/isnumeric-function
IsError 関数|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/iserror-function
IsDate 関数|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/isdate-function
VarType 関数|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/vartype-function
Option Explicit ステートメント|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/option-explicit-statement

コメント