VBA技術解説
オブジェクトとプロパティの真実

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2013年5月以前 最終更新日:2013-02-18

オブジェクトとプロパティの真実

オブジェクトとプロパティについて、解説をします。


対象は、VBA中級以上になると思いますが、


初級の方でも、VBAって奥が深いんだなーと感動位は出来ると思います。(笑)


ただし、あまり役には立たないかもしれませんので、あしからず。


マクロを書いてる人に、したり顏で説明したら株が上がるかも知れません。


逆に、「混乱させるなー」と嫌われても、当方は責任を持ちません。(笑)



1.オブジェクトとプロパティの真実


私は、以前にこのように書きました。

オブジェクトとは

オブジェクトは、objectであり、物・物体のことです。

VBAで何か操作をしようとする対象となるものがオブシェクトです。

ブックやシート、そしてセルなどを指します。


プロパティとは

プロパティは、propertyであり、財産・資産のことです。

オブジェクトの持つ財産・資産のことであり、オブジェクトの性質を表すデータです。

セルの持つ値や書式は全て、セルのプロパティです。


メソッドとは

メソッドは、methodであり、方法。方式です。

オブジェクトに対する動作・操作を指定します。

セルを選択する、セルを削除する等です。


これは間違いではありません、しかし、正確とはいえません。

なぜなら、ブック、シート、セルはオブジェクトなのでしょうか?


では、

Range("A1").Value

このRangeは、何でしょうか?

前回の説明なら、オブシェクトと答えるしかありません。

そして、それは正しいです。

しかしこれは、

Application.ActiveWorkbook.ActiveSheet.Range("A1").Value

の省略形なのです。

その為、オブジェクト.オブジェクト.・・・.オブシェクト.プロパティ、と説明したりします。

オブジェクトは階層構造になっているとも説明します。

(初心者はそのように覚えてもらって結構です、いや、そう覚えて下さい。)


でもそれなら、オブジェクトの中にオブジェクトが含まれていると言う事でしょうか?

SheetオブシェクトはRangeオブジェクトの集合体なのでしょうか?

この辺から勘違いが発生するのかもしれません。


以下はどうでしょう。

Application.Workbooks(1).Worksheets(1).Range("B2:C100").Cells(1, 1).Value

Application.Workbooks(1).Worksheets(1).Cells(2, 2).Value

Application.Workbooks(1).Worksheets(1).Range("B2").Value

違いが分かりますか。

といいますか、一番上の記述自体を見たことが無いかもしれませんね。

これはどれも、「B2」セルを指します。


あれれ、Cellsっていったいどうなってるのと疑問になりませんか。


まず、結論を言えば、

Applicationオブジェクトの中には、プロパティWorkbooksがあり、Workbookのコレクション(集まり)です。

Workbookオブジェクトの中には、プロパティWorksheetsがあり、Worksheetのコレクション(集まり)です。

Worksheetオブジェクトの中には、プロパティRangeがあります。

Worksheetオブジェクトの中には、プロパティCellsがあります。

Rangeオブジェクトの中には、プロパティCellsがあります。


よけいに意味わかんなーいとか言われそうですね。


では、VBEでオブジェクトブラウザを見て見ましょう。

VBEの画面で、「表示」→「オブジェクトブラウザ」、または、F2


ここに、「クラス」というウインドウがあります。(プロジェクトの直ぐ右)

あれ、「クラス」って何?

いきなり疑問ですよね。

オブジェクトブラウザなのに、どこにオブジェクトがあるの?

ってなりますよね。

この「クラス」がオブジェクトと言っているものの正体です。


では、Applicationを見て下さい。

クリックすると、右側に、'Application' のメンバ(プロパティやメソッドの一覧)が表示されます。

中には、WorkBooksがありますので、選択して下さい。

下に、説明が表示されます。

Property Workbooks As Workbooks
読み取り専用
Excel.Application のメンバ



Propertyって、プロパティなの?

WorkBooksはオブジェクトでは無いのでしょうか。

そうなんです、ApplicationクラスのWorkBooksプロパティなのです。

でも、As WorkBooksとは何でしょうか?


Functionの戻り値の型は使いましたよね。

Function シート取得(ByVal strSht As String) As Worksheet
これです、これと同じだと考えて下さい。

このプロパティはWorkbooksを返します。

そして、コレクションなので、引数を指定することで、特定のWorkBookになります。


なんだかよく分からないですよね。

まあ、少し進んで、WorkSheetを見てみましょう。

この中には、Cellsもあれば、Rangeもあります。

Property Cells As Range
読み取り専用
Excel.Worksheet のメンバ

Property Range(Cell1, [Cell2]) As Range
読み取り専用
Excel.Worksheet のメンバ
ですから、

Worksheets(1).Cells(2, 2).Value

Worksheets(1).Range("B2").Value

のどちらも使用できるのです。

また、Rangeをみれば、Cellsがメンバに入っています。

なので、Range("B2:C100").Cells(1, 1).Valueこんな指定も可能なのです。


ここまで来ると、では、WorkSheetやCellsやRangeはプロパティなのかとなります。


そうなんです、コードの記述上では、これらはプロパティなのです。

だって、VBEでは、Worksheetsの後に候補が自動表示されますよね。

この候補は、そのオブジェクトのプロパティやメソッドの一覧なのですから。


そして、これらのプロパティは、それぞれの同名のクラス、つまりオブジェクトを返します。

従って、結果として、オブジェクトを操作できているのです。


つまり、Worksheetsプロパティを使い、Worksheetオブジェクトを参照し、

さらにその中の、Rangeプロパティを使い、Rangeオブジェクトを参照しているのです。


書いている最中はプロパティ、書き終わった瞬間に、オブジェクトへ、へーんしーん!

みたいな感じです。


もし仮に、Excelの開発担当者がスペルを間違えて(絶対にない、ありえない。←仮の話!)

Property Lange(Cell1, [Cell2]) As Range
としてしまったら、我々は、みんなで、Langeを使うことになります。←絶対にいやだー!


なんとなく理解出来ましたでしょうか。

実際に、自分でクラスを作成してみれば、直ぐに分かる事なのですが、

とりあえずは、そんなものなのか、程度の理解で全く問題ありません。

Rangeは結果として、Rangeオブジェクトを参照していることに間違いはないのですから。



いやいや、結構難しいというか、訳分からないと言うか、そんな感じでしょうか。


私も書きながら、その説明はどうなんだ・・・と自分に突っ込みながらの説明でした。


はっきりいって、少なくとも私のブログを読む人は、知っている必要はありません。

VBAやVBで生活しようと思っているなら、知っておいた方がよいでしょう。

(ずっとやっていれば、そのうち自然と理解しますけどね。)





同じテーマ「マクロVBA技術解説」の記事

ドキュメントの作成者を取得(GetObject,BuiltinDocumentProperties)
画像サイズ(横x縦)の取得について
文字種(ひらがな、全半角カタカナ、半角英大文字等々)の判定
オブジェクトとプロパティの真実
オブジェクト式について
オブジェクトの探索方法(オートシェイプのTextを探して)
条件付きコンパイル(32ビット64ビットの互換性)
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)
VBAでファイルを既定のアプリで開く方法
Excelアドインの作成と登録について
VBAでのタイマー処理(SetTimer,OnTime)


新着記事NEW ・・・新着記事一覧を見る

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ