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関数で変数がオブジェクトであるかどうかの確認
サンプルマクロ
Option Explicit Sub IsObject_macro_イ() 'オブジェクト変数を宣言する Dim オブジェクト As Object 'IsObjectによる判定(実行結果はTrue or False) Debug.Print IsObject(オブジェクト) 'True End Sub
オブジェクト変数「オブジェクト」を宣言して、IsObject関数による判定結果をデバッグプリントでイミディエイトウィンドウに表示します。実行結果は真偽値のTrueもしくはFalseが返りますので、このマクロの実行結果では、Trueが表示されます。
それでは、ほかの変数も判定してみます。
サンプルマクロ2
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関数で判定結果を出力します。
実行結果(イミディエイトウィンドウ)
True
True
True
True
True
True
False
False
False
False
False
False
True
True
True
※実行結果は、前章の”IsObject関数の結果の一覧“の表と同じものです。
オブジェクト、アプリケーション、ブック、シート、セル、図形がTrueとして判定されており、数値からバリアントまではFalseです。また、辞書(Dictionary)やコレクション(Collection)、クラス(Class)などもTrueと判定されます。
こちらのサンプルマクロで利用している、コレクションやForEachをつかったくり返し処理が以前の記事でも取りあつかっていますので、あわせてご覧ください。
コレクションの宣言方法やプロパティやメソッドの使い方については以下のリンクをクリック
オブジェクトの要素に対してくり返し処理するマクロを作りたいなら以下のリンクをクリック
IsObject関数でオブジェクト変数の初期化前の確認
バリアント型の変数の場合は、オブジェクトが参照されているときのほか、Nothingの場合もTrueとなる点はおぼえておきましょう。この性質を応用することでオブジェクト変数として初期化しているかどうかの判定もできます。
サンプルマクロ3
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関数で関数の戻り値がオブジェクトであるかの確認
サンプルマクロ4
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関数で変数が特定のオブジェクト型であるかどうかの確認
サンプルマクロ5
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つの変数がオブジェクト変数かどうかを確認しています。ながれとしては、これらの変数を宣言してコレクションとしてまとめることでくり返し処理を実行できるようにしています。
実行結果は以下のとおりです。
実行結果(イミディエイトウィンドウ)
Collectionオブジェクトです。
Dictionaryオブジェクトです。
Classオブジェクトです。
条件分岐については2段階になっています。まずは、IFステートメントをつかってIsObject関数によって、指定された変数がオブジェクト変数かどうかの判定を実行しています。判定の結果がTrueであれば、今度はどういったオブジェクトであるかを判定する処理を実行します。
どんなオブジェクト変数であるかは以下の方法を使っているよ。
■TypeName関数
TypeName関数は指定した変数名を文字列型 (String) の値で返します。
戻り値を文字列型の変数「myobjname」に代入しています。
※注意
Classオブジェクトの型名は、クラスモジュールのオブジェクト名です。
こちらは変更しない限りClass1、Class2、Class3…と命名されていきますが、任意で変更した場合はそちらにあわせて判定式を書きかえる必要があります。
■SelectCaseステートメント
型の名前を判定して、一致した分岐の処理を実行します。
SelectCaseステートメントは多くの分岐が必要な場合のマクロでとても便利につかうことができるもので、本サイトの以前の記事で取りあつかっていますので、詳しい内容については以下のリンクよりご覧ください。
IsObject関数のような値や変数を判定する関数はほかにもある
VBAには数値以外にも値や変数を判定する関数があります。
値や変数が配列であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が数値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が日付であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が初期値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数がエラーであるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数にNullが含まれるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント