オブジェクトに特定のプロパティが存在するかを調べる方法を解説します。
たとえば
- 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
なかなかトリッキーなコードになりますので、
例外の発生に十分注意して使用してください。