ExcelマクロVBA技術解説
オブジェクト式について

ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説
最終更新日:2015-09-28

オブジェクト式について

オブジェクトは、objectであり、物・物体のことです、
VBAで何か操作をしようとする対象となるものがオブシェクトです、
オブジェクト式とは、オブジェクトを操作しようとしたときに、オブジェクトを特定するための書き方です。


ただし「オブジェクト式」という言い方自体は使う事が少ないです。
あくまでオブジェクトを指定する時の書き方でしかないので、あえて式とつける意味はあまりありません。

オブジェクトを特定する、指定する
と書きましたが、オジュジェクトとは具体的にどのような構造になっているのでしょうか。
簡単に説明する時に、
オブジェクトは階層構造になっていると説明されます。

オブジェクト
  ┣ 子オブジェクト1
  ┃ ┣ 孫オブジェクト11
  ┃ ┗ 孫オブジェクト12
  ┣ 子オブジェクト2
  ┃ ┣ 孫オブジェクト21
  ┃ ┣ 孫オブジェクト22
  ┃ ┗ 孫オブジェクト23
  ┗ 子オブジェクト3
    ┗ 孫オブジェクト31


この時、
孫オブジェクト22
を特定し指定する時の書き方として、


オブジェクト.子オブジェクト2.孫オブジェクト22

このように、.(ドット,ピリオド)でつなげて書きます。
これを、「オブジェクト式」と言っています。
.(ドット,ピリオド)は
ドット演算子」と言います。
プログラミング言語によっては、アロー演算子(->を使い、オブジェクト->子オブジェクト2)が使われます。

ここまでの説明は、これはこれで正しいのですが、正確な説明とは言えません。
そもそも、オブジェクトを直接名指しで指定できるのでしょうか・・・
結論を言えば、直接オブジェクトを指定することはできないのです。
Range("A1")
これは、A1セルのオブジェクトなのですが、
では、
Cells(1, 1)
これも、A1セルのオブジェクトです。
A1セルのオブジェクトは2つの名前を持っているという事になってしまいます。
2つの名前を持つこと自体は不思議な事ではありませんが、どうも釈然としません。
では、
ActiveSheet
これはどうでしょう。

アクティブなシートのオブジェクトになります。
シートタブをクリックして他のシートをアクティブにしたら・・・
ActiveSheetというオブジェクトは、コロコロと実体が変わってしまいます。
これはおかしい、オブジェクトは物・物体で操作対象なのに、
勝手に実体が変わってしまうとはどういう事でしょうか。

Range、Cells、ActiveSheet
これらは、オブジェクトを名指しで書いているわけではありません。
これらは、プロパティなのです。
オブジェクトを直接指定する書き方は無く、プロパティを経由して当該オブジェクトを指定しているのです。

オブジェクト
  ┣ 子オブジェクト1を指すプロパティ、プロパティ名が子オブジェクト1
  ┣ 子オブジェクト2を指すプロパティ、プロパティ名が子オブジェクト2
  ┗ 子オブジェクト3を指すプロパティ、プロパティ名が子オブジェクト3

子オブジェクト2
  ┣ 孫オブジェクト21を指すプロパティ、プロパティ名が孫オブジェクト21
  ┣ 孫オブジェクト22を指すプロパティ、プロパティ名が孫オブジェクト22
  ┗ 孫オブジェクト23を指すプロパティ、プロパティ名が孫オブジェクト23


このようになっています
そして、オブジェクト式の書き方は、


オブジェクト.プロパティ
オブジェクト.プロパティ(引数)


となります、この書き方は大原則であり、例外はありません。

オブジェクト.子オブジェクト2

この時の「子オブジェクト2」は、オブジェクト内のプロパティとしての「子オブジェクト2」なのです。
VBEで、.(ドット,ピリオド)を入力した時、入力候補(インテリセンス)が表示されます。
この入力候補は
.(ドット,ピリオド)の前に記述されているオブジェクトのメンバー一覧です。
メンバーとは、簡単に言えば、オブジェクトの構成要素であるプロパティやメソッドの事です。
従って、.(ドット,ピリオド)の後に書けるのは、プロパティかメソッドという事になります。
また、引数が必要なプロパティは、()内にその引数を指定します。

プロパテは値を保持し、外部から値を設定したり、外部へ値を渡す機能があります。

オブジェクト.プロパティ = 値 ・・・ プロパティに値を設定
変数 = オブジェクト.プロパティ ・・・ プロパティから値を取得
(オブジェクト.プロパティ) ・・・ プロパティから値を取得し関数等の引数として利用

※プロパティから値を取得した場合は、必ずその値を何かに使わなければならないという決まりがVBAにはあります。

オブジェクト.子オブジェクト2

この子オブジェクト2はプロパティなのですが、ここまで書いた時点で、子オブジェクト2から値を受け取っています。
その受け取る値が、子オブジェクト2というオブジェクトなのです。
値と言う書き方をしましたが、
ここで言う値とは単なる数値や文字だけではなく、オブジェクトも含んだ戻り値・返り値の事です。
つまり
オブジェクト.子オブジェクト2 ← これはオブジェクト.プロパティ
この戻り値が、子オブジェクト2であり、
結果として、
オブジェクト.子オブジェクト2
これは、子オブジェクト2を指しているという事です。

ここまでくると、さらに疑問が出てきます。
最初のオブジェクト、これだけいきなりオブジェクトを直接指定している・・・
違います、このオブジェクトも実はプロパティなのです。
オブジェクトの前に、省略されているものがあるのです。

ここからは、実際のエクセルVBAでの記述で説明します。


Range("A1").Font.Color = vbRed

先にも書いたように、このRangeはプロパティです。
そうなると、いきなりプロパティから書き始めていることになります。
オブジェクト.プロパティ
この書き方は大原則であり、例外はありません、と書きました。
これは間違いではありません。
Rangeの前が省略されているだけです。
VBAでは省略形が多く存在します。
Rangeにプロパティを書かないと.Valueになる等々
省略せずに書くと、

Application.ActiveWorkbook.ActiveSheet.Range("A1").Font.Color = vbRed

となります。
※ApplicationにRangeプロパティがあるので、
 Application.Range("A1").Font.Color = vbRed
 これの省略形でもあるのですが、
 話の流れをわかり易くするために、全てのオブジェクト階層をたどるように書いています。

VBAでは、オブジェクトを指定するための入口として、
Application
というオブジェクトを用意してくれています。
さらに突き詰めると、Applicationもオブジェクトそのものを直接指定しているわけではなく、さらに上があるのですが、さすがにそこまで考える必要はないでしょう。
このApplicationを起点として、プロパティを使いオブジェクトを辿っているという事になります。

Application.ActiveWorkbook.ActiveSheet.Range("A1").Font.Color = vbRed
これは、
ApplicationのActiveWorkbookプロパティの戻り値でActiveWorkbookオブジェクトを取得
ActiveWorkbookのActiveSheetプロパティの戻り値でActiveSheetオブジェクトを取得
ActiveSheetのRangeプロパティの戻り値でRangeオブジェクトを取得
Range("A1")のFontプロパティの戻り値でFontオブジェクトを取得
FontのColorプロパティにvbRedを代入



ここまで、プロパティについて書いてきましたが、
メソッドについても同様です。

オブジェクト.メソッド
オブジェクト.メソッド 引数 ・・・ 戻り値を使わない場合
オブジェクト.メソッド(引数) ・・・ 戻り値を使う場合


書き方自体はプロパティとほぼ同等です。

オブジェクト.メソッド ・・・ メソッドを実行、戻り値がないか使わない場合
変数 = オブジェクト.メソッド ・・・ メソッドを実行し戻り値を取得
(オブジェクト.メソッド) ・・・ メソッドを実行し戻り値を関数等の引数として利用


プロパティとの違いは、戻り値が存在しないメソッドがあるという点だけです。
さらに、戻り値が存在していても、その戻り値を使用せず無視することが許されている点が大きく違います。
WorkSheets.Add
このAddメソッドは、挿入したワークシートを戻しますので、
Set ws = WorkSheets.Add
このように戻り値を使うことが出来ますが、
WorkSheets.Add
とだけ書いて、戻り値を無視しても良いことになっています。
その他は、プロパティとほぼ同様になります。

Application.ActiveWorkbook.Worksheets.Add.Name = "新規シート"

これは、
ApplicationのActiveWorkbookプロパティの戻り値でActiveWorkbookオブジェクトを取得
ActiveWorkbookのWorksheetsプロパティの戻り値でWorksheetsコレクション(オブジェクトの集合体)を取得
WorksheetsのAddメソッドを実行し、戻り値で追加されたWorkSheetオブジェクトを取得
追加されたWorkSheetのNameプロパティに"新規シート"を代入



最初に書きましたが、
特に、「オブジェクト式」という言葉を覚える必要はありません。
オブジェクトを特定し指定する時の書き方として、
プロパティ・メソッドの戻り値(これがオブジェクト)を使ってオブジェクトにたどり着いているという事を理解すればよいです。

以下の記事も参考にしてください。

オブジェクトとプロパティの真実
オブジェクトとプロパティについて、解説をします。対象は、VBA中級以上になると思いますが、初級の方でも、VBAって奥が深いんだなーと感動位は出来ると思います。(笑) ただし、あまり役には立たないかもしれませんので、あしからず。
RangeとCellsの深遠



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

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


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

CSVの読み込み方法(ジャグ配列)|VBAサンプル集(7月15日)
その他のExcel機能(グループ化、重複の削除、オートフィル等)|VBA入門(7月14日)
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス|VBA技術解説(7月6日)
オートフィルタを退避回復するVBAクラス|VBA技術解説(7月6日)
IfステートメントとIIF関数とMax関数の速度比較|VBA技術解説(6月23日)
Withステートメントの実行速度と注意点|VBA技術解説(6月6日)
VBA+SeleniumBasicで検索順位チェッカー(改)|VBA技術解説(6月2日)
マクロでShift_JIS文字コードか判定する|VBA技術解説(6月1日)
Shift_JISのテキストファイルをUTF-8に一括変換|VBAサンプル集(5月31日)
「VBAによる解析シリーズその2 カッコ」をやってみた|エクセル(5月21日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.変数とデータ型(Dim)|ExcelマクロVBA入門
5.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄
9.ひらがな⇔カタカナの変換|エクセル基本操作
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • オブジェクト式について

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


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




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