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

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
最終更新日:2020-10-15

オブジェクト式について

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


ただし「オブジェクト式」という言い方を特別なものとして覚える必要はありません。
あくまでオブジェクトを指定する時の書き方(式)だということです。
その時の書き方として、.(ドット、ピリオド)を使った式で書くという事です。

オブジェクト式の書き方

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

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

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

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

このように、.(ドット、ピリオド)でつなげて書きます。
これを、「オブジェクト式」と呼ぶということです。
.(ドット、ピリオド)は、
ドット演算子」と言います。

この.(ドット、ピリオド)は、と頭の中で訳してVBAを読めば良いものです。
オブジェクト子オブジェクト2孫オブジェクト22
このように、
オブジェクトの中にある子オブジェクト2の中にある孫オブジェクト22
単純にこれだけの事だと考えて良いものです。

オブジェクトは直接指定できない

ここまでの説明は、これはこれで正しいのですが、正確な説明とは言えません。
どちらかというと比喩を含んだ初心者向けの説明となっています。

そもそも、オブジェクトを直接名指しで指定できるのでしょうか・・・
結論を言えば、直接オブジェクトを指定することはできないのです。
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

このようになります。
VBAでは、オブジェクトを指定するための入口として、
Application
というオブジェクトが用意されています。
さらに突き詰めると、Applicationもオブジェクトそのものを直接指定しているわけではなく、さらに上があるのですが、さすがにそこまで考える必要はないでしょう。
ApplicationにRangeプロパティがあるので、
Application.Range("A1").Font.Color = vbRed
これの省略形であるとも言えます。
上記VBAでは全てのオブジェクト階層をたどるように書いています。
Applicationを省略できるApplicationのメソッド・プロパティ一覧
Applicationには多数のメソッド・プロパティがありますが、この中には、Applicationを記述しなければならないものと、Applicationを省略できるものとが存在します。これらの違いはどこから来るのでしょうか… Applicationの全てのプロパティ・メソッドについては、Applicationのプロパティ、
ここで書いているように、正確には「Excel.Global のメンバ」が関係してきますが、
話が込み入ってしまいますので、話の流れをわかり易くするために簡略化して説明しています。

このApplicationを起点として、プロパティを使いオブジェクトを辿っているという事になります。

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

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

メソッドとプロパティの違いについて

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

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


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

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


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

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

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

オブジェクト式の最後に

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

以下の記事も参考にしてください。
オブジェクトとプロパティの真実
オブジェクトとプロパティについて、解説をします。対象は、VBA中級以上になると思いますが、初級の方でも、VBAって奥が深いんだなーと感動位は出来ると思います。(笑) ただし、あまり役には立たないかもしれませんので、あしからず。
RangeとCellsの深遠
RangeとCells特集にします。今さら…と、あなどるなかれ、結構奥が深いのです。すでに説明した内容もありますが、知っておいた方が良い事、知らなくても困らない事(笑) これらを、まとめてみました。まずは基本 A1セルに"エクセル"と入れる場合。



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

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


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

VBA100本ノック 18本目:名前定義の削除|VBA練習問題100(11月6日)
VBA100本ノック 17本目:重複削除(ユニーク化)|VBA練習問題100(11月6日)
VBA100本ノック 16本目:無駄な改行を削除|VBA練習問題100(11月5日)
VBA100本ノック 15本目:シートの並べ替え|VBA練習問題100(11月4日)
VBA100本ノック 14本目:社外秘シート削除|VBA練習問題100(11月3日)
VBA100本ノック 13本目:文字列の部分フォント|VBA練習問題100(11月1日)
VBA100本ノック 12本目:セル結合を解除|VBA練習問題100(10月31日)
VBA100本ノック 11本目:セル結合の警告|VBA練習問題100(10月30日)
VBA100本ノック 10本目:行の削除|VBA練習問題100(10月29日)
VBA100本ノック 9本目:フィルターコピー|VBA練習問題100(10月28日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.マクロって何?VBAって何?|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




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


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



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