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で「型が一致しません。」のエラーが出たときの対処方法について説明をしました。よく出くわすエラーですので対処方法をしっかり覚えておきたいですね。
コメントを残す