結論としては理解した方が良いですね。
知ってた方が書いてるコードと理屈の整合が取れるので理解が早いと思います。
でも最初から全部理解しようとすると難しいかもしれません。私は独学だったのでぼやっと理解するまで数ヵ月かかりました。
勉強初期はあまり深く考えずコードたくさん書こうと思っている派ですがオブジェクトとプロパティの説明が欲しい方も居るのではと思い自分が分からなかったところを意識して記事を書いてみようと思いました。
記事を書いてみようと思ったのはもう一つ理由があります。数日前からVBAの勉強会が始まりました。
まだ初回でしてブログでいうとVBAの①~⑤の記事を使って説明をさせてもらいました。この時点で理解度を確認すると「理解出来た」という人の比率が7割~8割ぐらいでした。最初なので比較的高い理解度だったと思います。
そんな中私の中で力不足を感じているのがオブジェクト、プロパティの説明です。うまく出来ていない気がしています。という事で勉強会でうまく伝えられない自分のフォローをしようと思い付けたしで記事を書こうと思います。
では早速。
オブジェクトとプロパティの関係は1つのオブジェクトを起点としてみた時にオブジェクトに紐付いているプロパティはそのオブジェクトの属性となります。
これは代表例ですがRangeオブジェクトを起点としてみた時にFontやInteriorはRangeオブジェクトのプロパティ(属性)という事になります。(実際のプロパティはもっとたくさん存在します。あくまで一例です。)
セルにはフォントだったり背景色等の情報が紐付いているとイメージすると良いかもしれません。手作業でやる時も「このセルの文字の大きさを〇〇にして・・・」と作業すると思いますが図で表現すると上図のように要素が繋がっているんだなと思ってください。
今度はWorksheetオブジェクトとRangeオブジェクトの関係です。
下図のトップに居るWorksheet(青)とRange(黄)は両方共オブジェクトです。
ただしWorksheetの属性として居るRangeはプロパティです。
WorksheetオブジェクトのRangeプロパティからRangeオブジェクトの値を取得するという方法でコードを繋いでいます。つまりプロパティはその後に続くオブジェクトを引っ張ってくる為の手掛かりのような役割をしています。
上記の様にコードはオブジェクトが繋がって構成されていると思ってください。コードを書く=オブジェクトを繋ぐというようなイメージを持ってもらえると理解が進むと思います。その繋ぎ役でプロパティが居るよという感じでしょうか。
今はRangeプロパティがRangeオブジェクトを引っ張ってくるというざっくりした説明だけなので全部理解するのは難しいと思います。「こんな感じだろうな」というイメージを少しだけでも持てたらOKです。もう少し詳しく説明するので今までの説明をふまえて以下を見ていきましょう。
Range("A1") ="おはようございます"
を省略せずに書いてみます。
Application.workbooks("〇〇.xlsm").worksheets("△△").Range("A1").value = "おはようございます"
となります。以下はオブジェクトとプロパティの関係を言葉と絵で表現してみました。
ここからはオブジェクトブラウザを見ながら上記コードと絵の説明をしてみようと思います。
VBEを画面に展開後F2キーを押すことでオブジェクトブラウザが立ち上がります。
クラスの中に居る外枠白×内装グレーの背景に赤と青と黄色の四角のような物体が居るアイコンがオブジェクトです。コードの先頭に出てきたApplicationオブジェクトを探してみましょう。
Applicationオブジェクトを選択すると(背景青で白文字は選択されているということです)右側に使えるプロパティ、メソッド、イベント等が並びます。
このリストの中からWorkbooksプロパティを探して選択してみます。紙を指で指しているようなアイコンがプロパティ、緑の箱が飛んでるアイコンがメソッド、稲妻のアイコンがイベントです。ここではそれぞれの説明は省略します。上図では点線で囲まれているWorkbooksプロパティを選択すると下のグレー色の枠の中に以下のような表記が出てきます。
実際にコードを書く際はまずApplicationの後はWorkbooksじゃないとダメという事ですね。Applicationオブジェクトが保有しているプロパティの中にWorkbookは居ないのでWorkbookでは繋がらないという事になります。
続いてWorkbooksは読取専用です。コードに書いたWorkboksの引数 ("○○.xlsm") を用いてWorkbookを特定し値を返してもらう事で("〇〇.xlsm")というWorkbookを特定しています。イメージですが直接値を定義するのではなく「値を出力するので読み取ってください」という意味の読み取り専用だと思っています。
序盤にWorksheetオブジェクトとRangeプロパティの関係を説明しましたがこれも同じようにRangeプロパティがRangeオブジェクトの値を返すことで次のオブジェクト(モジュール)にコードを繋いでいるという役割をしています。
Workbookの値が取得出来ているという事で次にはWorkbookオブジェクトをトップにしてシートを指定する為のプロパティを選んでみようと思います。
これもWorkbooksとWorkbookの関係と同じです。WorkbookオブジェクトにはWorksheetsプロパティが居て worksheets("△△") を用いてWorksheetを特定し値を返してもらう事で("△△")というWorksheetを特定しています。
Worksheet以下のRangeは序盤で説明したとおりです。最後のValueは以降にオブジェクトが無いので繋がりません。Valueプロパティ自体に値を代入したりする事になります。
コードの中にWorkbookやWorksheet(両方共単数形ですね)が出てこないのは結果として単体のオブジェクトは特定されていますが別のオブジェクトからもたらされた値を使っているという事になります。
しつこい様ですがコードに注釈をつけると上記のような感じになると思います。
参考ですがエラーが出る書き方をしてみました。これではオブジェクトとプロパティの繋がりが無くエラーが出ます。
オブジェクトからみて「指定したプロパティは持ってないですよ」と言っています。
一つの簡単なコードでも考えていくと結構深くていろんな要素が詰まっています。 長くなってしまいました。読んでいただいた皆様ご理解いただけたでしょうか。