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
さいごに
今回は、
についてまとめました。
よく出くわすエラーですので対処方法をしっかり覚えておきたいですね。
コメントを残す