Excel VBAの実行時エラー13「型が一致しません」の原因と対処法|初心者向けに解説

Excel VBAの実行時エラー13「型が一致しません」の原因と対処法|初心者向けに解説

本記事には広告(PR)が含まれます。
くわしくは プライバシーポリシー をご確認ください。


Excelでマクロを実行したときに、

「実行時エラー13:型が一致しません」

と表示されて、困ったことはありませんか?

このエラーは、VBAを使い始めたばかりの方だけでなく、
ある程度慣れてきた方でもよく遭遇する“定番エラー”のひとつです。

特に、

  • 変数に代入する値を間違えたとき
  • セルの値が想定と違っていたとき
  • 関数や配列の扱いを誤ったとき

などに発生しやすく、「なぜエラーが出たのか分かりにくい」のが特徴です。

私自身も、変数が増えてきたタイミングや、
別モジュールとの連携処理を作っているときに何度もこのエラーに悩まされました。

この記事では、

  • 実行時エラー13「型が一致しません」の意味
  • よくある原因と具体的な対処法
  • エラーを防ぐためのポイント

を、初心者の方にも分かりやすく解説します。

「とりあえず動くコード」から一歩進んで、
エラーに強いマクロを作れるようになりましょう。


VBAの実行時エラー13「型が一致しません」とは?


実行時エラー13の意味

「型が一致しません」とは、
データの種類(型)が合っていない状態で処理をしようとしたときに発生するエラーです。

VBAでは、データにはそれぞれ「型(データ型)」があります。

たとえば、

  • 数値(Long、Double など)
  • 文字列(String)
  • 日付(Date)
  • オブジェクト(Range など)

といったように、扱うデータの種類が明確に決まっています。

しかし、これらの型が一致していない状態で処理を行うと、
VBAは「正しく処理できない」と判断し、エラー13が発生します。

たとえば、次のようなケースです。

Dim num As Long
num = "ABC"
このコードでは、
数値(Long型)の変数に文字列(”ABC”)を代入しようとしているため、
型が一致せずエラーになります。
VBAで実行時エラー13「型が一致しません」が表示されている画面
文字列「ABC」を数値型(Long)に代入しようとして、実行時エラー13が発生している例

どんなタイミングで発生するのか?

実行時エラー13は、主にマクロの実行中に発生します。

特に「値の代入」や「型変換」のタイミングで発生することが多いのが特徴です。

エラーが発生すると、次のようなダイアログが表示されます。

  • 「実行時エラー ’13’:型が一致しません」

この状態で「デバッグ」をクリックすると、
問題が発生しているコードの行が黄色で表示されます。

この黄色の行が、
エラーの原因となっている処理の場所です。

ただし注意点として、
表示された行そのものではなく、

  • その直前の処理
  • 代入している値の中身

に原因があるケースも多いため、
前後のコードもあわせて確認することが重要です。

VBAの実行時エラー画面でデバッグボタンを選択する画面
エラー発生時は「デバッグ」をクリックすると原因箇所を確認できる
VBAのコードでエラー発生箇所が黄色に表示されている画面
エラーの原因となっているコード行が黄色で表示される(デバッグ時)

よくあるエラー表示例

実際にエラー13が発生する、シンプルな例を見てみましょう。

Sub Sample()

 Dim num As Long
 num = Range("A1").Value

End Sub
このコードでは、セルA1の値を数値として取得していますが、
  • A1に文字列が入っている
  • A1にエラー値(#N/A など)が入っている

といった場合、型が一致せずエラーになることがあります。

セルA1に文字列が入力されている状態でVBA実行時エラー13が発生する例
セルの値が文字列の場合、数値型へ代入するとエラーになることがある

※なお、空白セルの場合はエラーにならず「0」として扱われることが多いため、注意が必要です。

このように、
**「見た目では問題なさそうでも、実際のデータ型が違う」**ことが原因で、
エラー13が発生するケースは非常に多いです。


実行時エラー13の原因と対処法まとめ

実行時エラー13は、原因のパターンがある程度決まっているエラーです。
ここでは、実務で特によくある原因と対処法をセットで解説します。


原因①:変数の型と代入する値が違う

もっとも基本的な原因が、
変数の型と代入する値の型が一致していないケースです。

Dim num As Long
num = "ABC" ' ←文字列を代入している

この場合、数値型(Long)に文字列を入れようとしているため、エラーになります。


▶対処方法

  • 変数の型を見直す
  • または、値を適切な型に変換する
Dim txt As String
txt = "ABC"
変数のデータ型をStringに変更してエラーを回避しているVBAコード例
代入する値に合わせて変数の型を変更することでエラーを防げる

もしくは、数値として扱いたい場合は変換します。

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
IsNumeric関数で入力値をチェックしエラーを防ぐVBAコード例
Variantで受けてから数値チェックを行うことでエラー13を防げる

補足:文字列の数字はエラーにならないこともある

VBAでは、「123」のような数値に変換できる文字列は、
自動的に数値として処理されることがあります。

Dim num As Long
num = "123" ' ←エラーにならない
文字列の数字でもVBAで計算が実行されている例
「123」のような文字列は自動変換され、数値として計算できる場合がある

ただし、

num = "ABC" ' ←エラーになる

のように、変換できない値の場合はエラーになります。

▶「変換できるかどうか」がポイントです


原因③:オブジェクトと値を混同している

VBAでは、オブジェクトと値は別物です。

Dim num As Long
num = Range("A1") ' ←.Valueがない

このコードでは、Rangeオブジェクトをそのまま代入しようとしているため、エラーになります。

Rangeオブジェクトをそのまま代入して実行時エラー13が発生しているVBAコード例
Rangeに.Valueを付けずに代入すると、オブジェクトとして扱われエラーになる

▶対処方法

必ず「値」を取得するようにします。

num = Range("A1").Value

原因④:配列や関数の戻り値の扱いミス

少し慣れてくると増えるのが、
配列や関数の戻り値によるエラーです。

たとえば、次のコードです。

Dim arr As Variant
arr = Range("A1:A10").Value

この場合、arrにはセルの値がまとめて格納されますが、
このときのデータは2次元配列として扱われます。

一見1列のデータに見えますが、内部的には

  • 行(縦方向)
  • 列(横方向)

の2つの要素を持つ配列になっています。

そのため、

MsgBox arr(1, 1)

のように、「行番号・列番号」の両方を指定する必要があります。

Rangeで取得したデータを2次元配列として扱うVBAコード例
複数セルを取得すると1列でも2次元配列になるため arr(行,列) で指定する
MsgBox arr(1)

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

配列を1次元として扱い実行時エラーが発生しているVBAコード例
2次元配列に対してarr(1)のように指定するとエラーになるため注意

ポイント

  • Rangeで複数セルを取得すると、1列でも2次元配列になる
  • arr(行, 列) の形で扱う

原因⑤:日付・数値の変換ミス

日付や数値は、見た目と内部データが違うことがあります。

Dim d As Date
d = "2024/13/01" ' ←存在しない日付

このような場合も、型が一致せずエラーになります。

存在しない日付をDate型に代入してエラー13が発生するVBAコード例
不正な日付(2024/13/01など)はDate型に変換できずエラーになる
日付エラーの原因箇所が黄色表示されているVBAデバッグ画面
デバッグでエラー行を確認すると、不正な日付が原因と分かる

▶対処方法

変換関数を使い、正しい形式かチェックします。

If IsDate(Range("A1").Value) Then
 d = CDate(Range("A1").Value)
Else
 MsgBox "日付の形式が正しくありません"
End If
IsDate関数で日付の形式をチェックしてエラーを防ぐVBAコード例
IsDateでチェックしてからCDateに変換することで安全に処理できる

デバッグで原因を特定する方法

エラー13は原因が分かりにくいため、
デバッグを使った確認が重要です。

基本は次の3つです。


▶①デバッグボタンで停止箇所を確認

エラー発生時に「デバッグ」を押すと、
該当行が黄色で表示されます。

VBAの実行時エラー画面でデバッグボタンを選択する画面
エラー発生時は「デバッグ」をクリックすると原因箇所を確認できる
VBAのコードでエラー発生箇所が黄色に表示されている画面
エラーの原因となっているコード行が黄色で表示される(デバッグ時)

▶②Debug.Printで値を確認

Debug.Printは、エラーの原因を調べるときによく使われる基本的なデバッグ方法です。

この機能を使うと、変数やセルの値をイミディエイトウィンドウに表示して確認できます。

もし意図とは異なる値が入っている場合は、代入している値や処理内容を見直しましょう。

Debug.Print Range("A1").Value
イミディエイトウィンドウにセルの値を表示して確認している画面
Debug.Printを使うと、実際の値を確認でき、原因特定に役立ちます。
補足:イミディエイトウィンドウの表示方法

Debug.Printで出力した内容は、「イミディエイトウィンドウ」に表示されます。

イミディエイトウィンドウは、次の方法で表示できます。

  • VBE画面で「Ctrl + G」を押す
  • メニュー「表示」→「イミディエイトウィンドウ」を選択

このウィンドウを使うことで、
変数の値や処理結果をその場で確認できるようになります。

VBAエディターの[表示]メニューから[イミディエイトウィンドウ]を開く操作画面
VBEの[表示]→[イミディエイトウィンドウ]で確認用のウィンドウを表示します(Ctrl + G)

▼デバッグ操作をもっと詳しく知りたい方はこちら
 マクロのステップインとは?初心者でもわかるVBAのデバッグ基本操作を解説


▶③変数の型を確認する

Debug.Print TypeName(Range("A1").Value)

→ 実際のデータ型をイミディエイトウィンドウで確認できます。

もし型が異なる場合は、変数のデータ型を見直しましょう。

TypeName関数で変数のデータ型を表示しているVBA画面
TypeNameでデータ型を確認することで型の不一致に気付きやすくなる

エラーを防ぐための3つのコツ(実務向け)

最後に、エラー13を未然に防ぐコツを紹介します。


▶①Option Explicitを使う

Option Explicitを使うことで、変数の宣言忘れやスペルミスを防げます。

Option Explicit
Option Explicitを設定した状態で未宣言の変数を使用しコンパイルエラー「変数が定義されていません」と表示されているVBA画面
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)

    VBAの「型が一致しません」とはどういう意味ですか?
    変数や値の「データの種類(型)」が一致していない状態で処理を行おうとしたときに発生するエラーです。
    数値と文字列など、異なる型をそのまま扱おうとするとエラーになります。

    今まで動いていたマクロで急にエラー13が出るのはなぜ?

    多くの場合、セルの中身が変わったことが原因です。

    空白・文字列・エラー値(#N/Aなど)が入ることで、想定していた型とズレてエラーが発生します。

    ※なお、空白セルはエラーにならず「0」として扱われることがあるため、
    気付かないまま誤った結果になるケースもあります。


    エラー13は初心者だけが出すミスですか?
    いいえ、中級者でもよく発生します。
    特に配列や関数、別モジュールとの連携処理など、コードが複雑になるほど発生しやすくなります。

    【関連記事】

    ※外部リンク※

     

      ※参考書籍 (PR)

       

      ※本ボックスにはアフィリエイトリンク(PR)が含まれます。
      くわしくは プライバシーポリシー へ。

      Excel VBAの実行時エラー13「型が一致しません」の原因と対処法|初心者向けに解説
      最新情報をチェックしよう!