普段とてもしっかりしたVBAの記事を書いてらっしゃるブログ・t-hom's diaryさんで、間違った記述を見かけてしまったので、記事にさせていただきます。
Worksheetsという名称のオブジェクトは存在する
間違っているのは、最後のほうに登場する
Worksheetsという名称のオブジェクトは存在しない。
という記述です。
実際には「Worksheets」という名称のオブジェクトは存在します。
Worksheetsオブジェクトのヘルプも存在しています。
SheetとSheetsとWorksheetとWorksheets
SheetとSheetsとWorksheetとWorksheetsについてまとめると以下のとおりです。
名称 | 有無 |
---|---|
Sheet | Sheetという名称のオブジェクトは存在しない |
Sheets | ChartオブジェクトやWorksheetオブジェクトを要素オブジェクトとして含むSheetsコレクションが存在 |
Worksheet | ワークシートを表すWorksheetオブジェクトが存在 |
Worksheets | Worksheetオブジェクトを要素オブジェクトとして含むWorksheetsコレクションが(一応)存在 |
オブジェクトブラウザーを使って確認する
自分の手を動かしてオブジェクトブラウザーで検索を行い、自分の目で確認することをおすすめします。
オブジェクトブラウザー内で右クリックして表示されるショートカットメニューから、[完全に一致する単語だけを検索する]オプションをOnにした状態で、検索を行ってください。
「sheet」を検索すると、下図のように複数のオブジェクトがSheetプロパティを持っていることはわかりますが、Sheetという名前のオブジェクトは存在しません。
「sheets」を検索すると、Sheetsオブジェクトがヒットします。
「Worksheet」を検索すると、Worksheetオブジェクトがヒットします。
この記事のきっかけとなった「Worksheets」を検索すると、Worksheetsオブジェクトがヒットします。
WorksheetsプロパティがSheetsを返すことになっていることが誤解の原因では
オブジェクト式の文法を確実に理解している方がなぜ、
Worksheetsという名称のオブジェクトは存在しない。
という誤解をしてしまったのかですが、WorksheetsプロパティがSheetsを返す作りになっているからかな、と想像しています。
Worksheetsオブジェクト型の変数にWorksheetsプロパティの戻りをセットすることはできない
ちなみに、Worksheetsオブジェクトが存在しているのなら、例えば、
Dim obj as Worksheets Set obj = Worksheets
のように、Worksheetsオブジェクト型の変数に、Worksheetsプロパティの戻りをセットすることができると考える方もいらっしゃるかもしれませんが、これはダメです。
実行すると、
Set obj = Worksheets
の行で「実行時エラー'13': 型が一致しません。」とエラーが発生します。
Worksheetsプロパティは、Sheetsオブジェクトを返すプロパティとして作られてしまっているからです。
Sheetsクラスは、WorksheetsクラスやChartsクラスをくるんでいるだけのクラスで、Worksheetsプロパティは内部的にはWorksheetsオブジェクトを返しているのではないか、と私は想像しています。
MicrosoftはなぜWorksheetsプロパティの戻りを素直にWorksheetsコレクションオブジェクトにしなかったのか
Worksheetsオブジェクトのヘルプには、
「すべての Worksheet オブジェクトのコレクションです。」
「Worksheets コレクションを取得するには、Worksheets プロパティを使用します。」
といった記述もあるのですから、
Microsoftが、Worksheetsプロパティの戻りを、素直にWorksheetsオブジェクトにしておいてくれれば良かったのに!と感じます。
最終更新日時:2024-04-19 15:27
- Newer:VBAで列番号のアルファベットを取得する-Split関数
- Older:未保存のブックをアクティブにするExcelマクロ
Home » エクセルマクロ・Excel VBAの使い方 » Sheets・Worksheet » SheetとSheetsとWorksheetとWorksheets