昨日の記事では、今回のネタにするために、あえてちょっと微妙な表現をしたところがあります。
取得するために使用するプロパティも同じ(この場合はWorksheetsプロパティ)であり、インデックスを指定するかどうかで、コレクションかオブジェクトかが分かれます。
Worksheetsプロパティは、ApplicationオブジェクトまたはWorkbookオブジェクトのプロパティですが、確認のためExcel 2007と2003のVBAヘルプを調べてみて、その解説のあまりのわかりづらさに、思わず笑ってしまいました。
特に下の、Excel 2007のApplication.Worksheetsの解説。
Application オブジェクトでは、作業中のブックのすべてのワークシートを表す Sheets コレクションを返します。Workbook オブジェクトでは、指定されたブックのすべてのワークシートを表す Sheets コレクションを返します。値の取得のみ可能です。Sheets オブジェクトの値を使用します。
……ツッコミどころはいろいろとあるのですが(^^;)、それをやってるとどんどん本題から離れていくので、ポイントを1つだけ。
「Worksheetsプロパティ」の項目には、「インデックスを指定して単独のWorksheetオブジェクトを取得する」という用法はまったく解説されていない、ということです。
(使用例には、まったく説明なしに、シート名を指定する例が出てきますが)
基本的に、WorksheetsとかWorkbooksといったプロパティの役目は、コレクションを取得するところまでです。
それにインデックスを指定して個々のオブジェクトを取り出すのは、実は各コレクションのItemというプロパティ(またはメソッド)の役目なのですが、このプロパティは省略可能であるため、ほとんどの場合、省略されています。
(このあたりのことは、Excel 2007のVBAヘルプでは「概要」の「コレクションからオブジェクトを取得する」に書かれています)
で、話は再びRangeオブジェクトなのですが、VBAヘルプでこのオブジェクトの項目を調べると、2007/2003ともに、Rangeオブジェクトを取得する方法の1つとして、Cellsプロパティに行・列のインデックスを指定する、という説明があります。
ところが、Cellsプロパティの項を見てみると、その解説の基本部分には、対象のオブジェクトに応じて「すべてのセル」を表すRangeオブジェクトを返す、ということしか書かれていません。
補足的に、Itemプロパティで行・列のインデックスが指定できること、このItemが省略可能であることが書かれているだけです。
(こちらも、使用例ではむしろこの用法が中心ですが)
要するに、「Cells(1, 3)」のような指定方法は、Cellsプロパティの機能によるものではなく、「Cells.Item(1, 3)」の省略形である、ということです。
この「.Item(1, 3)」やその省略形の「(1, 3)」は他の方法で取得したRangeオブジェクトの後にも付けられるので、たとえば「Range("A1:C4")(2, 3)」のような書き方で、C2セルを表すRangeオブジェクトを取得することもできます。
では、VBAヘルプの「Rangeオブジェクト」の項目におけるCellsプロパティの説明(行・列のインデックスを指定して云々)は間違っているのかというと……これについても常々思っていることはあるので、次の機会に書いてみたいと思います。
※追記
ヘルプの解説に関するツッコミを、別記事として書きました。
2008年07月17日
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/17063975
※言及リンクのないトラックバックは受信されません。
この記事へのトラックバック
http://blog.sakura.ne.jp/tb/17063975
※言及リンクのないトラックバックは受信されません。
この記事へのトラックバック