本記事には広告(PR)が含まれます。
くわしくは プライバシーポリシー をご確認ください。
Excelでマクロを実行したときに、
「実行時エラー13:型が一致しません」
と表示されて、困ったことはありませんか?
このエラーは、VBAを使い始めたばかりの方だけでなく、
ある程度慣れてきた方でもよく遭遇する“定番エラー”のひとつです。
特に、
- 変数に代入する値を間違えたとき
- セルの値が想定と違っていたとき
- 関数や配列の扱いを誤ったとき
などに発生しやすく、「なぜエラーが出たのか分かりにくい」のが特徴です。
私自身も、変数が増えてきたタイミングや、
別モジュールとの連携処理を作っているときに何度もこのエラーに悩まされました。
この記事では、
- 実行時エラー13「型が一致しません」の意味
- よくある原因と具体的な対処法
- エラーを防ぐためのポイント
を、初心者の方にも分かりやすく解説します。
「とりあえず動くコード」から一歩進んで、
エラーに強いマクロを作れるようになりましょう。
VBAの実行時エラー13「型が一致しません」とは?
実行時エラー13の意味
「型が一致しません」とは、
データの種類(型)が合っていない状態で処理をしようとしたときに発生するエラーです。
VBAでは、データにはそれぞれ「型(データ型)」があります。
たとえば、
- 数値(Long、Double など)
- 文字列(String)
- 日付(Date)
- オブジェクト(Range など)
といったように、扱うデータの種類が明確に決まっています。
しかし、これらの型が一致していない状態で処理を行うと、
VBAは「正しく処理できない」と判断し、エラー13が発生します。
たとえば、次のようなケースです。
Dim num As Long
num = "ABC"
数値(Long型)の変数に文字列(”ABC”)を代入しようとしているため、
型が一致せずエラーになります。

どんなタイミングで発生するのか?
実行時エラー13は、主にマクロの実行中に発生します。
特に「値の代入」や「型変換」のタイミングで発生することが多いのが特徴です。
エラーが発生すると、次のようなダイアログが表示されます。
- 「実行時エラー ’13’:型が一致しません」
この状態で「デバッグ」をクリックすると、
問題が発生しているコードの行が黄色で表示されます。
この黄色の行が、
エラーの原因となっている処理の場所です。
ただし注意点として、
表示された行そのものではなく、
- その直前の処理
- 代入している値の中身
に原因があるケースも多いため、
前後のコードもあわせて確認することが重要です。


よくあるエラー表示例
実際にエラー13が発生する、シンプルな例を見てみましょう。
Sub Sample()
Dim num As Long
num = Range("A1").Value
End Sub
- A1に文字列が入っている
- A1にエラー値(#N/A など)が入っている
といった場合、型が一致せずエラーになることがあります。

※なお、空白セルの場合はエラーにならず「0」として扱われることが多いため、注意が必要です。
このように、
**「見た目では問題なさそうでも、実際のデータ型が違う」**ことが原因で、
エラー13が発生するケースは非常に多いです。
実行時エラー13の原因と対処法まとめ
実行時エラー13は、原因のパターンがある程度決まっているエラーです。
ここでは、実務で特によくある原因と対処法をセットで解説します。
原因①:変数の型と代入する値が違う
もっとも基本的な原因が、
変数の型と代入する値の型が一致していないケースです。
Dim num As Long
num = "ABC" ' ←文字列を代入している
この場合、数値型(Long)に文字列を入れようとしているため、エラーになります。
▶対処方法
- 変数の型を見直す
- または、値を適切な型に変換する
Dim txt As String
txt = "ABC"

もしくは、数値として扱いたい場合は変換します。
num = CLng(Range("A1").Value)
原因②:セルの値が想定と違う(空白・文字列)
Excel特有の原因として多いのが、
セルの中身が想定と違うケースです。
Dim num As Long
num = Range("A1").Value
一見問題なさそうですが、
- 空白セル(※0として扱われることがある)
- 数値に見える文字列(”123″ など)
- エラー値(#N/A など)
が入っていると、エラーになることがあります。
※なお、空白セルはエラーにならず「0」として扱われることがあるため、
エラーが出ないまま処理が進んでしまうケースもあります。
そのため、「エラーが出ていない=正しい処理」とは限らない点に注意しましょう。
▶対処方法
事前に値をチェックするのが安全です。
Sub Sample()
Dim cellValue As Variant
Dim num As Long
cellValue = Range("A1").Value
If IsError(cellValue) Then
'セル内のデータがエラーの場合
MsgBox "A1にエラー値が入っています。"
ElseIf IsNumeric(cellValue) Then
'セル内のデータが数値の場合
num = CLng(cellValue)
Range("A2").Value = num * 2
Else
'セル内のデータが文字列の場合
MsgBox "A1には数値を入力してください。"
End If
End Sub

補足:文字列の数字はエラーにならないこともある
VBAでは、「123」のような数値に変換できる文字列は、
自動的に数値として処理されることがあります。
Dim num As Long
num = "123" ' ←エラーにならない

ただし、
num = "ABC" ' ←エラーになる
のように、変換できない値の場合はエラーになります。
▶「変換できるかどうか」がポイントです
原因③:オブジェクトと値を混同している
VBAでは、オブジェクトと値は別物です。
Dim num As Long
num = Range("A1") ' ←.Valueがない
このコードでは、Rangeオブジェクトをそのまま代入しようとしているため、エラーになります。

▶対処方法
必ず「値」を取得するようにします。
num = Range("A1").Value
原因④:配列や関数の戻り値の扱いミス
少し慣れてくると増えるのが、
配列や関数の戻り値によるエラーです。
たとえば、次のコードです。
Dim arr As Variant
arr = Range("A1:A10").Value
この場合、arrにはセルの値がまとめて格納されますが、
このときのデータは2次元配列として扱われます。
一見1列のデータに見えますが、内部的には
- 行(縦方向)
- 列(横方向)
の2つの要素を持つ配列になっています。
そのため、
MsgBox arr(1, 1)
のように、「行番号・列番号」の両方を指定する必要があります。

MsgBox arr(1)
のように1つだけ指定すると、
配列の形式が合わずエラーになるため注意が必要です。

ポイント
- Rangeで複数セルを取得すると、1列でも2次元配列になる
- arr(行, 列) の形で扱う
原因⑤:日付・数値の変換ミス
日付や数値は、見た目と内部データが違うことがあります。
Dim d As Date
d = "2024/13/01" ' ←存在しない日付
このような場合も、型が一致せずエラーになります。


▶対処方法
変換関数を使い、正しい形式かチェックします。
If IsDate(Range("A1").Value) Then
d = CDate(Range("A1").Value)
Else
MsgBox "日付の形式が正しくありません"
End If

デバッグで原因を特定する方法
エラー13は原因が分かりにくいため、
デバッグを使った確認が重要です。
基本は次の3つです。
▶①デバッグボタンで停止箇所を確認
エラー発生時に「デバッグ」を押すと、
該当行が黄色で表示されます。


▶②Debug.Printで値を確認
Debug.Printは、エラーの原因を調べるときによく使われる基本的なデバッグ方法です。
この機能を使うと、変数やセルの値をイミディエイトウィンドウに表示して確認できます。
もし意図とは異なる値が入っている場合は、代入している値や処理内容を見直しましょう。
Debug.Print Range("A1").Value

補足:イミディエイトウィンドウの表示方法
Debug.Printで出力した内容は、「イミディエイトウィンドウ」に表示されます。
イミディエイトウィンドウは、次の方法で表示できます。
- VBE画面で「Ctrl + G」を押す
- メニュー「表示」→「イミディエイトウィンドウ」を選択
このウィンドウを使うことで、
変数の値や処理結果をその場で確認できるようになります。
![VBAエディターの[表示]メニューから[イミディエイトウィンドウ]を開く操作画面](https://dailyexcelhacks.blog/wp-content/themes/the-thor/img/dummy.gif)
▼デバッグ操作をもっと詳しく知りたい方はこちら
マクロのステップインとは?初心者でもわかるVBAのデバッグ基本操作を解説
▶③変数の型を確認する
Debug.Print TypeName(Range("A1").Value)
→ 実際のデータ型をイミディエイトウィンドウで確認できます。
もし型が異なる場合は、変数のデータ型を見直しましょう。

エラーを防ぐための3つのコツ(実務向け)
最後に、エラー13を未然に防ぐコツを紹介します。
▶①Option Explicitを使う
Option Explicitを使うことで、変数の宣言忘れやスペルミスを防げます。
Option Explicit

▶②データ型を意識して設計する
- 数値なのか
- 文字列なのか
- 配列なのか
を意識するだけでエラーは大幅に減ります。
▶③入力値のチェックを行う
セルの値をそのまま数値型の変数に代入すると、
文字列やエラー値が入っていた場合に、代入の時点でエラー13が発生することがあります。
そのため、まずはVariant型で値を受け取ってからチェックするのが安全です。
▼NG例(エラーが出やすい)
Dim num As Long
num = Range("A1").Value ' ←ここでエラーになる可能性あり
▼OK例(安全な書き方)
Sub Sample()
Dim cellValue As Variant
Dim num As Long
cellValue = Range("A1").Value
If IsError(cellValue) Then
'対象の値がエラー値#NAなどの場合
MsgBox "A1にエラー値が入っています。"
ElseIf IsNumeric(cellValue) Then
'対象の値が数値だった場合
num = CLng(cellValue)
Range("A2").Value = num * 2
Else
'対象の値が数値でなかった場合※文字列など
MsgBox "A1には数値を入力してください。"
End If
End Sub
ポイント
- いきなりLong型などに代入しない
- まずVariantで受ける
- IsNumericやIsErrorでチェックしてから変換する
このようなチェックを入れることで、
安全なコードになります。
VBAでエラーに悩んでいる方へ
「エラーの原因は分かったけど、そもそもVBAが難しい…」
と感じていませんか?
VBAはポイントを押さえて順番に学べば、独学でもしっかり身につきます。
▼初心者向けに、マクロの学習手順をまとめた記事はこちら
▶ VBAを独学で学ぶには?初心者でもわかるマクロの勉強手順とおすすめ教材
エラー対処とあわせて学ぶことで、
「動くマクロ」を自分で作れるようになります。
▶挫折しにくくなるので、初心者の方ほどおすすめです。
まとめ:実行時エラー13は「型のズレ」が原因
実行時エラー13「型が一致しません」は、
データ型の違いによって発生するエラーです。
特に多い原因は次の通りです。
- 変数の型と代入する値が一致していない
- セルの値が想定と違う(文字列・エラー値など)
- RangeとValueの違いを混同している
- 配列や関数の戻り値の扱いミス
このエラーを防ぐためには、
✔ データ型を意識する
✔ 事前に値をチェックする
✔ Debug.Printなどで中身を確認する
といった基本を押さえることが重要です。
▶「どの型のデータを扱っているか?」を意識するだけで、エラーは大幅に減ります。
よくある質問(FAQ)
数値と文字列など、異なる型をそのまま扱おうとするとエラーになります。
多くの場合、セルの中身が変わったことが原因です。
空白・文字列・エラー値(#N/Aなど)が入ることで、想定していた型とズレてエラーが発生します。
※なお、空白セルはエラーにならず「0」として扱われることがあるため、
気付かないまま誤った結果になるケースもあります。
特に配列や関数、別モジュールとの連携処理など、コードが複雑になるほど発生しやすくなります。
【関連記事】
- VBAの実行時エラーとは?原因と対処法まとめ|よくあるエラー一覧も解説
- VBA 実行時エラー9の原因と直し方|「インデックスが有効範囲にありません」を初心者向けに解説
- Excel VBAでエラー400が発生する原因と対処法|マクロ初心者でもわかる解決手順
- Excel VBAのエラー処理とは?On Errorの使い方とエラーハンドリングの基本を解説
※外部リンク※
※参考書籍 (PR)※
※本ボックスにはアフィリエイトリンク(PR)が含まれます。
くわしくは プライバシーポリシー へ。
