プロが教える店舗&オフィスのセキュリティ対策術

(株)C&R研究所発行 Excel VBA逆引きハンドブック 著者 蒲生睦男 234ページを引用します。

-----
ワークシートを参照するには「Worksheets」プロパティを使います。「Worksheets」プロパティは、指定されたブックのすべてのワークシートを表す「Sheets」コレクションを返します。
-----

私は今までWorksheetsはコレクションだと思ってました。つまりワークシートの集合であると。違うのですか?さらにプロパティはオブジェクトの性質を表わすもので、例えばCellのプロパティであればValue, Colour等です。では、Worksheetsは何のプロパティなのでしょうか?Workbookのプロパティですか?もしそうなら、他にはどんなプロパティがあるのですか?さらに上記引用で「返す」とありますが、返すってなんですか?ファンクションプロシージャの戻り値を返す、みたいな表現はありますがここでの「返す」の意味がよくわかりません。

私の現状認識は以下のものです。どこか誤ってますか?
Worksheetsはワークシートの集合体つまりコレクションであり、ワークシートオブジェクトでもある。オブジェクトであるので、性質を表わすプロパティではない。

VBAの構文で
Workbook.Worksheet.Range
のような表現はよく使いますが、ひょっとして後ろにくっつくのは全部プロパティなのですか?ちょっとよくわかりません。

A 回答 (4件)

こんにちは。



別の方の回答にも似たような内容を書いたのですが、あまりプロパテイだのメソッドなど、こだわらないほうが良いと思います。ご質問者さんは、どの程度のVBAのプログラミングの力があるかは分かりませんが、こういう事を考えていると、プログラミングの上達にはマイナスに働きます。

この問題は、基本的には、Class とInstanceの概念や実際のClassの組み立てを、ある程度知っておけば、分かる話なのです。簡単にいえば、究極的に、オブジェクトの性質を表すものは、すべてプロパティといえるからです。

食べ物--カレー--チキン
       --ブタ
       --ポーク
       --野菜
カレー自体が、食べ物に対するプロパティでもあるからです。

プロパテイというのは、親オブジェクトに対するプロパティという意味ですから、親オブジェクトを念頭に置いておかないと、プロパティが成立しません。つまり、親オブジェクトからみたら、その性質を位置づけるものは、子オブジェクトもプロパテイだということです。

>Worksheetsは何のプロパティなのでしょうか?

ご質問のプロパティの親オブジェクトは、Workbook かApplicationとなります。
コレクションというものは、互いに関連付けられた複数の要素を 1 つのオブジェクトとしてまとめられるものを指しますから、Worksheetsも、当然、コレクションだとは言えます。ここでは、まったく話が別というか、違う考え方なのです。

>プロパティはオブジェクトの性質を表わすもので、例えばCellのプロパティであればValue, Colour等です

その通りですが、Cells もまた、Worksheet やApplication のプロパティとも言えます。
特に、Cellsが、Applicationのプロパテイというのは、実際にプログラミングしていると気がつくのですが、どうも、そういう造りにしてあるようです。確かに、その方が便利だからです。

・ワークシートを参照するには「Worksheets」プロパティを使います。
・「Worksheets」プロパティは、指定されたブックのすべてのワークシートを表す「Sheets」コレクションを返します。
>さらに上記引用で「返す」とありますが、返すってなんですか?

これについては、ヘルプの表現だと思いますが、英文からの、そのままの機械翻訳でしょう。(この辺りは、Microsoft 系の翻訳者からは、事情は聞きましたが、きちんと決められた訳しか出来ません。)

日本語訳からは、いくら考えても、厳密な意味は取れないでしょうけれども、英語にしても、そのまま訳を当てはめれば、意味は大差はありません。

引用:
http://msdn.microsoft.com/en-us/library/office/f …

"Workbook.Worksheets Property"
"Returns a Sheets collection that represents all the worksheets in the specified workbook."

「特定のブックの中ですべてのWorksheetsを表すものは、Sheets Collection に帰します。」

という具合に読み替えたら、少しは分かると思います。訳として正確とはいえませんが、そういうことだと思います。

ただ、最後に、あえて混乱させるようなことを言うのは問題があるかもしれませんが、例えば、End プロパティは、なぜ、メソッドではなく、プロパティだというのか、個人的には居心地の悪さを感じます。
最初に書いたClassのプログラミングで、実は、Class の中で、メソッドとプロパテイというものは、簡単にいうと、Sub プロシージャと Function プロシージャの違いのようなもので、作成上で、区分けされるものなのです。制作者側が、そう決めたから、そう呼ばれるものだと解釈したほうがよいのです。
少なくとも、私自身は、そう思っています。そうすれば、気が楽なのです。
    • good
    • 1
この回答へのお礼

ありがとうございます。

お礼日時:2014/03/30 07:50

オブジェクトは『機能をもった値(データ)』。

コレクションもオブジェクト。
オブジェクトは、以下の機能を提供します。
 ・プロパティ: オブジェクト内の『値』の取得/設定を行なう機能
 ・メソッド: オブジェクトの操作や処理を行なう機能
--------------

プロパティが扱うのは「性質」に限りません。機能と考えれば、「返す」の表現になります。
SheetsコレクションもWorkbookオブジェクト内のオブジェクトにすぎず、プロパティを介してアクセスするワケです。

> Workbookのプロパティですか?
Workbook か、Applicationです。
Applicationは、ショートカット的なプロパティを持ちます。bの正体がc。
 a) Application.ActiveWorkbook.Worksheets(1).Select
 b) Worksheets(1).Select  'Application.は省略可
 c) Application.Worksheets(1).Select

> Workbook.Worksheet.Range
オブジェクトの階層構造を表すなら、「オブジェクト名」で書きます。
プロパティとオブジェクトがわりと同名なので、混同しますが。

> 他にはどんなプロパティがあるのですか?
workbookのメンバ一覧はこちら↓
http://msdn.microsoft.com/ja-jp/library/microsof …
ローカルウィンドウでオブジェクトの中覗くこともできます。お試しあれ。
Sub hoge()
 Set sh = ActiveSheet 
 Stop '←ココで止まったらshを覗く
End Sub
    • good
    • 1
この回答へのお礼

階層構造がプロパティでなくオブジェクトならば、worksheetをプロパティとして使うのはどのようにするのでしょうか?

お礼日時:2014/03/29 11:40

> 階層構造がプロパティでなくオブジェクトならば、


> worksheetをプロパティとして使うのはどのようにするのでしょうか?

.WorksheetsプロパティがWorksheetsコレクションを返し、
Worksheetsコレクションの.ItemプロパティがWorksheetオブジェクトを返します。

以下、abは同じ処理。
 a) Worksheets("Sheet1").Range("A1") = 1
 b) Worksheets.Item("Sheet1").Range("A1").Value = 1
オブジェクトには省略可能なプロパティもあります。Range.Valueが有名ですが、.Itemもそうです。

コレクションは、「同種のオブジェクトをまとめる オブジェクト」。
一般的に.Itemは省略し、コレクションと配下のオブジェクトはあまり区別(意識)しません。そのほーが扱いやすいですから。
 Worksheets("Sheet1") ←ひとつに見える
    • good
    • 1
この回答へのお礼

ありがとうございます。
Itemプロパティ、忘れてました。勉強し始める頃にちょっとやって、事実上省略出来るようなことを聞き無視してました。worksheetプロパティはもう少し勉強してみます。

お礼日時:2014/03/30 07:39

#1の回答者です。



オブジェクトとプロパティというのは、プログラミングの基本的概念で、他の概念を同等に持ちだしてきたら、ワケが分からなくなります。

> worksheetをプロパティとして使うのはどのようにするのでしょうか?
プロパティとは、操作してどうこうしようと思っているようですが、そういうことではありません。これは定議の話であって、個々の設定やら値の取得の話は別問題です。

Workbook.Worksheets(1).Range("A1")
少なくとも、Workbookの配下に、Worksheet はありません。Worksheets という入れ物が存在しているのです。その入れ物の中の個別に指定しないと、それを取り出すことはできません。

その入れ物を、あえて「Worksheetsコレクション」と称することは間違いありませんが、コレクション(Collection)というものは、複数のオブジェクトをひとまとめにしたもので、ここでは、単なる名称にしかすぎません。単に、そういう入れ物を作ったということでしょう。

私の記憶に間違いなければ、プログラミングの構造からすると、まず、クラスがあって、それを実体化させたものがインスタンスです。それをオブジェクトと呼びます。そして、その中で、いくつか必要な性質を持たせます。それをプロパティと呼びます。プロパティの本質は、あくまでも、オブジェクトの「性質・属性」を示すものです。そのプロパティが、どういうものかは、それぞれの個別の問題です。

ここで、メソッドを持ちだしてきて、「こうすれば、プロパテイは値を取り出せたり、値が変わります」という機能を言っても、それは個別の例であって、それはまったく別の話です。

前回と重複しますが、プロパティとは、クラスの中で設定されたものです。その値を変更したり、値を取るという機能自体は、制作者が、そう設定されたものだということです。絶対的なものとしては存在しているわけではありません。

私は、別に混乱させるために書いているわけではありませんが、#1の回答で満足しなくても、もうこれ以上書く必要はないと思います。

失礼かもしれませんが、今まで書いたものを見させていただいて、経験的に、そのレベルの人で、用語の定義にこだわる人が上達したという覚えがありません。あれこれ考えるよりも、上級レベルに達するまで、こういう話は保留にしておいたほうがよいのではないかとアドバイスいたします。

いつか、私の話が分かる日が来ると思います。
それでは、これで失礼いたします。„
    • good
    • 1
この回答へのお礼

ありがとうございます。
AN1にて回答頂いた内容である程度理解したつもりでいましたが、階層構造がコレクションとの回答があったため、ではプロパティとしての使用例はどんなの?との疑問が生じました。クラスやインスタンスの用語が出て来た辺りで、これは理解を超えそうだと思いました。

>あれこれ考えるよりも、上級レベルに達するまで、こういう話は保留にしておいたほうがよいのではないか
ありがとうございます。実務では保留して進めることにします。ただ、個人的興味の範疇ではもう少し調べてみたいと思います。

お礼日時:2014/03/30 07:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!