★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0041:タイトル:なぜあなたが「いつまで経ってもVBAが上達しないのか?」08 「真に”名詞”?のプロパティ」もある。「何らかの動きをとる」「組込のプロパティ」のようなモノじゃなく、「変数(値)そのもの」としてのプロパティ」もある。~ついでに、VBAの「真の基礎」のひとつ、「クラスモジュール」の簡単なモノの自作と操作について~ 07
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0041
タイトル:★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0041:タイトル:なぜあなたが「いつまで経ってもVBAが上達しないのか?」08 「真に”名詞”?のプロパティ」もある。「何らかの動きをとる」「組込のプロパティ」のようなモノじゃなく、「変数(値)そのもの」としてのプロパティ」もある。~ついでに、VBAの「真の基礎」のひとつ、「クラスモジュール」の簡単なモノの自作と操作について~ 07
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
すみません~。
仕事が忙しかったのと、家族の入院等々で、ごたごたしててサボってしまいました。
ごめんなさい。
前回は、
クラスモジュールの「A1セルonly操作装置1st」丸っと複製して、
「A1Cell」というクラスモジュールを作り、
その中の各種プロパティやメソッドを、ちょっと長めの日本語から短い英単語に変更して、
で、
「組み込みのプロパティやメソッドも」
「こんな風に」
「短い英単語(しかも名詞)で表現されてるけど」
「実際には」
「自作関数のように(SubやFunctionのプロシージャと同じように)」
「何らかの動きをするんだよ!?(実際には動詞的な動きをとるんだよ!?」
「メソッドはともかく、特に、”プロパティ ”が。」
ということを目で確認してみました。
これで、「メソッド」と同様、「プロパティ」も、
「命令の一種である」
ということが、
なんとなくでも、明確になったのではないかと思います。
これは、
市販のExcelVBA書籍には
「全く書いてない」し、
半分は
「僕個人の意見・解釈」なので、
鵜呑みにはしないで欲しいのですが、
でも、
「クラスモジュール」を作るようになるまでは、
「そういう理解でも不都合はない」
「かえって、オブジェクトブラウザもヘルプもウォッチウィンドウも読めるようになる」ので
「好都合」
だと考えていいと思います。
詳しい「本当の事」は、実際にクラスモジュールをバンバン作るようになってから、
「ああ、これは本当はこういうことだったのか」
と理解し直せばいいと思います。
それまでは、前述のように・・・、
「組み込みのプロパティやメソッドも」
「こんな風に」
「短い英単語(しかも名詞)で表現されてるけど」
「実際には」
「自作関数のように(SubやFunctionのプロシージャと同じように)」
(Propertyプロシージャを使うものの、でも)
「何らかの動きをするんだよ!?
(=「実際には動詞的な動きをとるん」だよ!?」
「メソッドはともかく、特に、”プロパティ ”が。」。
つまり、
「メソッド」と同様、
「プロパティ」も、
「命令の一種である」・・・
・・・・と解釈・理解していいです。
で、
今回ですが、
今回は、それとは別に、
「動詞的ではなく」、
「動詞的な動きは全くしない」、
「完全に名詞」(?)の、
「プロパティ」
のことをご紹介します。
これは、
「組込のプロパティにも」
「存在するかもしれません」
というか、多分、存在すると思います。
ただ今の僕には、ちょっと「明確な調べ方」がわからないので、そのことについての詳細はわかりません。
でも多分あると思います。
「引数」を「持つ」プロパティは「そうじゃない」ことも少なくないかもしれませんが、
「引数」を「持たない」プロパティは「そう」かもしれません。
特に、「値を読めるだけで」「変更ができない」、そういうプロパティはそうかもしれません。
わからないですけど・・・。
ただ、完全に「変更の利かない」「値としてのみ」だと「定数」になってしまう気がするので、
「その名詞のプロパティに値を代入するための何らかのPropertyプロシージャは存在する」のではないか?
と推測しています。
なので、結局、「プロパティ」なら、「何らかの動きをどこかでしている」、ということでもいいのかもしれません。
この辺は、みなさんもクラスモジュールをたくさん作ったり、C++など??で、DLLなどを作るなどしてみないと分からないかもしれません。すみません。
(※初心者の方、意味不明なこと書いてごめんなさい!!)
では、前回同様、同じファイルを使ってそのあたりを見ていきます。
まずは前回までと同じファイルを以下からダウンロードしてください。
(すでに前回ダウンロードされているかたは不要です)
https://euc-access-excel-db.com/00000WPZIP/own_make_obj_smpl.zip
から、ダウンロードできます。
「own_make_obj_smpl.zip」という圧縮ファイルです。
解凍すると
「簡易的な自作のオブジェクトや自作のプロパティ、メソッドWpSample.xlsm」
というファイルが出てきます。
それを好きな場所に置いてください(デスクトップとかでOKです。)
で、それを開き、さらに、Alt+F11でVBEを開きます。
以上で準備完了です。
では、早速見ていきます。
標準モジュールに「自作オブジェクト操作2nd」というモジュールがありますので、それをダブルクリックで開きます。
そして上の方の
「test004()」
というプロシージャに点滅カーソルを置いてください。
それができたら今度は「F2」キーを押して、オブジェクトブラウザを表示します。
表示したら、「クラス」のペインで、「A1セルのみの操作装置」というモノをクリックします。
(下図参照)
あっけなくてすみませんが、先に、答えを言ってしまうと、上図で、オブジェクトブラウザの
「メンバー」のペインに「プロパティ」として表示されている・・・
「★変数_pub_A1セル」と
「★変数_pvt_B1セル」という
2つのプロパティが、
今回の目的の、
「名詞」として(=値として=変数として)の、(=それ単体では何らかの動きを伴わない)
「プロパティ」
です。
そして、さらに、答えを言ってしまうと、
この2つのプロパティの正体は(一般的には)、
「クラスモジュールの一番上の ”Option Explicit ”の行の次の」、
「宣言部分に書いた」
「変数」です。
今回の場合だと、
「A1セルのみの操作装置」という名前の「クラスモジュール」の一番上に書いた、
「Public ★変数_pub_A1セル As Range」と、
「Private ★変数_pvt_B1セル As Range」の、
2つの変数です。
「★変数_pub_A1セル」の変数宣言の先頭には「Public」というキーワードを付け、
「★変数_pvt_B1セル」の変数宣言の先頭には「Private」というキーワードを付けてあります。
そのため、インスタンス化したときに
そのインスタンス化したときの呼び出し側・・・、例えば、「インスタンス化して呼び出した標準モジュール内」においてのみは)、
「★変数_pub_A1セル」のほうは、
「インテリセンス内に見える」のですが、
「★変数_pvt_B1セル」のほうは、
そうはなりません。
というわけで、今回は・・・・・、
「★変数_pub_A1セル」というプロパティはインテリセンスのドロップダウンに出てくるけど、
「★変数_pvt_B1セル」というプロパティはインテリセンスのドロップダウンに出てこない、
(※インテリセンス=コードを書くときの自動補完機能)
であるとか、
「★変数_pub_A1セル」というプロパティも
「★変数_pvt_B1セル」というプロパティも
「この2つは、確かに、名詞(変数)であって動詞ではないけれど」、
「でも・結局は」
「Propertyプロシージャ」かあるいは、
イベントプロシージャ(Subの仲間)、
あるいはFunctionプロシージャを使って、
その2つ(=変数)に「値を代入する」ということができ、
つまり、変数(名詞)ではあるものの、
別の箇所で「何らかの動き=プログラムの動きに」
「影響される」ようだし、
なので逆に、
「プロパティ」というものが「何らかの動き」と
「全くの無関係になる・何からの影響も受けずに値だけが最初から決まっている」ことも
意外と少ないかもしれない???
とか、
もし
「全くの無関係になる・何からの影響も受けずに値だけが最初から決まっているプロパティ」ということが起こる場合、
それは「変数としてのプロパティ(名詞)」にはなりえず、
「定数(名詞)」となってしまうのかもしれない・・・。
だから何だ、というわけではないですが、
「今後の何らかのヒントになるかもしれない」ので、
「いちおう、知っておくといいかも?」というレベルの話です。
(※ここも初心者の方、意味不明でごめんなさい!!)
ちなみに、今回はクラスモジュールの「Class_Initialize(クラスの初期化」)」という
「イベントプロシージャ」というもの(Subプロシージャの仲間)を使って、
この2つの『 変数としてのプロパティ 』に値を代入しています・・・、
とか、
★ 前回までのプロパティは「自作関数似タイプ」のプロパティのため、
「GetPropertyやLetProperty」というプロシージャで値の読み書きをしていましたが、
今回のプロパティは、「変数タイプ」のプロパティであるために、「そもそも」「何の動きも・取れない」ため、
「イベントプロシージャ」というSubプロシージャの仲間を使って値を設定しています。
とか、
・・・・・そういったところなどを見ていきたいと思います。
今回は短いかも。
ではさらに進めます。
の状態から、
「Sub test004()」の1行下に点滅カーソルを置きます。
F8キーを1回押します。
で、この段階で、イミディエイトウィンドウで
「? o_Obj01」
と書いて、
「.」(ドット)を書くと、
下図のように、「★変数_pub_A1セル」が、
「プロパティアイコン(プロパティを意味するアイコン)」として表示されます。
すなわち、「プロパティ」という位置づけで、表示されます。
まだ、今の段階では、「★変数_pub_A1セル」プロパティは
「空っぽ」の状態
ですが、
これから、「A1セルのみの操作装置」クラスをインスタンス化する中で、
その「インスタンス化」するときの「初期化」のイベントにて、
「★変数_pub_A1セル」プロパティの中に、
「セル」を「オブジェクト」として代入していきます。
では、再度、F8キーを押します。
「Set o_Obj01 = New A1セルのみの操作装置」
の行が黄色くなります。
更に、再度、F8キーを押します。
「Set o_Obj01 = New A1セルのみの操作装置」
というコードが実行され、
VBEの画面が、
「A1セルのみの操作装置」というクラスモジュールにジャンプ・移動・切り替わり、します。
で、
「ココ」
です!!
現在、
「A1セルのみの操作装置」というクラスモジュールの
「Class_Initialize()」
というSUbプロシージャの開始を示す行が黄色くなっていますよね?
この「Class_Initialize()」というのは、
「クラスのインスタンス化が初期化されたときに」
「=クラスのインスタンス化が起こったとき”だけ”に」
「実行する」
「プログラムですよ~」
という意味になります。
まだよくイメージが沸かないと思いますが、つまり、なんのこっちゃよく分からないと思いますが、
「そういうもんなのか」でここはスルーしてください。
すみません。
そもそもですが、
「イベント」
というのは、
「発生するもの」なんですが、
「ここで何らかのプログラムが自動実行できますよ~!!!」という
「合図」「信号」、「打ち上げ花火信号」「のろし」
のようなものです。
実は、
ExcelやWord,Access、PowerPoint、が何らかのプログラムを実行していく経過のなかにおいては、、
そのウラで、
そういう「合図・信号」が、
「無数に」
「あらかじめ決められたタイミング(既定の組込イベント)」で
「バッカン、バッカン」と
打ち上げ花火のように
打ちあがりまくっています。
そういうわけなんですが、
「Class_Initialize()」もその、
「あらかじめ決められた打ち上げ花火タイミング(既定の組込イベント)」の中のひとつで、
「=クラスのインスタンス化が起こったとき”だけ”に」
「打ちあがる」
「ハイ!今まさに、何らかのプログラムが自動実行できますよ~!」
という
「合図・信号・花火・のろし」
です。
この、
「合図・信号・花火・のろし」
が打ちあがったとき「だけ」に、「自動実行」されるプログラムのことを
「イベントプロシージャ」と呼びますが、
通常、
「 Private Sub イベント名 ~ End Sub 」
のようなくくり・フォーマットで、書かれています。
(書かれる場所としては、主に標準モジュール以外に書かれます。つまり、クラスモジュール、シートモジュール、ブックモジュールなどです。)
今回の例だと、
「Class_Initialize」が「イベント名」という意味になります。
「あらかじめ決められた」「イベント名」のひとつ・・・、という意味です。
なので、
『 Private Sub Class_Initialize() ~ End Sub 』
までの間に書かれたプログラムは、
「クラスがインスタンス化されるとき(あらかじめ決められているタイミングのひとつ)」に発生した、
その「花火・のろし」が上がったとき「だけ」に、
「自動実行」される・・・
と、まあ、そんな手はずで、プログラムが自動実行されていきます。
それが「イベントプロシージャ」や、「イベント」、といったものの概要です。
※それを知らずに、シートモジュールやブックモジュールなどに、
「たまたま」
「 ”イベント名 ”と同じ名前でSubプロシージャを作ってしまい」
「たまたま」
「先頭に Private」を付けてしまうと、
「それはイベントプロシージャとみなされて」
「勝手に、そのイベントのときに自動実行されてしまいます」。
つまり、「誤作動」の原因になります。
ほとんどありえないことですが、可能性がゼロではなく、Subプロシージャの名付けには注意が必要です。
なお、先程、
『 Excelが何らかのプログラムを実行していくなかで、
実は、
そのウラで、
そういう「合図・信号」が、
「無数に」
「あらかじめ決められたタイミング(既定の組込イベント)」で
「バッカン、バッカン」と
打ち上げ花火のように
打ちあがりまくっています。 』
と前述しましたが、
そのように、合図だけは無数に「バッカン、バッカン」と打ちあがりまくっていますが、
「それに対応した」
「イベントプロシージャを」
「何も書いていなければ」、
その「バッカン、バッカン」と打ちあがりまくっている「イベント(合図・花火・のろし)は、
打ちあがりまくるだけでスル~と「無視されて」、
で、
「何も起こりません」。
また、脱線してすみません。
とうわけで、
『 Private Sub Class_Initialize() ~ End Sub 』
のイベントプロシージャに書かれたコード内容を見てみます。
Set ★変数_pub_A1セル = ActiveSheet.Range("A1")
Set ★変数_pvt_B1セル = ActiveSheet.Range("B1")
の2行です。
1行目は
「★変数_pub_A1セル というパブリック変数に、アクティブなシートのA1セルを、オブジェクトとして代入せよ」
という命令ですね。
2行目は、
「★変数_pvt_B1セル というプライベートな変数に、アクティブなシートのA1セルを、オブジェクトとして代入せよ」
という命令です。
話を少し巻き戻します。
さきほど、
「プロパティ」には
「自作関数」的なモノ(「自作関数タイプ)、と
「変数」的なモノ(「変数タイプ)、
の2種類がある、
といったようなことを前述しました。
このように、
「変数」的なモノ(「変数タイプ)・・・
「変数ベース」の「プロパティ」には、
「クラスモジュール」の「イベントプロシージャその他の場所」で、
「値を代入でき」、
「その代入された変数を」、
そのまま
「プロパティ」
としても利用できるようになります。
例えば今回の例で言うと、
「★変数_pub_A1セル というパブリック変数」は、
「Class_Initialize」のイベントプロシージャにて、
「アクティブなシートのA1セルを、オブジェクトとして代入された」わけですから、
呼出し側の標準モジュールの側では、
「o_Obj01.★変数_pub_A1セル」というプロパティとして、
「A1セルを操作できる」・・・・
というかたちになります。
「Get、Let、Set、のPropertyプロシージャ」
を使った、
「自作関数」的(=「自作関数似タイプ)なプロパティとは少し様子が異なりますが、
オブジェクトブラウザの説明ペインに「~AS ××」という形でも表示されます。
これは「式」という概念(?)を学習すると、
オブジェクトブラウザの説明ペインに「~ AS ××」という形で表示されている場合であっても、
「必ずしも、全部が全部、プログラムではないんだ」
「必ずしも、全部が全部、自作関数的(=自作関数似タイプ)のプロパティではないんだ」
ということが分かると思います。
(※いままで僕自身がわかってなくてすみませんでした。最近わかりました。)
以上のように、
クラスモジュールにて、「パブリック変数」を使うことで、
「変数系の、”名詞として ” のプロパティも作れる」
し、
「プロパティは必ずしも、全部が全部、プログラムではないんだ」
「プロパティは必ずしも、全部が全部、自作関数的(=自作関数似タイプだけではないんだ」
ということがご理解いただけるのではないかと思います。
恐らくですが、こういう、「基礎」を積み重ねることによって、
「オブジェクト志向もどきな
「真のVBAプログラミング」
が、学びやすくなるのではないかと思っています。
あとのコードは、さらに、みなさん自身で F8キーを押しながら、1ぎょう1行、実行して、色々と考えをめぐらせてみてください。
==================
あとちなみにですが、
以下のコードを一番最後にはさんで実行テストをしてみると
o_Obj01.★変数_pub_A1セル.Value = 5
Set o_Obj01.★変数_pub_A1セル = Range("C1")
o_Obj01.★変数_pub_A1セル.Value = 100
Debug.Print o_Obj01.★変数_pub_A1セル.Value
o_Obj01.★変数_pub_A1セル.Value = 200
「クラスモジュール内だけではなくて」、
「呼び出し側の標準モジュールから」でも、
「★変数_pub_A1セル」
の内容を
「書き換えることができる」
ということがわかると思います。
「関数似のプロパティ」では(多分)それはできない気がしますが、
「名詞系の、変数ベースのプロパティ」では
「それができる」
ということも頭に入れておくと、何かのときに便利に使えるかもしれません。
「へえ~そんなこともできるだ!」
という新たな発見が、
「VBAって面白い!」
「オブジェクト指向プログラミングをもっとちゃんと習いたい!」
というワクワク感を増幅してくれると思います。
こういう「基本」は、
市販書籍やWeb記事ではまったく教えてくれないので、
この機に、皆さん自身でも色々とためされると、
「ご自分のちから」
「実力アップ」
にすごくつながると思います。
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
----------------------------------------------------------------------
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
発行システム:『まぐまぐ!』 http://www.mag2.com/
配信中止はこちら https://www.mag2.com/m/0001691660.html
----------------------------------------------------------------------
- 投稿タグ
- 「ニセモノ」への道, 「本物」に近づくために, ExcelVBA, Excel連携VBA, パソコンでの自動化, マクロ, 独学, 自動化