エラーの内容
マクロを実行すると、すぐにこのダイアログが表示されます:
Run-time error '13': Type Mismatch
VBAが1行を黄色でハイライトします。マクロは停止します。どの変数が原因なのか、コードを見つめながら途方に暮れることになります。
実際に何が起きたか:VBAが宣言された型と一致しない値の代入または比較を試みました。よくある例としては、テキスト文字列をInteger変数に詰め込んだり、数値の代わりに"N/A"が入ったセルで算術演算を行ったりするケースが挙げられます。
エラーが発生するよくあるケース
- マクロが読み取るセルに数値ではなくエラー値(
#VALUE!、#N/A、#REF!)が入っている。 - セルに数値のように見えるテキスト(
"123")が入っているが、変数が変換なしでIntegerまたはLongとして宣言されている。 - 配列ではない通常の変数に対して配列操作を実行しようとしている。
- 関数が
NullまたはEmptyを返し、それを型付き変数にそのまま代入している。 - セルにVBAが自動変換できない地域形式の日付文字列が含まれている(例:ドイツ語ロケールのマシンで
"12.05.2026")。
素早い診断方法
エラーダイアログが表示されたら、「終了」ではなく**「デバッグ」**をクリックしてください。VBAが問題のある行を黄色でハイライトします。その行の各変数の上にマウスをホバーすると、ツールチップで現在の値を確認できます。
クラッシュ前にセルを調べたい場合は、イミディエイトウィンドウ(Ctrl+G)に以下を入力してください:
' In the Immediate Window, type:
? TypeName(ActiveSheet.Range("B2").Value)
? ActiveSheet.Range("B2").Value
Error 2042(VBA用語での#N/A)が表示されたり、Doubleを期待していたのにStringと表示されたりした場合、原因が特定できたことになります。
修正1 — セルエラーへの対策
数式エラーを含むセルが最もよくある原因です。マクロが#VALUE!や#N/Aを読み取ると即座にクラッシュします。他の処理を行う前にIsError()で読み取りをラップしてください:
Dim cellVal As Variant
cellVal = ActiveSheet.Range("B2").Value
If IsError(cellVal) Then
MsgBox "Cell B2 has an error: " & CStr(cellVal)
Exit Sub
End If
' Safe to use now
Dim total As Double
total = CDbl(cellVal)
変数をまずVariantとして宣言していることに注目してください。問題が起きる可能性のあるセルは、チェックを行う前に必ずVariantに読み込んでください。型付き変数に直接読み込まないようにしましょう。
修正2 — 明示的な型変換
VBAの暗黙的な変換は不安定です。123と表示されているセルが実際にはテキストとして格納されている場合があり、クラッシュするまでVBAはそれを教えてくれません。代わりに明示的な変換関数を使用してください:
' Risky — crashes if cell has text
Dim qty As Integer
qty = Range("C5").Value
' Safe
Dim qty As Integer
If IsNumeric(Range("C5").Value) Then
qty = CInt(Range("C5").Value)
Else
MsgBox "Expected a number in C5, got: " & Range("C5").Value
Exit Sub
End If
利用できる関数一覧:CInt()、CLng()、CDbl()、CStr()、CDate()、CBool()。これらは変換が本当に失敗した場合に明確なエラーを発生させます。曖昧な「型の不一致」よりもはるかにデバッグが容易です。
修正3 — 未知の入力にはVariantを使用
一部のセルが空、テキスト、またはエラーになった数式である可能性があるレンジをループ処理する場合は、ループ変数をVariantとして宣言し、処理しながらフィルタリングしてください:
Dim cell As Range
Dim total As Double
total = 0
For Each cell In ActiveSheet.Range("B2:B100")
If Not IsError(cell.Value) And IsNumeric(cell.Value) Then
total = total + CDbl(cell.Value)
End If
Next cell
MsgBox "Total: " & total
不正なセルはスキップされます。クラッシュは発生しません。99個のセルのうち30個に#N/Aがあっても、ループはクリーンに実行されます。
修正4 — 日付型の問題
日付は静かな地雷です。"05/12/2026"を含むテキスト形式のセルは、英語以外のシステムでDate変数に直接代入するとクラッシュします。VBAはそれが5月12日なのか12月5日なのかを判断できないためです。
' Problematic
Dim d As Date
d = Range("A1").Value ' Crashes if cell is text-formatted
' Safe
Dim rawVal As Variant
rawVal = Range("A1").Value
If IsDate(rawVal) Then
Dim d As Date
d = CDate(rawVal)
Else
MsgBox "A1 is not a valid date: " & rawVal
End If
修正5 — オブジェクトと値の代入
Setキーワードを忘れると、型とは全く関係なさそうに見える型の不一致エラーが発生します:
' Type Mismatch — missing Set
Dim ws As Worksheet
ws = ThisWorkbook.Sheets("Data") ' WRONG
' Correct
Set ws = ThisWorkbook.Sheets("Data")
Setがないと、VBAはオブジェクトのデフォルトプロパティ(シート名の文字列)を取得し、それをWorksheet変数に詰め込もうとします。即座に不一致が発生します。オブジェクトには必ずSetを使用してください。
恒久的な修正 — 防御的な入力読み取りパターン
ユーザーが入力したセルを読み取るマクロには、検証処理をヘルパー関数にまとめてください。一度書けばどこでも使えます:
Function SafeReadNumeric(ws As Worksheet, cellAddr As String) As Variant
Dim v As Variant
v = ws.Range(cellAddr).Value
If IsError(v) Then
SafeReadNumeric = CVErr(xlErrValue) ' Pass error upstream
ElseIf Not IsNumeric(v) Or IsEmpty(v) Then
SafeReadNumeric = CVErr(xlErrValue)
Else
SafeReadNumeric = CDbl(v)
End If
End Function
' Usage:
Dim price As Variant
price = SafeReadNumeric(ActiveSheet, "D5")
If IsError(price) Then
MsgBox "D5 doesn't have a valid number."
Exit Sub
End If
修正の確認
- エラーダイアログを閉じ、修正を適用して、F5を押して再実行します。
- 意図的に入力を壊してみてください。マクロが読み取るセルに
abcと入力し、ガード処理がクラッシュせずに適切に対処することを確認します。 #N/Aや#VALUE!を含むセルでテストします。IsError()チェックがそれを静かに吸収するはずです。- マクロが赤いダイアログなしに終了し、正しい出力が得られれば完了です。
まとめ
実行時エラー '13' は、ほぼ常にワークシートデータを検証せずに読み取ることが原因です。セルにはエラー値、予期せぬテキスト、または空文字列が入っている可能性があり、VBAの型システムは不一致に対して一切の寛容さを持ちません。
90%のケースを解決するパターン:Variantに読み込み、IsError()・IsNumeric()・IsDate()でチェックし、CInt()・CDbl()・CDate()で明示的に変換する。それだけです。この習慣を身につければ、型の不一致は常連のトラブルではなく、めったに起きない例外になります。

