ExcelマクロVBA技術解説 | オブジェクト式について | Excelマクロの問題点と解決策、エクセル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プロパティに"新規シート"を代入



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

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

オブジェクトとプロパティの真実
RangeとCellsの深遠




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

Dir関数の制限について
画像サイズ(横x縦)の取得について
文字種(ひらがな、全半角カタカナ、半角英大文字等々)の判定
よくあるVBA実行時エラーの解説と対応
ローカルウィンドウの使い方
オブジェクトの探索方法
変数とプロシージャーの命名について

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

最後の空白(や指定文字)以降の文字を取り出す|エクセル関数超技(3月26日)
先頭の数値、最後の数値を取り出す|エクセル関数超技(3月26日)
Excelファイルを開かずにシート名をチェック|ExcelマクロVBAサンプル集(3月23日)
数式の参照しているセルを取得する|ExcelマクロVBAサンプル集(3月18日)
CSVの読み込み方法(改の改)|ExcelマクロVBAサンプル集(3月17日)
変数とプロシージャーの命名について|ExcelマクロVBA技術解説(2月12日)
ファイルの一覧取得・削除(File)|Google Apps Script入門(1月24日)
フォルダの一覧取得・作成・削除(Folder)|Google Apps Script入門(1月24日)
フォルダとファイルを扱う(DriveApp)|Google Apps Script入門(1月24日)
スプレッドシートが非常に遅い、高速化するには|Google Apps Script入門(1月17日)

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

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



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

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


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

    ↑ PAGE TOP