IsObject関数について
VBAのIsObject関数は、指定した値や変数がオブジェクトであるかを判定する関数です。
これまでに紹介したIsNumeric関数やIsDate関数といった数値や日付を判定するものと比較すると一般的な作業では使用頻度はすくない印象ですので、VBAにはこういった関数があるといった感覚で知っておいてもらえたら幸いです。
なお、判定結果はほかのIs〇〇関数と同じく、真偽値(Boolean)となるため、TrueまたはFalseで返します。
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験
IsObject関数がつかえる場面
IsObject関数の利用が想定される場面では、以下のようなものがあります。
変数がオブジェクトであるかどうかの確認
指定された変数がオブジェクトであるかの判定を実行します。
オブジェクト変数の初期化前の確認
オブジェクト変数が初期化されているかの判定を実行します。
関数の戻り値がオブジェクトであるかの確認
関数でなんらかの処理された変数が初期化されているかの判定を実行します。
変数が特定のオブジェクト型であるかどうかの確認
指定されたオブジェクト変数が特定のオブジェクト型であるかの判定を実行します。
IsObject関数の使いかた
IsObject関数の構文と戻り値について紹介します。
IsObject関数の構文
構文
IsObject(値または変数)
※値または変数(expression)の指定は必須のため、省略した場合はエラーが発生します。
IsObject関数の判定結果について
IsObject関数の結果は真偽値(Boolean)となるため、TrueまたはFalseが返ります。
指定した値や変数がオブジェクトである場合はTrue、それ以外と判定された場合はFalseが返ってきます。
IsObject関数の結果の一覧
No | 判定する変数名 | 説明 | 判定結果 (True or False) |
---|---|---|---|
1 | Test_Object | Dim Test_Object As Objectで宣言した変数 | True |
2 | Test_Application | Dim Test_Application As Applicationで宣言した変数 | True |
3 | Test_Book | Dim Test_Book As Workbookで宣言した変数 | True |
4 | Test_Sheet | Dim Test_Sheet As Worksheetで宣言した変数 | True |
5 | Test_Range | Dim Test_Range As Rangeで宣言した変数 | True |
6 | Test_Shape | Dim Test_Shape As Shapeで宣言した変数 | True |
7 | Test_Integer | Dim Test_Integer As Integerで宣言した変数 | False |
8 | Test_Double | Dim Test_Double As Doubleで宣言した変数 | False |
9 | Test_Date | Dim Test_Date As Dateで宣言した変数 | False |
10 | Test_String | Dim Test_String As Stringで宣言した変数 | False |
11 | Test_Boolean | Dim Test_Boolean As Booleanで宣言した変数 | False |
12 | Test_Variant | Dim Test_Variant As Variantで宣言した変数 | False |
13 | Test_Dictionary | Dim Test_Dictionary As Objectで宣言した変数 Set Test_Dictionary = CreateObject(“Scripting.Dictionary”)をつけた辞書 |
True |
14 | Test_Collection | Dim Test_Collection As Collectionで宣言した変数 | True |
15 | Test_Class | Dim Test_Class As Class1で宣言した変数 | True |
IsObject関数をつかったサンプルマクロ
ここではIsObject関数をつかったマクロを紹介します。
IsObject関数で変数がオブジェクトであるかの判定
つぎのサンプルマクロは、IsObject関数をつかって宣言したオブジェクト型の変数がオブジェクトであるかをを判定します。結果の表示にはデバッグプリントを使用しています。
サンプルマクロのVBAコード
Option Explicit
Sub IsObject_macro_イ()
'オブジェクト変数を宣言する
Dim オブジェクト As Object
'IsObjectによる判定(実行結果はTrue or False)
Debug.Print IsObject(オブジェクト) 'True
End Sub
06行目
オブジェクト型変数としてオブジェクトを宣言します。
09行目
IsObject関数でオブジェクトがオブジェクトであるかを判定します。判定した結果はTrueまたはFalseで返され、イミディエイトウィンドウに表示します。
実行結果(イミディエイトウィンドウ)
IsObject関数でさまざなデータ型の変数がオブジェクトかどうか判定する
つぎのサンプルマクロは、IsObject関数でさまざまなデータ型の変数がオブジェクトであるかをを判定します。結果の表示にはデバッグプリントを使用しています。
サンプルマクロのVBAコード
Option Explicit
Sub IsObject_macro_ロ()
Dim Test_Object As Object 'オブジェクト
Dim Test_Application As Application 'アプリケーション
Dim Test_Book As Workbook 'ワークブック
Dim Test_Sheet As Worksheet 'ワークシート
Dim Test_Range As Range 'セル
Dim Test_Shape As Shape '図
Dim Test_Integer As Integer '数値
Dim Test_Double As Double '小数
Dim Test_Date As Date '日付
Dim Test_String As String '文字列
Dim Test_Boolean As Boolean '真偽
Dim Test_Variant As Variant 'バリアント
'辞書
Dim Test_Dictionary As Object
Set Test_Dictionary = CreateObject("Scripting.Dictionary")
'コレクション
Dim Test_Collection As Collection
Set Test_Collection = New Collection
'クラス
Dim Test_Class As Class1
Set Test_Class = New Class1
'IsObject関数をくり返し処理で実行するためにコレクションを宣言
Dim M_Collection As Collection
Set M_Collection = New Collection
'宣言したコレクションの要素を追加する
M_Collection.Add Item:=Test_Object, Key:="オブジェクト"
M_Collection.Add Item:=Test_Application, Key:="アプリケーション"
M_Collection.Add Item:=Test_Book, Key:="ブック"
M_Collection.Add Item:=Test_Sheet, Key:="ワークシート"
M_Collection.Add Item:=Test_Range, Key:="セル"
M_Collection.Add Item:=Test_Shape, Key:="図形"
M_Collection.Add Item:=Test_Integer, Key:="数値"
M_Collection.Add Item:=Test_Double, Key:="小数"
M_Collection.Add Item:=Test_Date, Key:="日付"
M_Collection.Add Item:=Test_String, Key:="文字列"
M_Collection.Add Item:=Test_Boolean, Key:="真偽"
M_Collection.Add Item:=Test_Variant, Key:="バリアント"
M_Collection.Add Item:=Test_Dictionary, Key:="辞書"
M_Collection.Add Item:=Test_Collection, Key:="コレクション"
M_Collection.Add Item:=Test_Class, Key:="クラス"
'くり返し処理用の変数を宣言する
Dim X As Variant
'コレクションのすべての要素がオブジェクト変数かの判定
For Each X In M_Collection
Debug.Print IsObject(X)
Next X
End Sub
06行目から17行目
さまざまなデータ型で変数を宣言します。
20行目と21行目
DictionaryオブジェクトであるTest_Dictionaryを宣言します。
24行目と25行目
コレクションオブジェクトであるTest_Collectionを宣言します。
28行目と29行目
クラスオブジェクトであるTest_Classを宣言します。
33行目から34行目
コレクションオブジェクトであるM_Collectionを宣言します。
(※こちらのコレクションはくり返し処理を指定するために宣言しています。)
37行目から51行目
コレクションオブジェクトのM_Collectionに各変数を追加しています。
57行目から59行目
ForEachステートメントでくり返しを指定しています。コレクションオブジェクトのM_Collectionに追加された要素すべてに対してIsObject関数をつかって判定しています。判定した結果はイミディエイトウィンドウに表示します。
実行結果(イミディエイトウィンドウ)
True
True
True
True
True
False
False
False
False
False
False
True
True
True
オブジェクト、アプリケーション、ブック、シート、セル、図形がTrueとして判定されており、数値からバリアントまではFalseです。また、辞書(Dictionary)やコレクション(Collection)、クラス(Class)などもTrueと判定されます。
実行結果をまとめると以下の表のとおりです。
変数名 | データ型 | True | False |
---|---|---|---|
Test_Object | Object | 〇 | – |
Test_Application | Application | 〇 | – |
Test_Book | Workbook | 〇 | – |
Test_Sheet | Worksheet | 〇 | – |
Test_Range | Range | 〇 | – |
Test_Shape | Shape | 〇 | – |
Test_Integer | Integer | – | 〇 |
Test_Double | Double | – | 〇 |
Test_Date | Date | – | 〇 |
Test_String | String | – | 〇 |
Test_Boolean | Boolean | – | 〇 |
Test_Variant | Variant | – | 〇 |
Test_Dictionary | ディクショナリ | 〇 | – |
Test_Collection | コレクション | 〇 | – |
Test_Class | クラス | 〇 | – |
こちらのサンプルマクロで利用している、コレクションやForEachをつかったくり返し処理が以前の記事でも取りあつかっていますので、あわせてご覧ください。
コレクションの宣言方法やプロパティやメソッドの使い方については以下のリンクをクリック
オブジェクトの要素に対してくり返し処理するマクロを作りたいなら以下のリンクをクリック
IsObject関数でオブジェクト変数の初期化前の確認
バリアント型の変数の場合は、オブジェクトが参照されているときのほか、Nothingの場合もTrueとなる点はおぼえておきましょう。この性質を応用することでオブジェクト変数として初期化しているかどうかの判定もできます。
サンプルマクロのVBAコード
Option Explicit
Sub IsObject_macro_ハ()
'バリアント変数の宣言
Dim Test_Variant As Variant
'SetステートメントをつかってNothingにする
Set Test_Variant = Nothing 'コメントアウトすると結果は変わります。
'IsObjectをつかってオブジェクト変数か判定する
If IsObject(Test_Variant) Then
Debug.Print "Test_Variantは初期化されたオブジェクト変数です。"
Else
Debug.Print "Test_Variantはオブジェクト変数として初期化されていません。"
End If
End Sub
06行目
バリアント型の変数としてTest_Variantを宣言します。
09行目
Test_VariantをNothingを代入します。
(※この行をコメントアウトにすると実行結果が変化します。)
13行目から17行目
IsObject関数でTest_Variantを判定します。判定の結果によってそのあとの処理が変化します。
実行結果(イミディエイトウィンドウ)
IsObject関数で関数の戻り値がオブジェクトであるかの確認
つぎのサンプルマクロでは、Functionプロシージャの戻り値をIsObject関数で判定しています。
サンプルマクロのVBAコード
Option Explicit
Function IsObject_macro_ニF() As Object
Dim myobj As Object
Set IsObject_macro_ニF = myobj
End Function
Sub IsObject_macro_ニ()
Dim result As Object
Set result = IsObject_macro_ニF()
If IsObject(result) Then
Debug.Print "変数はオブジェクト変数として初期化されています。"
Else
Debug.Print "変数はオブジェクト変数ではありません。"
End If
End Sub
03行目
FunctionプロシージャとしてIsObject_macro_ニFを作成しています。戻り値はオブジェクト型に指定しています。
05行目
オブジェクト型の変数としてmyobjを宣言します。
06行目
Functionプロシージャの戻り値にmyobjに代入します。
12行目と13行目
オブジェクト型の変数としてresultを宣言します。FunctionプロシージャのIsObject_macro_ニFを呼び出して処理の結果をresultに代入します。
15行目と21行目
IsObject関数でresultを判定します。判定の結果によってそのあとの処理が変化します。
実行結果はイミディエイトウィンドウに以下のように表示されます。
実行結果(イミディエイトウィンドウ)
ファンクションプロシージャのなかでなにかの処理を実行したことで、オブジェクト変数であるかの判定をする必要がある場合はこういったマクロが使えるでしょう。
IsObject関数で変数が特定のオブジェクト型であるかどうかの確認
つぎのマクロでは、コレクション、ディクショナリ、クラスの3つの変数がオブジェクト変数かどうかを判定します。3つのオブジェクトの判定をくり返し処理で実行できるようにしています。
サンプルマクロのVBAコード
Option Explicit
Sub IsObject_macroホ()
'Collectionオブジェクトの宣言
Dim myCollection As Collection
Set myCollection = New Collection
'Dictionaryオブジェクトの宣言
Dim myDictionary As Object
Set myDictionary = CreateObject("Scripting.Dictionary")
'Classオブジェクトの宣言
Dim myClass As Class1
Set myClass = New Class1
'Collectionオブジェクトへの要素の追加
myCollection.Add Item:=myCollection, Key:="コレクション"
myCollection.Add Item:=myDictionary, Key:="ディクショナリ"
myCollection.Add Item:=myClass, Key:="クラス"
'くり返し用のバリアント型変数の宣言
Dim Var As Variant
'くり返し処理
For Each Var In myCollection
'IsObject関数による判定
If IsObject(Var) Then
'TypeName関数を利用し、オブジェクト変数名を変数に代入する
Dim myobjname As String: myobjname = TypeName(Var)
'分岐処理
Select Case True
Case myobjname = "Collection"
Debug.Print "Collectionオブジェクトです。"
Case myobjname = "Dictionary"
Debug.Print "Dictionaryオブジェクトです。"
Case myobjname Like "Class#"
Debug.Print "Classオブジェクトです。"
Case Else
Debug.Print "どれにも当てはまらないオブジェクトです。"
End Select
Else
Debug.Print "オブジェクト変数ではありません。"
End If
Next Var
End Sub
06行目と07行目
コレクションオブジェクトのmyCollectionを宣言します。
10行目と11行目
ディクショナリオブジェクトのmyDictionaryを宣言します。
14行目と15行目
クラスオブジェクトのmyClassを宣言します。
18行目と20行目
コレクションオブジェクトのmyCollectionに宣言したオブジェクトを追加します。追加するときにそれぞれのオブジェクト名をKeyに指定しています。
26行目
ForEachステートメントを利用してコレクションオブジェクトのmyCollectionの要素すべてにくり返しを指定しています。
29行目
IsObject関数を利用してmyCollectionの要素がオブジェクトであるか判定します。取り出された要素(Var)がオブジェクトだと判定されたときとそうでないときで処理を分岐しています。
32行目
変数myobjnameを宣言します。宣言したmyobjnameにTypeName関数で取得した文字列を代入します。
(※TypeName関数は引数に指定した変数のデータ型の名前を文字列で返します。)
35行目
TypeName関数から取得できる文字列によって、そのあとの処理を分岐します。こちらではSelect Caseステートメントでmyobjnameが”Collection”か”Dictionary”か”Class#”かによって処理をわけています。またこれらのいずれにも当てはまらない場合はElseの処理
Classオブジェクトの型名は、クラスモジュールのオブジェクト名です。
こちらは変更しない限りClass1、Class2、Class3…と命名されていきますが、任意で変更した場合はそちらにあわせて判定式を書きかえる必要があります。
実行結果は以下のとおりです。
実行結果(イミディエイトウィンドウ)
Dictionaryオブジェクトです。
Classオブジェクトです。
条件分岐については2段階になっています。まずは、IFステートメントをつかってIsObject関数によって、指定された変数がオブジェクト変数かどうかの判定を実行しています。判定の結果がTrueであれば、今度はどういったオブジェクトであるかを判定する処理を実行します。

どんなオブジェクト変数であるかは以下の方法を使っているよ。
IsObject関数のような値や変数を判定する関数はほかにもある
VBAには数値以外にも値や変数を判定する関数があります。関数名をクリックするとそちらの記事にジャンプします。
値や変数が配列であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が数値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が日付であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が初期値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数がエラーであるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数にNullが含まれるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント