オブジェクト式について
オブジェクトは、objectであり、物・物体のことです、
VBAで何か操作をしようとする対象となるものがオブシェクトです、
オブジェクト式とは、オブジェクトを操作しようとしたときに、オブジェクトを特定するための書き方です。
あくまでオブジェクトを指定する時の書き方(式)だということです。
その時の書き方として、.(ドット、ピリオド)を使った式で書くという事です。
オブジェクト式の書き方
と書きましたが、オジュジェクトとは具体的にどのような構造になっているのでしょうか。
簡単に説明する時に、
オブジェクトは階層構造になっていると説明されます。
オブジェクト
┣ 子オブジェクト1
┃ ┣ 孫オブジェクト11
┃ ┗ 孫オブジェクト12
┣ 子オブジェクト2
┃ ┣ 孫オブジェクト21
┃ ┣ 孫オブジェクト22
┃ ┗ 孫オブジェクト23
┗ 子オブジェクト3
┗ 孫オブジェクト31
この時、
孫オブジェクト22
を特定し指定する時の書き方として、
オブジェクト.子オブジェクト2.孫オブジェクト22
このように、.(ドット、ピリオド)でつなげて書きます。
これを、「オブジェクト式」と呼ぶということです。
.(ドット、ピリオド)は、
「ドット演算子」と言います。
オブジェクトの子オブジェクト2の孫オブジェクト22
このように、
オブジェクトの中にある子オブジェクト2の中にある孫オブジェクト22
単純にこれだけの事だと考えて良いものです。
オブジェクトは直接指定できない
どちらかというと比喩を含んだ初心者向けの説明となっています。
結論を言えば、直接オブジェクトを指定することはできないのです。
Range("A1")
これは、A1セルのオブジェクトになります。
ですが、
Cells(1, 1)
これも、A1セルのオブジェクトです。
A1セルのオブジェクトは2つの名前を持っているという事になってしまいます。
2つの名前を持つこと自体は不思議な事ではありませんが、どうも釈然としません。
では、
ActiveSheet
これはどうでしょう。
アクティブなシートのオブジェクトになります。
シートタブをクリックして他のシートをアクティブにしたら・・・
ActiveSheetというオブジェクトは、コロコロと実体が変わってしまいます。
これはおかしい、オブジェクトは物・物体で操作対象なのに、
勝手に実体が変わってしまうとはどういう事でしょうか。
これらは、オブジェクトを名指しで書いているわけではありません。
これらは、プロパティなのです。
オブジェクトを直接指定する書き方は無く、プロパティを経由して当該オブジェクトを指定しているのです。
オブジェクト
┣ 子オブジェクト1を指すプロパティが「子オブジェクト1」
┣ 子オブジェクト2を指すプロパティが「子オブジェクト2」
┗ 子オブジェクト3を指すプロパティが「子オブジェクト3」
子オブジェクト2
┣ 孫オブジェクト21を指すプロパティが「孫オブジェクト21」
┣ 孫オブジェクト22を指すプロパティが「孫オブジェクト22」
┗ 孫オブジェクト23を指すプロパティが「孫オブジェクト23」
このようになっています
そして、この時のオブジェクト式の書き方は、
オブジェクト.プロパティ
オブジェクト.プロパティ(引数)
このようになります。
この書き方は大原則であり、例外はありません。
オブジェクト.子オブジェクト2
この時の「子オブジェクト2」は、オブジェクト内のプロパティとしての「子オブジェクト2」なのです。
VBEで、.(ドット,ピリオド)を入力した時に入力候補(インテリセンス)が表示されます。
この入力候補は、
.(ドット,ピリオド)の前に記述されているオブジェクトのメンバー一覧です。
メンバーとは、簡単に言えば、オブジェクトの構成要素であるプロパティやメソッドの事です。
従って、.(ドット,ピリオド)の後に書くのは、プロパティやメソッドという事になります。
また、引数が必要なプロパティは、()内にその引数を指定します。
変数 = オブジェクト.プロパティ ・・・ プロパティから値を取得
(オブジェクト.プロパティ) ・・・ プロパティから値を取得し関数等の引数として利用
オブジェクト.子オブジェクト2
この子オブジェクト2はプロパティなのですが、ここまで書いた時点で、子オブジェクト2から値を受け取っています。
その受け取る値が、子オブジェクト2というオブジェクトなのです。
ここで言う値とは単なる数値や文字だけではなく、オブジェクトも含んだ戻り値・返り値の全般を指します。
つまり
オブジェクト.子オブジェクト2 ← これはオブジェクト.プロパティ
この戻り値が、子オブジェクト2であり、
結果として、
オブジェクト.子オブジェクト2
これは、子オブジェクト2を指しているという事です。
オブジェクト式の書き始めは何か
最初のオブジェクト、これだけいきなりオブジェクトを直接指定している・・・
違います、このオブジェクトも実はプロパティなのです。
オブジェクトの前に、省略されているものがあるのです。
Range("A1").Font.Color = vbRed
先にも書いたように、このRangeはプロパティです。
そうなると、いきなりプロパティから書き始めていることになります。
オブジェクト.プロパティ
この書き方は大原則であり、例外はありません、と書きました。
これは間違いではありません。
Rangeの前が省略されているだけです。
VBAでは省略形が多く存在します。
Rangeにプロパティを書かないと.Valueになる等々
省略せずに書くと、
VBAでは、オブジェクトを指定するための入口として、
Application
というオブジェクトが用意されています。
さらに突き詰めると、Applicationもオブジェクトそのものを直接指定しているわけではなく、さらに上があるのですが、さすがにそこまで考える必要はないでしょう。
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技術解説」の記事
画像サイズ(横x縦)の取得について
文字種(ひらがな、全半角カタカナ、半角英大文字等々)の判定
オブジェクトとプロパティの真実
オブジェクト式について
オブジェクトの探索方法(オートシェイプのTextを探して)
条件付きコンパイル(32ビット64ビットの互換性)
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)
VBAでファイルを既定のアプリで開く方法
Excelアドインの作成と登録について
VBAでのタイマー処理(SetTimer,OnTime)
マクロでShift_JIS文字コードか判定する
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(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)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- オブジェクト式について
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。