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

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

そんな私も頻発エラーランクTOP3に入るぐらいよく出くわし、悩まされます。

今回はそんな「型が一致しません。」のエラーの原因とサクっと対処する方法をご紹介したいと思います。


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

よくあるのは整数のInteger型にString型の文字列を入れてしまうケースですね。

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

Sub エラーサンプル①()

    Dim num As Long
    
    num = "test"

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された場合

オブジェクトも様々なタイプがあります。
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")
    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で宣言した形式をいったん外して実行してみましょう。

VBAの特徴として、宣言がなくても入力された値の形式を自動で解釈される機能がありますのでその機能を利用して、いったん処理が正常に完了できるか、途中であれば「型が一致しません。」のエラーが出ないところまで確認をします。

そして徐々に宣言を加えていってエラーを再発させ、問題の箇所を特定していきます。

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

Sub エラーサンプル②()

    'Outlook用の定義
    Dim olApp As Outlook.Application
    Dim olNamespace As Outlook.Namespace
    Dim olFolder As Folder
    Dim olConItems As Outlook.Items
    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


さいごに

今回は、VBAで「型が一致しません。」のエラーが出たときの対処方法について説明をしました。よく出くわすエラーですので対処方法をしっかり覚えておきたいですね。

コメントを残す

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