和風スパゲティのレシピ

日本語でコーディングするExcelVBA

オブジェクトに特定のプロパティが存在するか調べる

オブジェクトに特定のプロパティが存在するかを調べる方法を解説します。

たとえば

  • RangeオブジェクトにFormula2プロパティがあるか判定
  • Variant変数に入れた何らかのオブジェクトにNameプロパティがあるか判定

などを行う方法を解説します。

一発でこれを行うプロパティは存在しませんので、
オブジェクト.プロパティがエラーになるかどうかを調べて判定します。

サンプルコード

Sub RangeオブジェクトがFormula2プロパティを持つか調べる()
    
    ' RangeオブジェクトがFormula2プロパティを持つか調べる
    
    Dim Range変数 As Variant ' ←ここを As Range にはできない
    Set Range変数 = Worksheets("○○").Range("A1")
        
    On Error Resume Next
    Dim tmp: tmp = Range変数.Formula2

    If Err.Number = 438 Then ' オブジェクトは、このプロパティまたはメソッドをサポートしていません。
        MsgBox "RangeオブジェクトはFormulaプロパティ2を持っていません。"
    Else
        MsgBox "RangeオブジェクトはFormulaプロパティ2を持っています。"
    End If
            
End Sub
Sub NameかTextかDiscriptionを取得する()

    Dim 識別名 As String
    Dim 何らかのオブジェクト As Object
    
    On Error Resume Next
    識別名 = 何らかのオブジェクト.Name
    識別名 = 何らかのオブジェクト.Text
    識別名 = 何らかのオブジェクト.Discription
    On Error GoTo 0

End Sub

解説

オブジェクトに特定のプロパティが存在するかどうかは、
オブジェクト.プロパティがエラーになるかどうかを調べて判定します。

オブジェクトにそのプロパティがない場合は、

実行時エラー '438':
オブジェクトは、このプロパティまたはメソッドをサポートしていません。

エラーが起こりますので、これを判定するわけですね。


この判定には注意点が3つあり、
まず変数の型は「Variant」「Object」限定となります。

たとえば以下のコードはRangeにFormula2がなかった場合はそもそも実行ができず、
コンパイルエラーとなるため判定以前にマクロが実行できません。

Dim Range変数 As Range ' ←ここを As Range にした
Set Range変数 = Worksheets("○○").Range("A1")
    
On Error Resume Next
Dim tmp: tmp = Range変数.Formula2

 
On Error Resume Nextでスキップするには実行時エラーにする必要があるため、
コンパイルエラーにならないよう型を指定しない必要があります。

※ より厳密には、実はRangeは上記コードでも判定ができます。
Rangeは[_Default]プロパティが既定のプロパティであり、
これが「As Variant」であるため上記のコードはコンパイルエラーになりません。


続いて2つ目の注意点として、
今回の判定は単に「エラーが起きたかどうか」では判定できません。

If Err.Number > 0 Then ' ← これではダメ

 
「オブジェクトが必要です」「引数の数が一致していません」など、
このコードはその他のエラーが起きる可能性も高いコードですので、
確実に「438:プロパティかメソッドがない」であるかを判定してください。


最後の注意点として、On Error Resume Nextを使いますので、
本来は即座にOn Error GoTo 0で設定を戻す必要があります。

が、これを実行すれば当然Err.Numberも0に戻りますので、
実際には以下のコードを用いた方が良いでしょう。

' ↓ このコードではGoTo 0を書く場所に困る
On Error Resume Next
Dim tmp: tmp = Range変数.Formula2

If Err.Number = 438 Then
' 一旦判定結果をフラグ変数に入れて即座にGoTo 0
On Error Resume Next
Dim tmp: tmp = Range変数.Formula2
Dim isFormula2あり As Boolean
isFormula2あり = Not (Err.Number = 438)
On Error GoTo 0

' 分岐はフラグ変数を使って判定
If isFormula2あり Then

なかなかトリッキーなコードになりますので、
例外の発生に十分注意して使用してください。