★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0036:タイトル:なぜあなたが「いつまで経ってもVBAが上達しないのか?」03 「プロパティ」の真実?正体?その1(Property Get プロシージャ)~ついでに、VBAの「真の基礎」のひとつ、「クラスモジュール」の簡単なモノの自作と操作について~ 02
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0036
タイトル:なぜあなたが「いつまで経ってもVBAが上達しないのか?」03 「プロパティ」の真実?正体?その1(Property Get プロシージャ)~ついでに、VBAの「真の基礎」のひとつ、「クラスモジュール」の簡単なモノの自作と操作について~ 02
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
お久しぶりでサボっててすみません。
いろいろあってなかなか書けませんでした。ごめんなさい。
前回の続きですが、今回のテストでは、前回と同様のプログラムを、F8キー「だけ」を使って、より細かく、実行の様子を、一部、見てみたいと思います。
(※「自作obj操作1st」というモジュールの「test001()というプロシージャ(プログラム)」を使います。)
今回は特に「プロパティ」と「メソッド」についても見てみます。
以下の、(01)~ のことに注意しながらF8キー実行しつつ、色々と見てみてください。
(※いつおどおり、前置き長いです。しかも愚痴です。でも大切なこと、です。上達したかったら、是非、読んでみてください。愚痴ですみませんけど。)
★ (01) ★
「プロパティ」も「メソッド」も実は「実行」するモノで、その実行時には、「クラスモジュール」の中に書かれた「プロシージャ」の中を通過する。
ならば、「プロパティ=状態(属性)=値」ではなく、「プロパティ=プロシージャ=命令の一種」ではないのか?
ならば、「メソッドも=動作=動詞」ではなく、「メソッド=プロシージャ=命令の一種」ではないのか?
なぜ日本の VBAの書籍やWebページ、動画、では、
「プロパティ=状態(属性)=値」とか、
「メソッドも=動作=動詞」、
みたいなことしか書いてないのか?言ってないのか?
言わないなら、なぜ、
「プロパティ=プロシージャ=命令の一種」や
「メソッド=プロシージャ=同じく命令の一種」のことを、
「次のステップのための学習項目として示唆しないのか?」
「ステップアップのための」
「学習項目として示唆しないのか?」
「上達の道しるべを示さないのか?」
ということは(言わないなら)、それは「騙し」「カモり」ではないか?
★ (02) ★
今回の「プロパティ」と「メソッド」は下記の通りなので、その各命令たちが、どこにジャンプして、動いているか?
下記の事柄と実際のF8キーステップ実行での動き(その各命令たちが、どこにジャンプして、動いているか?)とを併せて見てみることで、
さらに、
「プロパティ=プロシージャ=命令の一種」や
「メソッド=プロシージャ=同じく命令の一種」、
ということがなんとなくイメージできるかと思います。
▼【今回のオブジェクト】
今回のオブジェクトは、「A1セル」「だけ」を「操作する」「装置」です。
※「オブジェクト」とは「=装置」のことです。
「装置=オブジェクト」には、
「目に(画面上に)見える/見えない、大きい/小さい」、があります。
目に(画面に)見えないオブジェクトは、「メモリの中」に生成されています。
できています。スケルトンな感じのイメージの「装置」です。
「大きい/小さい」」については、
後述の「プロパティとメソッド」の合算数が多いもの(40個以上)が「大きい」で、
少ないモノ(20個以下)が「小さい」・・・というイメージです。
(あくまでも僕の勝手なイメージで決まりではありません。が、そう考えると
少しラクになります。)
今回の「装置」は、プロパティとメソッドを併せても数個なので、
「小さい」部類の「装置=オブジェクト」だ、ということになります。
A1セルだけを操作する装置なので、いちおう、目に(画面に)見える・・・、
ということ?でいい?・・・、 のかも?
※ちなみにですが、組込みの「コレクションオブジェクト(通称「コレクション」)
は、おそらくですが全部、「小さい」部類の「装置=オブジェクト」です。
▼【装置の名前、装置の型】(=オブジェクトの名前、オブジェクトのデータ型)
「A1セルonly操作装置1st」 ※←これはクラスモジュールの名前と同じです。
※自作のオブジェクト(装置)は、「クラスモジュール」で作りますが、
そのオブジェクト名とオブジェクトの型、固有型の名前は、同じです。
更に言うと、両方とも、その「クラスモジュール」につけた名前と同じです。
今回は、「 A1セルonly操作装置1st 」というクラスモジュールの名前がそれです。
それが、オブジェクト名、オブジェクトの型名(固有型名。総称型名ではなくて。)
にもなります。
▼【プロパティ】
今回は、「A1セルonly操作装置1st」という「装置」に含まれる「設定系」の
機能=命令。です。
「プロパティ」はオブジェクトの状態(属性)の各種「設定値(プロパティ値)」を、
取得したり(=読んだり)、
設定したり(=書き換えたり)という、
「動き」、
をします。(読めるだけで設定できないとか、その逆もありますが。)
よって、「何らかの」「動きをする」という点では、「メソッド」と同じで、
つまりは、「装置(=オブジェクト」が「内包・所有」している「機能であり、命令でもあります」。
「オブジェクト(=装置)」を「液晶TV」に例えると、「プロパティ」は、例えば、
「音量の設定をする」、
「画面の色あい(彩度やコントラストなど)の設定をする」、
「時刻設定をする」、
「チャンネル設定をする」、
といった感じの、
「設定系」に「偏った」、「限定された」、
そういう機能・命令です。(つまり、なんにせよ、実は「動詞」です。)
それが「プロパティ」です。
※「プロパティ」は、本来は「動詞」なのに、ウソついて、「名詞とか形容詞?(か何か)」みたいなことを書いてある市販書籍・Web記事・動画・雑誌記事等々が多すぎるので「騙されないように」ご注意ください。
そんな「ウソ」を信じていると、ヘルプもオブジェクトブラウザもウォッチウィンドウも読めなくさせられて、自力でのエラー解決が不可能・あるいは、10倍やりづらくなる、永遠にカモられ続ける、という「ドツボにハメさせ」られます。
基本的には、「プロパティ」も、「命令の一種」として、「動く」・「モノ」であって、
「値」や「状態」「属性」ということ「だけ」ではありません。
繰り返しになりますが、特に、
「自作じゃない・組み込みのプロパティ」の場合は、
『 プロパティとは、「値」や「状態」「属性」のことである・・・』という状況に
なる事態は
まず無いです。 (多分。例外はあるかもしれませんが。)
「自作じゃない・組み込みのプロパティ」には、
「状態」や「属性」、つまり「値」を「設定する or 読む という」「 ”動きをする ”」、
という、そういう「=機能=命令」しか存在しません。
「設定系」に「限定」されてはいますが、でも「動く」「モノ」、「動く」「命令」なのです。
※一方、「組み込みのプロパティ」じゃなくて、「自作の」プロパティの場合は、Public変数などが「状態」や「属性」、つまり「値」というケースも一応あります。その場合は、インテリセンスのドロップダウンにも出てきます。
で、今回のオブジェクトのプロパティは、以下の通りです。
プロパティ01_値の状態G・・・・・A1セルの入力値の状態を読んだり(取得したり)設定したりする機能=命令
プロパティ02_色の状態設G・・・・A1セルの色の状態を読んだり設定したりする機能=命令
プロパティ03_高さの状態設G・・・A1セルの高さの状態を読んだり設定したりする機能=命令
プロパティ04_幅の状態設定G・・・A1セルの幅の状態を読んだり設定したりする機能=命令
プロパティ98_値の読み書きG・・・「プロパティ01_値の状態G」と同じ。付けた名前が異なるだけ。
プロパティ99_A1セル_だけ_をオブジェクトとして返すG・・・A1セルを「オブジェクトとして返す」だけの機能=命令
▼【メソッド】
今回は、「A1セルonly操作装置1st」という「装置」に含まれる「動作系」の
機能=命令。です。
何らかの「動きをする」という点で、は「プロパティ」と同じで、
つまりは、「装置(=オブジェクト)」が「内包・所有」している「機能であり、命令でもあります」。
プロパティのときと同様、
「オブジェクト(=装置)」を「液晶TV」に例えた場合、「メソッド」は、例えば、
「地上波放送を映す」、
「BS放送を映す」、
「HDD録画する」、
「CDを再生する」、
「DVDやブルーレイを再生する」、
「DVDやブルーレイに録画する」、
「Youtubeを映す」
「インターネットを見る」
「ネットショッピングをする」
「リモコンで双方向の通信をする」
といった感じの(=設定系の命令ではない)、「動作系?・実行系?」の機能・命令です。(これも「動詞」です。)
それが「メソッド」です。
で、今回のメソッドは以下のとおりです。
メソッド01_A1セル_だけ_をオブジェクトとして返す()・・・このメソッドの動きは、
「プロパティ99_A1セル_だけ_をオブジェクトとして返すG」という「プロパティ」と同じ動き=機能=命令。をします。
(※メソッドでもプロパティでもどちらでも「オブジェクトを返す」という動きをする、
させられる、という一例と思って頂けると幸いです。)
メソッド02_値が100ならメッセージ()・・・A1セルの入力値が「100」だったときだけ、メッセージを発する機能=命令。
(※他言語も含めて、いわゆる「メソッド」の動き、です。「何も返さずに、何らかの動きをするだけ」、という。)
F2キーでオブジェクトブラウザを開くと、「クラス」のペインに「A1セルonly操作装置1st」というものがあるので、それをクリックすると、そこでも、上記の 【プロパティ】と【メソッド】のリストを見ることができます。
下部の「説明」ペインにて、何が返ってくるか、こないのか、なども分かります。
(※もし「AS」の次に何か書いてあれば、それは、「一般データかオブジェクトかのいずれかの ” 値 ” が返ってくる」ということを示してします。「AS」すら、何も書いてなければ、何も返ってこない、あるいは、「型が特定できない何かが返ってくる」は決まっているんだけれども、でも、オブジェクトブラウザには書かれていなくて、「ヘルプかウォッチウィンドウにしか書かれていない」、ということになります。)
★ (03) ★
(多分)全部で1000個以上ある「組込のプロパティやメソッド」のそれぞれの「各ヘルプページ」には、「プロパティ=状態(属性)=値」とも「メソッドも=動作」とも書かれていないです。そのことは正しい。逆に「プロパティ=状態(属性)=値」や「メソッド=動作」は「半分ウソ」。
正しいのはそれプラス、
「プロパティ=プロシージャ=命令=機能」であり、
「メソッド=プロシージャ=同じく、命令=機能」だ、ということ。
というか、そちらの場合がほとんど。
特に、
自作のプロパティに関してだけは、(クラスモジュールに書いた Public変数によって)「プロパティ=状態(属性)=値」というケースが若干ありえても、
組込のプロパティには、「プロパティ=状態(属性)=値」というケースは「無い」といってもいい。
です。
F8キー実行で、プロパティやメソッドの実行が、「クラスモジュールの中のプロシージャを通過する」ということを「実際に見る・目で見て確認する」ことで、それを「なんとなく」でも確認できると思います。
少なくとも、「多くのケースで」
「プロパティ=状態(属性)=値」「★ ではないな ★」ということが、
「どっちかって言うと(設定系に限定されて・偏ってはいるものの)、命令・動きだよね」ということが、
なんとなくても、体で、理解できると思います。
なお、例えば(多分)500個以上ある組込みの「プロパティ」の、
各種のそれぞれの「プロパティのヘルプページ」では、実際に、
「××を返します(=値を返す動作をします)」とか
「××を取得します」、
あるいは「××を設定します」、
「値の取得のみ可能です。(つまり設定は不可能です。できません。)」、
「値の設定のみ可能です。(上記の逆。取得ができない。)」、
という解説がほとんど「すべて」です。
「プロパティ=状態(属性)=値」というニュアンスのことが「冒頭に」書いてあるヘルプページは、
「1つもありません」。
(※「プロパティ値」のことを「プロパティ」と略して解説してあることは結構ありますが。)
結局、「プロパティ」、とは・・・、特に組み込みのプロパティの場合は、「値」のことではなく、
「設定する/しない」
「読む・取得する/しない」という
「動き」
「をする」、
モノなのです。
メソッドと同じように「何らかの」「動き」を「する」モノです。
ただ、その「動き」が「設定系のモノ」に限られてはいますが。
ただし、
プロパティの、「用語としての解説」の場所にのみは、
「プロパティ=命令・プロシージャ」という意味ではなく、
「プロパティ=属性」的な意味合いのことが、
書いてあります。例えば以下のように。
↓これはExcel2010、2003のヘルプでの「プロパティ」の用語解説です。
↓(※「オブジェクト、プロパティ、メソッド、およびイベントの概要」からの
↓ 「プロパティ」という単語のHTMLのリンクの解説)
『 特定のオブジェクトの属性を表す名前。プロパティの値によって、オブジェクトの動作や外観 (サイズ、色、画面上の位置、選択可能かどうかなど) が決まります。 』
ただ、これが諸悪の根源だったのかもしれません。
理由は、この記述のせいで、
「頭を使わない」、
「4流以下のVBA講師たち(20年前~現在に至るまでの全員が対象)」が、
「ヘルプにもそう書いてあるから」と「安易に」「言い訳・手抜きする原因」になってしまった・・・、
と推測できるからです。
「頭を使わない」
「4流以下のVBA講師たち(20年前~現在に至るまでの全員が対象)」は、
「VBAの真の基礎であるクラスモジュール」のことをまったく考慮に入れずに、
「ヘルプにそう書いてあるから」「難しいから」と自分勝手な都合のいい解釈・理由だけで、
「他のもっと上手い・分かりやすい説明方法を考えようともせず」、
「20年以上」
「サボりにサボってきました」。
「プロパティなどの説明に手を抜くことに終始して」、「真の解説」から逃げまくってきました。
で、現在の、このていたらくです。
Excelが出て 20年以上のあいだに、もっと、プロパティのことはおろか、
(SQLとかその他)色んなことを「VBAの初級クラス」で教えられたでしょうに、
そういうことがまったくできずに(恐らくあえてせずに)、
「日本のデータ管理の進歩」を「阻害し」
「ダメなものになり果てさせて・腐らせて」きました・・・、
と勘繰られても言い訳できないほどの状況にしてきてしまっています。
そして誰もそこに「責任」を感じていません。
「日本の ” データ管理そのもの ” をダメにしてきた」のに、です。
そして、「プロパティ=状態(属性)=値」とか、「メソッドも=動作」とかの、
「手抜きもたいがいにしてほしい」、「テキトー過ぎる」説明により、
「ヘルプはもちろん」、
「それだけではなく」、
「オブジェクトブラウザ」すらも、
「まともに」、
「読めない」・「使えない」、
「生徒」さん、
を
「量産」、
してきました。
そして、
彼ら(講師たち)の著書で独学する学習者については、
「自力で何か(=オブジェクト、プロパティ、メソッド、Enum、ほか)を調べる能力がゼロ」、
「書籍やWebのサンプルのコピペしかできない」、
「掲示板でQ&Aしても回答の意味が分からない」、
「エラーなんて自力で解決できるわけない」、
などの人間を量産してきました。
そして、誰もそこにも、「責任」を感じていません。
ExclVBA教育界の一番の問題は、
「自分たちが ”VBA ”も ”SQL ”もまともに教えてこずに」、
「プログラミングの領域以外にも」、
「日本の ” データ管理の現場 ” をダメにしてきた犯人」なのに、
(プログラミングしてれば、問題が解決できなくても仕事をしたと思ってる人間を増やしもした)
にもかかかわらず、
「こんなことではアカンかった」と、
「誰一人として」、
「反省・責任を」
「感じてない」、
ということです。
むしろ、「日本のビジネスのプログラミングを支えてきた」という「自負」さえあるようなのです。
「あきれる」としか言いようがありません。
これはまるで、
「俺たちの仕事は、”プログラミングを教えることだけ” だ!」
「いいか?VBAなんてもんはなあ、VBAで簡単な・でも大量な入力ができて、自分が早く帰れればVBAの役目はそこで終わりなんだよ!」
「複雑な条件別の集計やリストアップや ”分析 ”だと?そんなもん、どうなろうと知ったことか!」
「会社の事なんか知るか!」
「日本のデータ管理のことなんて知るか!」
「日本のデータ管理が他国に後れを取ろうが、そんなことは知ったことか!」
と言わんばかりです。
もちろん、誰も実際には表立ってそう言ってはいませんが。
でも、本来は
「複雑な条件別の集計やリストアップや ”分析 ” やシュミレーション、統計など」のための、
「他国に後れを取らないため」の、
「VBA」、
のハズなのに。
これは、出版社の人も動画の人もみな同罪だと思います。
ちなみにですが、これは「メソッド」の場合でも似たような状況です。
例えば(多分これも)500個以上ある組込みの「メソッド」については、「××を返します」か「××をします」的な解説がほとんど「すべて」で、「明確に」「メソッド=動作=動詞」といったことを説明しているヘルプの文章はほとんどありません。
今回のコードをF8キーで実行していくと、そういったことを「明確にして」「本当の基礎・基本」に向き合えるようになると思います。
大袈裟かも知れませんが、そうなれるといいな、と思います。
上達が早まりますから・・・・。
=================
=================
色々と愚痴を書いてしまって申し訳ありませんでしたが、では、実際に、
「自作obj操作1st」というモジュールの「test001()というプロシージャ(プログラム)」を
F8キーでステップ実行していきたいと思います。
ダウンロードできてない人は、前回の号を読んでダウンロードするか、以下からダウンロードしてください。
https://euc-access-excel-db.com/00000WPZIP/own_make_obj_smpl.zip
から、「own_make_obj_smpl.zip」という圧縮ファイルをダウンロードしてください。
解凍すると
「簡易的な自作のオブジェクトや自作のプロパティ、メソッドWpSample.xlsm」
というファイルが出てきます。
それを好きな場所に置いてください(デスクトップとかでOKです。)
で、それを開き、さらに、Alt+F11でVBEを開きます。
それの、「自作obj操作1st」というモジュールをダブルクリックして開き、
その一番上、
「test001()というプロシージャ(プログラム)」に点滅カーソルを置きます。
そしたらその中に、
次の、
Debug.Print o_Obj01.プロパティ99_A1セル_だけ_をオブジェクトとして返すG.Address
という1文の命令を、
Debug.Print o_Obj01.メソッド01_A1セル_だけ_をオブジェクトとして返す.Address
という行の直後にコピペして書き加えてください。
これによって、
「メソッドでもプロパティでも」
「オブジェクトを返すだけ」という「動き」を取る(あるいは「させる」)ことができる・・・、
ということが、なんとなくでも分かると思います。
ではまず最初にF8キーを押します。下図のようになります。
もう一回押します。下図のようになります。
これは、
「Set o_Obj01 = New A1セルonly操作装置1st」という命令によって、
今まさに、オブジェクト変数の「o_Obj01」に、
実際に「A1セルonly操作装置1st」という「クラスモジュール=オブジェクト」を代入しようと
している直前の場面・段階です。
それによって、「クラスモジュール=オブジェクト」を「実体化(=インスタンス化)」します。
では、ここで「o_Obj01」を青色反転表示させてウォッチウィンドウにドラッグしてください。
下図のようになります。
「型」の列に、「A1セルonly操作装置1st」と書かれていて、中身の「値」はまだ「Nothing(空っぽ)」ですよね。
左端にも「+」マークは出ていません。
ではこの黄色い行のコード、
「Set o_Obj01 = New A1セルonly操作装置1st」という命令
を実際に実行します。
H8キーを押してください。下図のようになります。
「値」の列の「Nothing(空っぽ)」が消えて無くなり、左端にも「+」マークが出てきました。
これでクラスモジュールの内容(=オブジェクト)が、
オブジェクト変数の「o_Obj01」に、代入されたようです。
ではここで、「+」マークをクリックしてみましょう。
下図のようになります。
前述の
★ (02) ★
の
▼【プロパティ】
のところでご説明したプロパティが全部表示されて、かつ、「値」の列も全部、
ちゃんと値が埋まっていますね。
これは前回の号でやった、F2キー押下でのオブジェクトブラウザの画面とよく似ていますね。
(下図)
メソッドたちは表示されていませんが、プロパティたちは全部、表示されています。
オブジェクトブラウザでは、
「今使えるオブジェクトやプロパティやメソッド、列挙、定数」などが、
「全部表示」
されます。
ですので、
その内容と同じものが(プロパティだけですけれども、でも)
「ウォッチウィンドウ」に、
「オブジェクト変数 o_Obj01」の
「中身」
として
「映っている」
ということは、
やはり、
『 オブジェクト変数の「o_Obj01」の中に、そいつらが入った、んだよね~?たぶん。。。』
ということが、なんとなくでもイメージしていただけるのではないでしょうか?
で、実際、そういうことなんです。
いま、
『 オブジェクト変数の「o_Obj01」の中に、” そいつら ” が入りました。』
(※厳密にはオブジェクトへの「ショートカットアイコン=アクセスするためのメモリアドレス」が
代入されるらしいんですが、今はそこまで深く考えなくてもいいと思います。)
ちなみにですが、イミディエイトウィンドウに「selection」と書いて青色反転選択し、
ウォッチウィンドウにドラッグしてみてください。下図のようになります。
「値」の列に「Object/Range」と書かれていて、左端に「+」マークが出ています。
これは「Object型/かつ/Range型だよ」みたいな意味じゃないかと推測するんですが、
オブジェクト変数の「o_Obj01」のほうは、
「A1セルonly操作装置1st/A1セルonly操作装置1st」となっているので、
「A1セルonly操作装置1st型/かつ/A1セルonly操作装置1st型だよ」みたいな意味なんでしょうか?
よくわかりませんが、でも、IntegerやLong、Variant、などとは「違う」ということだけは、
明確にわかります。
そして、前述しましたように、
「クラスモジュールの名前」が「オブジェクト名」や「オブジェクトの型名になる」
ということが、ここでも、なんとなくでも、イメージしていただけたのではないかと思います。
さらにちなみにですが、以前の号でもやりましたが、
『 ウォッチウィンドウ(とローカルウィンドウ)で、左端に 「+」マークが出てくるモノは、
オブジェクトか配列かのいずれか 』
ということをやりました。
配列の場合は、
必ず「型」の列に、「×××/×××(1 to 2 , 1 to 3)」みたいに
「to」と「カッコ」が出てきますので、今回は、それは「無い」ですから、
「配列ではない」
「なら、残りはオブジェクトだ」
ということも分かります。
では、
これからさらにF8キー押下の繰り返しで、このプロパティやメソッドたちの「実際の中身」に、
飛び込んで、その中のプログラムを実際に見ていきます。
「Debug.Print o_Obj01.プロパティ01_値の状態設定G」の行が黄色くなった状態だと思いますので、
そのままF8キーを押して、そのコードを実行してみます。
あれ!!!????
いきなり画面が、切り替わってしまいましたよね?
「なんか ワケワカラン!」みたいな・・・。
・・・というわけで、
ちょっと見ていきましょう。
ひとまず、どこが見た目的に変化したのでしょうか?
まず、「プロジェクトエクスプローラ」の中で、淡いグレーがついていた場所が変わります。
さっきまでは
「自作obj操作1st」淡いグレー色が付いていたのですが、
今は
「A1セルonly操作装置1st」に淡いグレー色が付いています。
そして、プロパティウィンドウもそれに伴って変わりました。
これは何を意味しているかといいますと、多分、もうお分かりだと思いますが、
まず、
★「自作obj操作1st」という標準モジュールから、
★「A1セルonly操作装置1st」というクラスモジュールに、
★ コードの実行場所が移動した。移動された。ジャンプした。
ということを意味しています。
あと、普通のコードペインの中身も表示がかわりました。
「test001()」プロシージャから、
「プロパティ01_値の状態設定G()」プロシージャに
切り替わっています。
これは、先程のモジュール間の移動も併せて考えると、
★「自作obj操作1st」標準モジュールの「test001()」プロシージャから、
★「A1セルonly操作装置1st」クラスモジュールの「プロパティ01_値の状態設定G()」プロシージャに
★ コードの実行場所が移動した。移動された。ジャンプした。
ということを意味しています。(下図参照)
これはつまり、
ちょっとわかりにくいかもしれませんが、
こちらの ↓
↑ この図と後述の詳細説明をよく読んで参考にしてほしいのですが、
★★★★ 「今、”プロパティ ” の中に入った」
ということも意味しています。
★「Property Get プロパティ01_値の状態設定G() As Double」の行が黄色くなっているわけですので・・・。
★ 今、私たちは、「test001」から移り変わって、「プロパティ01_値の状態設定G」という名前の「プロパティの中」に「入った」のです。
そしてその中のコードを目にしています。
下図の赤枠の「プロパティの中を」、です。
(下図はそれぞれ、オブジェクトブラウザ、ウォッチウィンドウの画面です。)
まわりくどくてすみませんが、あえて、細かく説明してみました。
おわかりになりましたでしょうか?
※図の中の説明を再度、もう少し詳しめに書いておきますのでご参考にしてください。
(かえってわかりにくくなってしまったらごめんなさい。)
(01)「Debug.Print o_Obj01.プロパティ01_値の状態設定G」というコードの
「o_Obj01」のすぐ後ろの「.(ドット)」をいったん消して、
そのままの状態でまた「.(ドット)」を半角で入力します。
インテリセンスが働いて、ドロップダウンリストが出てきます。
(02)その出てきたドロップダウンの一番上には、
「プロパティ01_値の状態設定G」というリスト項目があります。
(03)そしてそのリスト項目の先頭には、「プロパティ」を意味するアイコンが付いています。
このことから(=このアイコンだけで)、
「Excelは(またはExcelVBAは)」、
「それを完全に ” プロパティだ ” と 認識・判断している!!」ということが、
「間違いない」「確定している」
と分かります。そう言えます。
※いきなり「間違いない」「確定している」と説明されても「なんで?」となって
しまうかもしれませんが、VBE、ヘルプ、オブジェクトブラウザ、
ウォッチウィンドウの「アイコン」は「確実」かつ「断定できるモノ」なので、
すみませんが、深い理由は考えずにそのように理解してしまってください。
(04)同時に、その項目の名前は、
「Debug.Print o_Obj01.プロパティ01_値の状態設定G」というコードの終わりの
「プロパティ01_値の状態設定G」という部分とまったく同じ名前です。
(05)ということは、つまり=(03)と(04)を併せて考えると、
「Debug.Print o_Obj01.プロパティ01_値の状態設定G」というコードの、
「プロパティ01_値の状態設定G」という部分は、
「明確に」、「まちがいなく」、
「プロパティである」、
ということが分かります。
このとき、もしリストの項目に「プロパティ~~~」と接頭語が付いていなくてもアイコンだけでも「そうだ」と判断できます。
(06)そして、「o_Obj01」には今、「A1セルonly操作装置1st」が代入されています。
つまり、
「o_Obj01.プロパティ01_値の状態設定G」というモノは、
「意味合い」的には、
「A1セルonly操作装置1st.プロパティ01_値の状態設定G」と、同じようなモノだ、
といえます。
そして繰り返しになりますが、その「プロパティ01_値の状態設定G」は、(03)より、
「アイコンだけで見ても」
「明らかに」
「間違いなく」
「プロパティ」
です。
(07)で、
「Debug.Print o_Obj01.プロパティ01_値の状態設定G」というコードを実行したとたん、
コードの実行は、その「意味合い」どおり、
「A1セルonly操作装置1st というクラスモジュールの プロパティ01_値の状態設定G」
という「Propertyプロシージャ」に
ジャンプし(移り)、
コードの実行が継続されています。
ということは(=(03)(05)(06)から)、
「確実にプロパティであると断定できるモノ」が、F8キー押下でそこにジャンプしたわけですから、
逆にこれは、
「A1セルonly操作装置1st というクラスモジュールの プロパティ01_値の状態設定G」
という「Propertyプロシージャ」自体が、
「プロパティである」
とも言えます。
(※厳密には「読み込み」側のプロパティである、といえます。通常、
「1つのプロパティ」には、多くの場合、「読み込み」機能と「書き込み=設定」
機能の、2つの機能があります。)
なお、このプロシージャの実行が終わると、
また標準モジュールの「自作obj操作1st」の「test001()」プロシージャにもどり、
「Debug.Print o_Obj01.プロパティ01_値の状態設定G」というコードの次のコードに
戻ります。)
以上のようにして、
★ 「何がプロパティの正体なのか?」や、
★ 「プロパティとは何なのか?」
ということを「確認」できます。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
※何回も「ちなみに」ですみませんが、このように、
「画面の何がどう移り変わったか?」「細かい差異」をちゃんとチェックしておくことは、
初心者の場合、
「デバッグ(プログラムミス退治)」には重要です。
「自分がミスで思いもしないところにプログラムを書いてしまっていて、それが誤作動を招いていた」
ということが少なくないためです。
特に「個人用マクロブック(Personal.xlsb」やアドインなどを同時に開いている場合は
要注意、かつ、たいへん重要です。
初心者のうちだとそれらの動きがよくわかってなくて、また、「スコープ」の理解も
できていないことが多いので、変な場所に変な風にプログラムを書いてしまいがちだからです。
(※僕自身、いまだにそうです。)
F8キー実行するなかで、
「しまった!こんなアホな場所に書いてしまってた!」というのは、
今回のこの実験のように、
「どこがグレーで、今の実行中はどのモジュールのどのプロシージャに自分が居るのか?」や
「ウォッチウィンドウ」の表示内容
を何度もチェックするなかで、体で覚わっていき、「異変」「小さな異変」に「気付きやすく」なります。
つまり、「デバッグの腕があがり、短時間にデバッグできる確率が上がる」、
ということでもあります。
これは、VBAプログラミングには、とても重要なことです。
逆に、「小さな異変」に気づけない人は、永遠に、自力でのエラー解決はできません。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
それで、いかがでしょうか?
「プロパティ」は「状態」でしたでしょうか?
あるいは、「属性」、でしたでしょうか?
たぶん、「自作関数」の仕組み、
「プロシージャ」と呼ばれるモノの仕組みを多少でも知っている方」なら、
「あれ?」ってなると思います。
多分、
『 もしプロパティが、「状態や属性だ」ということなら 』、
『 なんで、今プロパティの中を覗いているのに、クラスモジュールの「プロパティ01_値の状態設定G()」という「プロシージャ」の中身を見てるんだ? 』
『 プロシージャだ、ってことは、「自作関数」とかのあの「プロシージャ」と「いっしょ」ってことなの? 』
『 少なくとも、変数や定数やリテラル値やオブジェクト式、そのもの、ではない・・・ なんで? プロパティって「設定値」のことじゃないの?』
と、なるのではないでしょうか?
細かいことは割愛しますが、
でも、「そういうことなん」です。
「状態や属性」「ではない」んです。
『 「値」ではないんです 』
『 逆に 』
『「自作関数」とかのあの「プロシージャ」と「いっしょ」ってこと 』なんです。
(ここでは「値」を返すタイプの。なぜ「ここでは」になるかは、すぐ後述してます。次号でも。※プロパティは基本・2種類のプロシージャが1セットになったモノであるため。)
・・・・というわけで、ここでのF8キー実行から、少なくとも、
★★★ 「プロパティ」というものが何なのかは、今はまだよく分からないけれど、
★★★ 少なくとも「プロパティ」は「プロシージャ」かもしれなくて、
★★★ 単なる「状態や属性」「ではない」、「値」でもない。
★★★ むしろ、「状態や属性」や「値」だと、そう、軽々しく決めつけてはいけない、
ということくらいは、イメージできたのではないでしょうか?
「答え」のひとつを言ってしまうと、
★★★「プロパティ値」を「読み」だす(=読み込む)ときは、「Property Get」という種類のプロシージャ(「値」を返すタイプ)が使われ、
★★★「プロパティ値」を「設定する」ときは、「Property Let」という種類のプロシージャ(「値」を返さないタイプ)が使われ、
ます。
「Get」と「Let」が違う(異なる)だけ、ですけど・・・。
ただ、いずれにしましても、
ある意味、それが、
「その2つのプロシージャ」を「セットにしたモノ」が、
★★★「プロパティの正体」とも言えるのだ ★★★
と言ってもいいのではないか、と思います。
ちなみにですが、
『 属性や状態の「値」の設定ができないプロパティ 』、
つまり、
『 値を「読みだすことしかできない」プロパティ 』には、
『 そのクラスモジュールの中には 』、
『「Let」のほうの Propertyプロシージャは 』、
『 書かれていない。』・・・・、ので、
『「Get」のほうの Propertyプロシージャ片方だけ・1つだけ 』・・・・、
という状態になると思います。
では、この
「Property Get プロパティ01_値の状態設定G() As Double 」
の行が黄色くなった状態で、さらにF8キーを押してみます。
「プロパティ01_値の状態設定G = ActiveSheet.Range("A1").Value」
という行が黄色くなりました。
これは、自作関数をまだ作ったことが無い方には少し理解が難しいと思うのですみませんが、
『 「プロパティ01_値の状態設定G」という関数に、アクティブなシートのA1セルの入力値を返せ 』
という命令です。
今からF8キーでこの命令を実行します。
すると、
今度は
「End Property」
の行が黄色くなります。
そしてもう一度、F8キーを押します。
すると、
イミディエイトウィンドウに、
ActiveSheet.Range("A1").Value、
つまり、
アクティブなシートのA1セルの入力値の
「2」
が表示されます。(下図参照)
実行の経緯は以下のような感じです。
「自作obj操作1st」標準モジュールの、
「test001()」プロシージャの「Debug.Print o_Obj01.プロパティ01_値の状態設定G」という命令の
まずは、
「プロパティ01_値の状態設定G」の部分だけが実行されて、
そこにリンクしている、
「A1セルonly操作装置1st」というクラスモジュールの
「プロパティ01_値の状態設定G」プロシージャが
引き続き実行に移され、
その中に書かれている
「プロパティ01_値の状態設定G = ActiveSheet.Range("A1").Value」
という命令が実行され、
そのプロシージャが終わると、
自動的に
「自作obj操作1st」標準モジュールの、
「test001()」プロシージャの
「Debug.Print o_Obj01.プロパティ01_値の状態設定G」という命令
に戻り、
その命令の「Debug.Print」 という命令語句により、
イミディエイトウィンドウに、
「プロパティ01_値の状態設定G」、でゲットできた値が表示されます。
今回はひとまず、このあたりまで、ということにしたいと思います。
いかがでいしたでしょうか?
「プロパティのこと」、多少はイメージしてもらえましたでしょうか?
自作関数を作ったことが無い方には、かなり難しかったと思いますが、
でも、とりあえずここでは、
「プロパティ」=「プロシージャとかいうヤツと一緒っぽい」
くらいに思ってくださるだけでも、とってもありがたいです。
嫌な言葉でしめくくらないといけないのが本当に嫌なのですが、
『 少なくとも、巷の市販書籍、動画、Web記事、雑誌記事などでよく言われる、
「プロパティ=状態」だとか、「プロパティ=属性」だとかいう解説は、
「片手”以上”落ち」で「半分(あるいはほとんど)ウソなんだ」 』
ということをご理解いただければと思います。
こんな嫌なしめくくりかたをしなければならないのも、
本当に、レジェンドたちやこれまでの講師たちが「いいかげんだから」で、
ほんとうにイヤです。
はやく「初心者を騙さない」、まともな業界になってほしいと願います。
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
----------------------------------------------------------------------
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
発行システム:『まぐまぐ!』 http://www.mag2.com/
配信中止はこちら https://www.mag2.com/m/0001691660.html
----------------------------------------------------------------------
- 投稿タグ
- 「本物」に近づくために, ExcelVBA, Excel連携VBA, パソコンでの自動化, マクロ, 独学, 自動化