※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。当ブログを経由しての商品の購入や、サービス申し込みが発生すると、それらの提携企業からの成果報酬を受けとる場合があります。

VBA|IsObject関数で値や変数がオブジェクトかどうかを判定するマクロをつくる

エクセルVBAのIsObject関数のトップ画像

IsObject関数について

VBAのIsObject関数は、指定した値や変数がオブジェクトであるかを判定する関数です。

これまでに紹介したIsNumeric関数IsDate関数といった数値や日付を判定するものと比較すると一般的な作業では使用頻度はすくない印象ですので、VBAにはこういった関数があるといった感覚で知っておいてもらえたら幸いです。

なお、判定結果はほかのIs〇〇関数と同じく、真偽値(Boolean)となるため、TrueまたはFalseで返します。


独学でプログラミングをはじめてみたけど、このままの学習方法に不安を感じているのなら、
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験

IsObject関数がつかえる場面

IsObject関数の利用が想定される場面では、以下のようなものがあります。

変数がオブジェクトであるかどうかの確認

 指定された変数がオブジェクトであるかの判定を実行します。

オブジェクト変数の初期化前の確認

 オブジェクト変数が初期化されているかの判定を実行します。

関数の戻り値がオブジェクトであるかの確認

 関数でなんらかの処理された変数が初期化されているかの判定を実行します。

変数が特定のオブジェクト型であるかどうかの確認

 指定されたオブジェクト変数が特定のオブジェクト型であるかの判定を実行します。

IsObject関数の使いかた

IsObject関数の構文と戻り値について紹介します。

IsObject関数の構文

IsObject(値または変数)

※値または変数(expression)の指定は必須のため、省略した場合はエラーが発生します。

IsObject関数の判定結果について

IsObject関数の結果は真偽値(Boolean)となるため、TrueまたはFalseが返ります。

指定した値や変数がオブジェクトである場合はTrueそれ以外と判定された場合はFalseが返ってきます。

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
※すべての変数は宣言した状態であり、値の代入はしていない状態です。
VBAにすこしなれてきたステップアップにおすすめです♪

IsObject関数をつかったサンプルマクロ

ここではIsObject関数をつかったマクロを紹介します。

IsObject関数で変数がオブジェクトであるかの判定

つぎのサンプルマクロは、IsObject関数をつかって宣言したオブジェクト型の変数がオブジェクトであるかをを判定します。結果の表示にはデバッグプリントを使用しています。

  
Option Explicit

Sub IsObject_macro_イ()
    
    'オブジェクト変数を宣言する
    Dim オブジェクト As Object
        
    'IsObjectによる判定(実行結果はTrue or False)
    Debug.Print IsObject(オブジェクト) 'True
    
End Sub

06行目

オブジェクト型変数としてオブジェクトを宣言します。

09行目

IsObject関数でオブジェクトがオブジェクトであるかを判定します。判定した結果はTrueまたはFalseで返され、イミディエイトウィンドウに表示します。

True

IsObject関数でさまざなデータ型の変数がオブジェクトかどうか判定する

つぎのサンプルマクロは、IsObject関数でさまざまなデータ型の変数がオブジェクトであるかをを判定します。結果の表示にはデバッグプリントを使用しています。

  
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
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 クラス
※実行結果は、前章の”IsObject関数の結果の一覧”の表と同じものです。

こちらのサンプルマクロで利用している、コレクションやForEachをつかったくり返し処理が以前の記事でも取りあつかっていますので、あわせてご覧ください。

コレクションの宣言方法やプロパティやメソッドの使い方については以下のリンクをクリック

\コレクションについてはコチラ/

オブジェクトの要素に対してくり返し処理するマクロを作りたいなら以下のリンクをクリック

\ForEacnのくり返し処理についてはコチラ/

IsObject関数でオブジェクト変数の初期化前の確認

バリアント型の変数の場合は、オブジェクトが参照されているときのほか、Nothingの場合もTrueとなる点はおぼえておきましょう。この性質を応用することでオブジェクト変数として初期化しているかどうかの判定もできます。

  
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を判定します。判定の結果によってそのあとの処理が変化します。

Test_Variantは初期化されたオブジェクト変数です。

IsObject関数で関数の戻り値がオブジェクトであるかの確認

つぎのサンプルマクロでは、Functionプロシージャの戻り値をIsObject関数で判定しています。

  
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つのオブジェクトの判定をくり返し処理で実行できるようにしています。

  
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…と命名されていきますが、任意で変更した場合はそちらにあわせて判定式を書きかえる必要があります。

実行結果は以下のとおりです。

Collectionオブジェクトです。
Dictionaryオブジェクトです。
Classオブジェクトです。

条件分岐については2段階になっています。まずは、IFステートメントをつかってIsObject関数によって、指定された変数がオブジェクト変数かどうかの判定を実行しています。判定の結果がTrueであれば、今度はどういったオブジェクトであるかを判定する処理を実行します。

どんなオブジェクト変数であるかは以下の方法を使っているよ。

\複数の分岐をするマクロならこちらもおすすめ/

IsObject関数のような値や変数を判定する関数はほかにもある

VBAには数値以外にも値や変数を判定する関数があります。関数名をクリックするとそちらの記事にジャンプします。

IsArray関数

 値や変数が配列であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsNumeric関数

 値や変数が数値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsDate関数

 値や変数が日付であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsEmpty関数

 値や変数が初期値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsError関数

 値や変数がエラーであるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsNull関数

 値や変数にNullが含まれるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント