Excel VBAには「Errors」「Error」という2つのオブジェクトが用意されています。
コレクションと、そのコレクションに含まれる要素オブジェクトについてご存じであれば、
「ErrorsはErrorのコレクションだな」
と瞬時に思ってしまうのではないでしょうか。
ErrorsにはCountプロパティがない
(残念ながら?)ErrorsはErrorのコレクションとは言えないオブジェクトです。
コレクションに必須のCountプロパティが用意されていないのです。
Excel VBAのコレクションにはCountプロパティが用意されています。
皆さんご存じの、WorkbooksにもSheetsにもRangeにもCountプロパティが用意されています。
しかしErrorsオブジェクトにはCountプロパティは何故か用意されていません。
要素を取得するItemプロパティは用意されていて、
その戻り値はErrorオブジェクトなのですが。
For Each~NextでErrorsは処理できない
Excel VBAのコレクションは基本的にFor Each~Nextループで、その要素オブジェクトに対して処理を繰り返すことができます。
WorkbooksもSheetsもRangeも、For Each~Nextループで要素を順番に取得して処理を繰り返すことができます。
一方Errorsオブジェクトに対してFor Each~Nextで処理を繰り返そうとしても、実行時エラーが発生してしまいます。
以下のようなExcelマクロを実行しても、
Dim err As Error
For Each err In ActiveCell.Errors
Debug.Print err.Value
Next
End Sub
下図のような
「実行時エラー '438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
実行時エラーとなります。
[デバッグ]ボタンをクリックすると、下図のように
「For Each」の行で実行時エラーになっていることがわかります。
このようなオブジェクトはErrorsだけっぽい
オブジェクトブラウザで「Item」を完全一致検索すれば、Excel VBAでItemプロパティまたはItemメソッドを持つオブジェクトがヒットします。
他にもErrorsオブジェクトのように、複数形的な名前で、Countプロパティを持たないけれどItemは存在するオブジェクトがあるのか調べてみましたが、Excelライブラリの中ではどうやらErrorsオブジェクトだけのようです。
何故このような状態になっているのか、その原因や理由までは、まだ調査できていないのですが。
最終更新日時:2023-07-10 16:04
Home » エクセルマクロ・Excel VBAの使い方 » Excel VBAのErrorsはErrorオブジェクトのコレクションではない