拙著『いちばんやさしいPowerPoint VBAの教本』のP.096でお伝えしている、何らかのオブジェクトがコレクションなのかを判断するには、For Each~Next文で処理できることを確認する必要がある件について補足記事を書きました。
これはPowerPoint VBAに限った話ではなく、Excel VBAでも同じです。
Excel VBAをある程度使っている方なら、Workbooksプロパティで取得できるWorkbooksオブジェクトや、
Worksheetsプロパティ・Sheetsプロパティなどで取得できるSheetsオブジェクトが、
コレクションであることをご存知のはずです。
VBA学習の初期段階では、何となく暗記しまう方が少なくないと思いますが、本質的には暗記するのではなく、テストコードを実行してその結果から判断できることを理解しておきましょう。
この判断ができれば、未知のオブジェクトを利用する際の理解も早められます。
WorkbooksとWorkbook
Workbooksプロパティで取得できるWorkbooksオブジェクトはコレクションですから、以下のSubプロシージャは問題なく実行できます。
Dim itm As Variant
For Each itm In Workbooks
Next
End Sub
一方、ActiveWorkbookプロパティで取得できるWorkbookオブジェクトは、コレクションではありませんから、以下のSubプロシージャは実行時エラーが発生します。
Dim itm As Variant
For Each itm In ActiveWorkbook
Next
End Sub
もちろんWorkbooks.ItemプロパティでWorkbookオブジェクトを取得する場合も、実行時エラーになります。
SheetsとWorksheet
Sheetsプロパティで取得できるSheetsオブジェクトはコレクションですから、以下のSubプロシージャは実行できます。
Dim itm As Variant
For Each itm In Sheets
Next
End Sub
一方、ActiveSheetプロパティで取得できる、ワークシートを表すWorksheetオブジェクトや、グラフシートを表すChartオブジェクトは、コレクションではありませんから、以下のSubプロシージャは実行時エラーが発生します。
Dim itm As Variant
For Each itm In ActiveSheet
Next
End Sub
もちろんSheets.ItemプロパティでWorksheetオブジェクトを取得する場合も、実行時エラーになります。
Rangeの場合
Rangeオブジェクトは(1個のセルを表す場合でも実は)コレクションですから、以下のSubプロシージャでも、実行時エラーが発生することはありません。
Dim itm As Variant
For Each itm In ActiveCell
Next
End Sub
- Newer:Word VBAでハイパーリンク先を変更する
- Older:xlrdで空白セルかを判定する
Home » エクセルマクロ・Excel VBAの使い方 » コレクションをFor Each~Nextで確認できるのはExcel VBAでも同じ