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関数で変数がオブジェクトであるかどうかの確認

Option Explicit

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

オブジェクト変数「オブジェクト」を宣言して、IsObject関数による判定結果をデバッグプリントでイミディエイトウィンドウに表示します。実行結果は真偽値のTrueもしくはFalseが返りますので、このマクロの実行結果では、Trueが表示されます。

それでは、ほかの変数も判定してみます。

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

こちらのサンプルでは、IsObject関数の処理をくり返しで実行するために、コレクションオブジェクトをつかっています。

Test_Object」から「Test_Class」という名前の変数を宣言して、コレクションの「M_Collection」にこれらすべての変数を要素としてまとめています。

さいごに、For Eachステートメントを使用してコレクションのすべての要素を対象にIsObject関数で判定結果を出力します。

※実行結果は、前章の”IsObject関数の結果の一覧“の表と同じものです。

オブジェクト、アプリケーション、ブック、シート、セル、図形がTrueとして判定されており、数値からバリアントまではFalseです。また、辞書(Dictionary)やコレクション(Collection)、クラス(Class)などもTrueと判定されます。

こちらのサンプルマクロで利用している、コレクションや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

こちらのサンプルマクロはIsObject関数の判定によってオブジェクト変数か初期化されたかの確認をしています。
マクロのコード”Set Test_Variant = Nothing”の行をコメントアウトすると結果がかわります。

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

こちらのマクロでは、変数「result」にファンクションプロシージャのなかで宣言したオブジェクト変数を代入する処理を実行したのち、IsObject関数でオブジェクト変数かどうかの判定をしています。

実行結果はイミディエイトウィンドウに以下のように表示されます。

ファンクションプロシージャのなかでなにかの処理を実行したことで、変数がオブジェクト変数であるかの確認をする場合はこういったマクロが使えるでしょう。

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

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

こちらのマクロでは、myCollection、myDictionary、myClassの3つの変数がオブジェクト変数かどうかを確認しています。ながれとしては、これらの変数を宣言してコレクションとしてまとめることでくり返し処理を実行できるようにしています。

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

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

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

TypeName関数

TypeName関数は指定した変数名を文字列型 (String) の値で返します。
戻り値を文字列型の変数「myobjname」に代入しています。

※注意
Classオブジェクトの型名は、クラスモジュールのオブジェクト名です。
こちらは変更しない限りClass1、Class2、Class3…と命名されていきますが、任意で変更した場合はそちらにあわせて判定式を書きかえる必要があります。

SelectCaseステートメント

型の名前を判定して、一致した分岐の処理を実行します。
SelectCaseステートメントは多くの分岐が必要な場合のマクロでとても便利につかうことができるもので、本サイトの以前の記事で取りあつかっていますので、詳しい内容については以下のリンクよりご覧ください。

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

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)を返す

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

コメント

タイトルとURLをコピーしました