2018年1月17日に発売となった拙著『いちばんやさしいExcel VBAの教本』の279ページに「WorksheetsプロパティはSheetsコレクションを返す」というワンポイントを書きました。
Excelマクロで、RangeプロパティやCellsプロパティにつづいて見かけることの多い、Worksheetsプロパティに関連するコラムです。
引数を指定しないWorksheetsプロパティで取得したコレクションオブジェクトをオブジェクト変数に代入しようとしたときには戸惑うはずですが、その時点で正しく学び直しをすれば十分です。
この文章が何をいっているのか、よくわからないExcel VBA経験者もいらっしゃると思いますので、補足しておきます。
Worksheetsプロパティの戻りの代入で実行時エラーが発生するサンプルマクロ
「引数を指定しないWorksheetsプロパティで取得したコレクションオブジェクトをオブジェクト変数に代入しようとしたときには戸惑うはず」とは、以下のようなコードを実行したときの話です。
Dim obj As Worksheets
Set obj = Worksheets
End Sub
このコードを読んだだけでは何が問題なのか、わからない方もいらっしゃるかもしれませんが、このSubプロシージャは実行時エラーが発生します。
Worksheetsプロパティの戻りは、Worksheetsコレクションオブジェクトではないにも関わらず、Worksheetsオブジェクト型で宣言された変数objに代入が行われようとしているため、「型が一致しません。」実行時エラーが発生します。
この状態を拙著では
「引数を指定しないWorksheetsプロパティで取得したコレクションオブジェクトをオブジェクト変数に代入しようとしたときには戸惑うはず」
と書いています。
『インストラクターのネタ帳』でも「SheetとSheetsとWorksheetとWorksheets」で言及している内容です。
Worksheetsプロパティの戻りの代入で実行時エラーが発生しないサンプルマクロ
先のSubプロシージャを以下のように修正すると、実行時エラーは発生しなくなります。' Dim obj As Worksheets
Dim obj As Sheets
Set obj = Worksheets
End Sub
オブジェクトブラウザー等で確認すればわかるとおり、Worksheetsプロパティの戻りはSheetsコレクションオブジェクトです(このWorksheetsプロパティで返されたSheetsコレクションオブジェクトには、Worksheetオブジェクトだけが含まれています)。
ですから、オブジェクト変数をWorksheets型ではなく、Sheets型で宣言しておけば、
' Dim obj As Worksheets
Dim obj As Sheets
Worksheetsプロパティの戻りを代入しても、
Set obj = Worksheets
実行時エラーは発生しません。
入門者は当面、この記事を忘れてください
ワンポイント「WorksheetsプロパティはSheetsコレクションを返す」に、入門者がWorksheetsプロパティについて、最初から正しい形で理解しようとすると、難易度が非常に上がり、その後のマクロ学習のスピードを落とすことにもなります。
と書いたとおり、Excel VBA入門者がこの記事で書いている内容を最初から理解しようとすると、きっと混乱してしまいます。
拙著に限らず「WorksheetsプロパティはWorksheetsコレクションオブジェクトを返す」と、厳密には正しくない解説を行っているExcel VBA書籍のほうをよく見かけるはずです。
当面は、この記事の内容は忘れておくほうがイイでしょう。
プログラミング経験がなく、拙著ではじめてExcel VBAにチャレンジする方の場合、この記事の内容を理解できるようになるには、かなり早い方であっても数か月後になるはずです。
最終更新日時:2020-06-16 17:06
- Newer:ExcelのN枚目のシートを選択するJScript
- Older:CurrentRegionの最終セルを取得・選択する
Home » いちばんやさしいExcel VBAの教本 » Worksheetsで取得したコレクションはオブジェクト変数への代入時に戸惑うの意味