【VBA実行時エラー13】型が一致しません|原因と対処法を初心者向けに解説!

スポンサードリンク
VBA

この記事を読んでわかること

  • 「型が一致しません」というエラーが発生した原因と対処法がわかる
  • 原因を特定する方法を学べる
  • エラーを繰り返さないコツを知れる

※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。

-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします

スポンサードリンク

実行時エラー13「型が一致しません」はどんなエラー?

これは、異なる型の変数を無理に使おうとしたときに発生するエラーです。
例えば「Integer型(整数型)」の変数に「文字列」を代入しようとした場合などに発生します。

VBAの変数には「型」という概念があり、対応した値しか代入することができません。

  • String型(文字列型):文字列のみ(例:abc、あいう、漢字など)
  • Integer型(整数型):整数のみ
  • Double型(少数点数型):小数点が入った数値のみ(例:0.5、1.0など)
  • Date型(日付型):日付のみ
  • Object型(オブジェクト型):セルやシートなど

「型が一致しません」というエラーは、その概念に反する処理をしようとしたということになります。

では、具体的に「型が一致しません」というエラーが発生する原因と対処法を見ていきましょう。

スポンサードリンク

実行時エラー13「型が一致しません」のよくある原因と対処法

このエラーが発生する主な原因は以下の2つです。

  • 違う型の値を変数(配列)に代入
  • 違う型のデータを同時に扱う

違う型の値を変数(配列)に代入

前項で例に挙げたように、違う型の変数に値を代入しようとした場合、「型が一致しません」というエラーが発生します。
下記のVBAコードを見てください。

Sub 型違い1()
    Dim num As Integer ' Integer型(整数型)の変数を宣言
    num = "Utatane" ' 型違い(Integer型に文字列を代入)
    Debug.Print num
End Sub

「Integer型」で宣言した変数に「文字列」を代入しようとしたため、下図のように「型が一致しません」というエラーが発生しました。

型が一致しません

変数の型と代入しようとする値を再確認しましょう。

主な対処法としては以下の2つが考えられます。

  • 宣言を修正する
  • Variant型を使う

1つ目は値に合わせて変数の型を修正するという方法です。
今回の例では、変数を「String型」として宣言することで解決します。

Sub 型違い対処()
    Dim num As String ' String型(文字列型)の変数を宣言
    num = "Utatane" ' 型一致
    Debug.Print num
End Sub

2つ目は、Variant型を使うという方法です。
Variant型とは、数値や文字列など、どんな値でも代入できる変数の型です。

Sub 型違い対処()
    Dim num As Variant ' Variant型(何でも型)の変数を宣言
    num = "Utatane" ' 型一致
    Debug.Print num
End Sub

Variant型は値を選ばないというのが便利な点です。
配列に適用した場合はもっと便利で、各要素に「文字列」「数値」「日付」など、違う型の値を代入することができます。
詳細は下記記事をご参考ください。

しかしながら、便利な反面デメリットや注意点もありますので、上記記事でご確認ください。

違う型のデータを同時に扱う

型に対応した値を入れたとしても、扱い方が間違っていると結果は同じです。
下記のVBAコードを見てください。

Sub 型違い2()
    Dim num As Integer ' Integer型(整数型)の変数を宣言
    num = 1
    Dim name As String ' String型(文字列型)の変数を宣言
    name = "Utatane"
    Debug.Print num + name
End Sub

「Integer型」と「String型」の変数を作成し、それぞれに値を代入しました。
双方の変数を連結して「1Utatane」にしようとしたところ「型が一致しません」というエラーが発生しました。

型が一致しません

VBAで「+」を使って連結する場合、変数の型が違うとエラーが発生します。
主な対処法は以下の2つです。

  • 「&」を使用する
  • 「型変換」する関数を使う

「+」ではなく「&」を使用することで、型違いの変数どうしを連結できます。

Sub 型違い2対処1()
    Dim num As Integer ' Integer型(整数型)の変数を宣言
    num = 1
    Dim name As String ' String型(文字列型)の変数を宣言
    name = "Utatane"
    Debug.Print num & name
End Sub
実行結果

どうしても「+」を使いたい場合は、型変換をして、「num」を「String型」にする必要があります。

Sub 型違い2対処2()
    Dim num As Integer ' Integer型(整数型)の変数を宣言
    num = 1
    Dim name As String ' String型(文字列型)の変数を宣言
    name = "Utatane"
    Debug.Print CStr(num) + name ' 型変換
End Sub

6行目の「CStr」が型変換です。
これで変数「num」が「String型」に変換され、変数内の値が連結できます。

型変換できる関数

  • CStr:String型に変換する
  • CInt:Integer型に変換する
  • CDbl:Bouble型(浮動小数点数型)に変換する
  • CBool:Bool型(真or偽)に変換する

※型変換できない場合もあります(文字列が入った変数をInteger型にするなど)

スポンサードリンク

Variant型でもエラーが発生するの?

前項で紹介したVariant型でも「型が一致しません」というエラーが発生する可能性があります。
下記のVBAコードを見てください。

Sub 型違い3()
    Dim num1 As Variant ' Variant型(何でも型)の変数を宣言
    num1 = 1
    Dim num2 As Variant ' Variant型(何でも型)の変数を宣言
    num2 = "Utatane"
    Debug.Print num1 + num2
End Sub

Variant型の変数を2つ作り、片方に数値、片方に文字列を代入しました。
それぞれを計算しようとしたところ、「型が一致しません」というエラーが発生しました。

型が一致しません

同じVariant型でも型が一定というわけではなく、内部的な型が存在します。
代入された値によって内部の型は変わっていくため、このようなエラーが発生します。

セルの値を取得して計算しようとした際に、このようになる場合があります。
理屈はわかっていても、原因を特定するのに苦労することがあるかと思います。
次項で原因を特定するためのコツを紹介いたします。

スポンサードリンク

原因を特定するためのコツ

今回紹介するのは以下の3つです。

  • デバッグ
  • Debug.Print(変数内の値を出力)
  • 型確認

デバッグ

まず1つ目はデバッグです。

型が一致しません

エラーが発生した際、「デバッグ」というボタンをクリックしてみてください。
すると、エラーの原因となった行が黄色くマーキングされます。

該当箇所

まずは該当する行か、その直前のコードをよく見てみましょう。

Debug.Print(変数内の値を出力)

2つ目は「Debug.Print」です。
「Debug.Print」は変数の中身を確認できる便利な機能です。
Variant型の変数を扱う場合、どの時点でどんな値が入っているのかを確認することで、原因の特定につながります。
詳細は下記記事をご参考ください。

型確認

3つ目は「型確認」です。
「TypeName」関数を使用することで、変数の型を確認することができます。

前項で少し触れましたが、Variant型でも型が一定というわけではなく、内部的な型が存在します。
代入された値によって内部の型は変わっていきますので、型を確認してみましょう。

Sub 型確認1()
    Dim num As Variant ' Variant型(何でも型)の変数を宣言
    num = 1
    Debug.Print TypeName(num) ' 型確認1回目
    num = "Utatane"
    Debug.Print TypeName(num) ' 型確認2回目
End Sub

同じく「VarType」でも変数の型を確認できます。

Sub 型確認2()
    Dim num As Variant ' Variant型(何でも型)の変数を宣言
    num = 1
    Debug.Print VarType(num) ' 型の確認 2なのでInteger型
    num = "Utatane"
    Debug.Print VarType(num) ' 型の確認 8なのでString型
End Sub

【VarTypeの出力値と対応する型】

  • 0:Variant
  • 2:Integer
  • 5:Double
  • 7:Date
  • 8:String
  • 9:Object

数値として出力されるのが「VarType」関数の特徴です。

スポンサードリンク

エラーを繰り返さないために

原因と対処法がわかったら、あとはエラーを繰り返さないように処理するだけです。

If文を使って「String型」なら計算しないなど、型に応じた条件分岐をしてエラーを回避しましょう。

関連記事{条件分岐(If)

それが難しかったり面倒な場合は、強制的にエラーをスキップするという手もあります。
下記のVBAコードを見てください。

Sub エラースキップ()
    Dim num As Integer ' Integer型(整数型)の変数を宣言
    num = 1
    Dim name As String ' String型(文字列型)の変数を宣言
    name = "Utatane"
    On Error Resume Next
    Debug.Print num + name ' エラーが出てもスキップされる
    On Error GoTo 0
End Sub

6行目と8行目の「On Error」がエラースキップです。
これで7行目の処理にエラーが発生しても処理自体がスキップされます。
詳細は下記記事をご参考ください。

エラーの出現頻度を減らすことができれば、製作時間の短縮につながります。
しかしながら、プログラミングにエラーはつきものですので、発生しても大きく落胆せずにうまく付き合うことも大切です。

スポンサードリンク

最後に

VBA(Excelマクロ)で「型が一致しません」というエラーが発生した場合の原因と対処法について解説いたしました。

当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

最後までお読みいただき、ありがとうございました。がんばってください!

タイトルとURLをコピーしました