ExcelマクロVBA技術解説 | オブジェクトとプロパティの真実 | Excelマクロの問題点と解決策、エクセルVBAの技術的解説



最終更新日: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で生活しようと思っているなら、知っておいた方がよいでしょう。

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






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

WorksheetFunctionについて
RangeとCellsの深遠
Offset、Resizeを使いこなそう
マクロ作成後に、表位置がずれた場合の対処
値渡し、参照渡しについて(ByVal,ByRef)
実は奥が深いIfステートメント
最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange)

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

スプレッドシートが非常に遅い、高速化するには|Google Apps Script入門(1月17日)
画像のトリミング(PictureFormat,Crop)|ExcelマクロVBAサンプル集(12月27日)
シート保護|Google Apps Script入門(12月24日)
表示の固定|Google Apps Script入門(12月24日)
グラフ|Google Apps Script入門(12月21日)
入力規則|Google Apps Script入門(12月13日)
並べ替え|Google Apps Script入門(12月12日)
メモの挿入・削除と改行文字|Google Apps Script入門(12月6日)
リンクの挿入・編集・削除|Google Apps Script入門(12月6日)
セルに数式を入れる|Google Apps Script入門(12月1日)

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

1.RangeとCellsの使い方|ExcelマクロVBA入門
2.最終行の取得(End,Rows.Count)|ExcelマクロVBA入門
3.徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)|エクセル関数超技
4.Range以外の指定方法(Cells,Rows,Columns)|ExcelマクロVBA入門
5.セルの参照範囲を可変にする(OFFSET,COUNTA,MATCH)|エクセル関数超技
6.セルのコピー&値の貼り付け(PasteSpecial)|ExcelマクロVBA入門
7.ひらがな⇔カタカナの変換|エクセル基本操作
8.CSVの読み込み方法|ExcelマクロVBAサンプル集
9.変数とデータ型(Dim)|ExcelマクロVBA入門
10.VBAのFindメソッドの使い方には注意が必要です|ExcelマクロVBA技術解説



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

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


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

    ↑ PAGE TOP