【VBA】実行時エラー’13’「型が一致しません。」が出た場合の確認箇所と対処方法

VBAのマクロを実行すると「型が一致しません。」のエラーを見る機会が多いかと思います。
原因は変数に間違った型の値を入れてしまった場合に発生しますが、コードをみても誤った箇所がわからず途方に暮れる場合もあるのではないでしょうか。

今回は、

「型が一致しません。」のエラーの原因とサクっと対処する方法

についてまとめます!

ケース①:宣言した型と異なる形式の値をいれた場合

宣言した型と異なる形式の値をいれた場合にエラーが発生します。
よくあるのは整数のInteger型にString型の文字列を入れてしまうケースでしょうか。

サンプルは整数のLong型で宣言した変数numに文字列を代入しています。

Sub エラーサンプル①()

    Dim num As Long
    
    num = "test"

End Sub

実行すると、中断されますね。

ケース②:日付型指定の変数に存在しない日付や誤った形式の値をいれた場合

日付型指定の変数に存在しない日付や誤った形式の値をいれた場合にエラーが発生します。

例えばうるう年以外の2021/2/29などカレンダーに存在しない値が入るケースがある場合が該当します。

サンプルは整数のLong型で宣言した変数numに文字列を代入しています。

Sub エラーサンプル()
    Debug.Print CDate("2021/2/29")
End Sub

実行すると、エラーが表示されますね。

うるう年の”2020/2/29″に修正すると、

Sub エラーサンプル()
    Debug.Print CDate("2020/2/29")
End Sub

エラーはでませんね。

ケース③:宣言したオブジェクトがコレクションだった場合

オブジェクトを扱う場合に、コレクションとして宣言していたがItemだったというパターンとなります。
コレクションは複数のItemが格納されている集合体ですので、Item単体が来た場合は形式が異なると判断されるということになります。

サンプルは
Dim olItem As Outlook.Items
をコレクションで宣言していますが、
Set olItem = olConItems.Find
Findメソッドは単体のItemで返すので形式が異なるといったことになります。

Sub エラーサンプル③()

    'Outlook用の定義
    Dim olApp As Outlook.Application
    Dim olNamespace As Outlook.Namespace
    Dim olFolder As Folder
    Dim olConItems As Outlook.Items
    Dim olItem As Outlook.Items

    'Outlookオブジェクトを設定し、MAPI名前空間を介してOutlookの予定表を取得します。
    Set olApp = New Outlook.Application
    Set olNamespace = olApp.GetNamespace("MAPI")
    Set olFolder = olNamespace.GetDefaultFolder(olFolderCalendar)
    Set olConItems = olFolder.Items

    strStart = Format("2019/09/16", "yyyy/mm/dd") '抽出するスケジュールの開始日を指定
    strEnd = Format("2019/09/17", "yyyy/mm/dd")  '抽出するスケジュールの終了日を指定
    strEnd = DateAdd("d", 1, strEnd)   ' 1日追加
    
    'Findメソッドで期間指定して抽出するスケジュールを絞り込む
    Set olItem = olConItems.Find("[End] < """ & strEnd & """ AND [Start] >= """ & strStart & """")
    Debug.Print olItem.Subject
    
End Sub

実行すると、中断されますね。

ケース④:宣言したオブジェクトタイプ以外のものがSetされた場合

宣言したオブジェクトタイプ以外のものがSetされた場合にエラーが発生します。

オブジェクトは様々なタイプを宣言することができますが、
そのタイプに合ったオブジェクトをsetする必要があります。

サンプルではOutlook連絡先のタイプを宣言していますが、Outlook予定表のオブジェクトを設定するケースとなります。

具体的には、以下で連絡先のタイプを宣言していますが、
Dim olItem As ContactItem

予定表オブジェクトをSetしているためエラーとなります。
Set olItem = olConItems.Find

Sub エラーサンプル④()

    'Outlook用の定義
    Dim olApp As Outlook.Application
    Dim olNamespace As Outlook.Namespace
    Dim olFolder As Folder
    Dim olConItems As Outlook.Items
    '連絡先のタイプを指定してしまっている。
    Dim olItem As ContactItem

    'Outlookオブジェクトを設定し、MAPI名前空間を介してOutlookの予定表を取得します。
    Set olApp = New Outlook.Application
    Set olNamespace = olApp.GetNamespace("MAPI")
    'Outlookカレンダーを取得します。
    Set olFolder = olNamespace.GetDefaultFolder(olFolderCalendar)
    Set olConItems = olFolder.Items

    strStart = Format("2019/09/16", "yyyy/mm/dd") '抽出するスケジュールの開始日を指定
    strEnd = Format("2019/09/17", "yyyy/mm/dd")  '抽出するスケジュールの終了日を指定
    strEnd = DateAdd("d", 1, strEnd)   ' 1日追加
    
    'Findメソッドで期間指定して抽出するスケジュールを絞り込む
    Set olItem = olConItems.Find("[End] < """ & strEnd & """ AND [Start] >= """ & strStart & """")
    Debug.Print olItem.Subject
    
End Sub

エラーとなりますね。

エラー「型が一致しません。」の対処法

エラー「型が一致しません。」の対処法について説明します。

「型が一致しません。」のエラーが出た場合は慌てずにコードをよく見て上記の原因でないか確認をしてみます。

けれど確認が面倒だったり、解決できず埒が明かない場合があるかと思います。
その時は、「Dim」宣言や「As」以降を外し、宣言した形式をいったん無視して実行してみましょう。

VBAの特徴として、宣言がなくても入力された値の形式を自動で解釈される機能がありますのでその機能を利用するという訳です。

いったん処理が正常に完了するまで続け、デバッグして、オブジェクトのタイプを確認し、宣言を適正なものに変えていきます。

サンプルでは
Dim olItem
としてみます。

Sub エラーサンプル②()

    'Outlook用の定義
    Dim olApp As Outlook.Application
    Dim olNamespace As Outlook.Namespace
    Dim olFolder As Folder
    Dim olConItems As Outlook.Items
  '「As」以降をはずし成り行きにします。
    Dim olItem 

    'Outlookオブジェクトを設定し、MAPI名前空間を介してOutlookの予定表を取得します。
    Set olApp = New Outlook.Application
    Set olNamespace = olApp.GetNamespace("MAPI")
    Set olFolder = olNamespace.GetDefaultFolder(olFolderCalendar)
    Set olConItems = olFolder.Items

    strStart = Format("2019/09/16", "yyyy/mm/dd") '抽出するスケジュールの開始日を指定
    strEnd = Format("2019/09/17", "yyyy/mm/dd")  '抽出するスケジュールの終了日を指定
    strEnd = DateAdd("d", 1, strEnd)   ' 1日追加
    
    'Findメソッドで期間指定して抽出するスケジュールを絞り込む
    Set olItem = olConItems.Find("[End] < """ & strEnd & """ AND [Start] >= """ & strStart & """")
    Debug.Print olItem.Subject
    
End Sub

はい、無事成功しました。

なので、olItemの形式が異なるということがわかりますね。

予定表の形式に直しておきましょう。

Dim olItem As AppointmentItem

これで大丈夫です。

また、どんな形式を指定してよいかわからないときは、Setするのはオブジェクトなので、とりあえず汎用的なOujectで指定するのもありです。
Dim olItem As Object

さいごに

今回は、

「型が一致しません。」のエラーの原因とサクっと対処する方法

についてまとめました。

よく出くわすエラーですので対処方法をしっかり覚えておきたいですね。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。



タカヒロ

タカヒロ
実質無料で読めるExcelVBA本についてまとめました。
もしVBA本購入を検討されていたら、どれだけお得か確かめてみてください。

【¥0】実質無料のExcelVBAおすすめ本25選!初級~中級まで網羅!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です