★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0039:タイトル:なぜあなたが「いつまで経ってもVBAが上達しないのか?」06 「オブジェクトを返すメソッドとプロパティの動き」、および、「その他のメソッドの動き」など。~ついでに、VBAの「真の基礎」のひとつ、「クラスモジュール」の簡単なモノの自作と操作について~ 05
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0039
タイトル:★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0039:タイトル:なぜあなたが「いつまで経ってもVBAが上達しないのか?」06 「オブジェクトを返すメソッドとプロパティの動き」、および、「その他のメソッドの動き」など。~ついでに、VBAの「真の基礎」のひとつ、「クラスモジュール」の簡単なモノの自作と操作について~ 05
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
今回も、前回の続きです。
今回は、「メソッド」のうち、「オブジェクトを返すだけのモノ」について見てみたいと思います。
同じく「プロパティ」のうち、「オブジェクトを返すだけのモノ」についても、見てみたいと思います。
あと、「メソッド」のうち、オブジェクトも一般データも「何も返さないモノ」、についても見てみたいと思います。
では、今回も、実際に、
「自作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()というプロシージャ(プログラム)」に点滅カーソルを置きます。
なお、前回以下のことをやってない方は、以下のことをしておいてください。
「test001()というプロシージャ(プログラム)」の中の、
Debug.Print o_Obj01.メソッド01_A1セル_だけ_をオブジェクトとして返す.Address
という行の直後に
Debug.Print o_Obj01.プロパティ99_A1セル_だけ_をオブジェクトとして返すG.Address
という1文の命令を、
コピペして書き加えてください。
これによって、
「メソッドでもプロパティでも」
「オブジェクトを返すだけ」という「動き」を取る(あるいは「させる」)ことができる・・・、
ということが、なんとなくでも分かると思います。
ではまず最初に「F5」キーを押します。下図のようになります。
「F8」ではなくて「F5」です。
下図のように、一気に実行が進み、前号でやった、
「Debug.Print o_Obj01.プロパティ01_値の状態設定G」までが実行が終わり、
その次の行の「Stop」で止まった状態になります。
そしたら、もうあと「5回」、「F5」キーを押します。下図のようになります。
「Debug.Print o_Obj01.メソッド01_A1セル_だけ_をオブジェクトとして返す.Address」
の行の前の「Stop」で止まった状態です。
では、これから、
「メソッド01_A1セル_だけ_をオブジェクトとして返す」という「メソッド」の中に入っていきます。
このメソッドは、
「A1セル」というオブジェクトを返す「だけ」のメソッドです。
「A1セル」というオブジェクトを返す「だけ」で、あと「なんにもしない」というメソッドです。
VBAでは、このように、
「オブジェクトを」
「返す」こと
「だけしかしない」
「あとなんにもしない」
「メソッド」
があります。
(※組み込みのメソッドだと、例えば「×××.Item」、「Worksheet.PivotTables」、「PivotTable.PivotFields」といったメソッドなどがそれにあたります。なお、プロパティにも同じように「オブジェクトを返す ”だけ ”しかしないモノ」があります。)
今回は「自作の」そういうメソッドの、
「メソッド01_A1セル_だけ_をオブジェクトとして返す」というメソッド(自作関数のようなもの)の中に入っていきます。
そして、それによって戻ってきた「A1セル」というオブジェクトに対して、
「.Address」という命令(プロパティと呼ばれるモノ)と、
あと「Debug.Print」という命令(ステートメント名と呼ばれるモノ)の、
2つの命令を使って、
A1セルのセルアドレス(=セル番地)をイミディエイトウィンドウに表示します。
では、「メソッド01_A1セル_だけ_をオブジェクトとして返す」というメソッドの中に入っていきたいと思います。
F8キーを2回押してください。下図のようになります。
「自作obj操作1st」という標準モジュールの「test001」というプロシージャから、
「A1セルonly操作装置1st」というクラスモジュールの「メソッド01_A1セル_だけ_をオブジェクトとして返す」というプロシージャに、
ジャンプしました。
そしていま、
「Function メソッド01_A1セル_だけ_をオブジェクトとして返す() As Range」
という行が黄色くなっています。
ではここでもう一回、F8キーを押します。
「Set メソッド01_A1セル_だけ_をオブジェクトとして返す = ActiveSheet.Range("A1")」
という行が黄色くなりました。(下図)
この命令は、
「メソッド01_A1セル_だけ_をオブジェクトとして返す」
という関数(プロシージャ名)に対して、
「アクティブなシートのA1セル」を
「オブジェクトとして」
「代入する」
という「イメージ」の意味です。
もう少し意訳すると、
「メソッド01_A1セル_だけ_をオブジェクトとして返す」という名前の「メソッドとして」、
「アクティブなシートのA1セル」を、
「オブジェクトとして(=Rangeオブジェクトとして)」、
「ユーザーに返す」・・・・、
という意味にもなります。
※「値を返す」「自作関数(=プロシージャ)」の場合、
「自作関数名=プロシージャ名」が「変数」のような役割も果たします。
なので、「自作関数名=プロシージャ名」に、何かを代入することができます。
そして、そのような動きを、「値を」「返す」とか、「戻す」と表現します。
少し別な言い方をすると、
「値を返す・自作関数(=プロシージャ)」の場合に限っては、
その「自作関数名=プロシージャ名」への何らかの値の「代入」は、
「返す」とか、「戻す」、という表現・意味に変わる・・・・、
というイメージです。
「値を」「返さない」「自作関数(=プロシージャ)」の場合は、これはありません。
なので、
「値を返す・自作関数(=プロシージャ)」の場合に限っては、
「自作関数名=プロシージャ名」へ何らかの値を「代入」することによって、
ユーザー側に、その「代入したモノ」を「返す」「戻す」・・・・
そしてその「返したモノ」「戻したモノ」を「返り値」とか「戻り値」などと呼ぶ・・・
・・・というわけです。
(※ヘルプでは「返り値」ではなく、「戻り値」の言い方のほうが使われています。
雑誌記事や書籍などでは、稀に「返り値」という表現が使われることがありますが、
基本的には「戻り値」のほうが多く使われます。)
以上は「プロパティ」のところで説明し忘れてしまいましたが、
「値を返す」「プロパティ(=プロシージャ)」の場合、も同じです。
「値を返す」というタイプのモノであれば、
「自作関数も」「自作プロパティ」も「自作メソッドも」これは同じです。
もっと言うと、「組込みの既存プロパティ」や「組込みの既存メソッド」でも、
これは同じです。
(※「値」とは、文字ベースの「一般データ」か、「オブジェクト」かの
2つに1つです。)
では、
「Set メソッド01_A1セル_だけ_をオブジェクトとして返す = ActiveSheet.Range("A1")」
を実行してみたいと思いますが、
その前に、
ウォッチウィンドウに
「メソッド01_A1セル_だけ_をオブジェクトとして返す」を
ドラッグしてみてください。
「メソッド01_A1セル_だけ_をオブジェクトとして返す」の上のどこかで
ダブルクリックすると、
「メソッド01_A1セル_だけ_をオブジェクトとして返す」が
一発選択できますので、
そのまま(青色反転表示のまま)、ウォッチウィンドウにドラッグします。
※VBEでは、ドラッグだけでなくダブルクリックでも「名前」や「命令」を一発選択できます。
長い名前を付けた場合はドラッグよりもダブルクリックでの選択の方がラクなので、
その選択方法も是非お試しください。
稀に例外があるかもしれませんが、まず、99%以上、
ダブルクリックでの選択ができると思います。
ドラッグ後は、下図のようになります。
「メソッド01_A1セル_だけ_をオブジェクトとして返す」の「値」の列が
「Nothing」(=空ですよ~!なんも無い!!!)
という内容になっています。
そして、その左端には「+」マークは無く、「オブジェクト」として認識はされていません。
「型」の列は「Range」とだけ書かれています。
(※オブジェクトの場合、「/」が出て無い場合や、出ていても「Variant/Empty」となっている場合は、まだオブジェクトの型が「確定していない」ということを意味します。)
では、ここで、「必ず」この「Noting」のところを見ながら、
F8キーを押してください。
すると
「Set メソッド01_A1セル_だけ_をオブジェクトとして返す = ActiveSheet.Range("A1")」
が実行されて、
「Noting」が「10」に変化し、
その左端には「+」マークが現れます。
「型」の列も「Range/Range」に変化します。(下図)
これで
「メソッド01_A1セル_だけ_をオブジェクトとして返す」
という「モノ」が、
「A1セル」
が代入されて、
「オブジェクト」として認識されるようになりました。
(※厳密には「オブジェクト」じゃなくて「クラス」かもしれませんが、初心者の段階のときは「オブジェクト」としてとらえてください。クラスモジュールがよくわかるようになってから厳密に理解し分ければいいと思います。)
ここで、
なぜ、
「A1セル」が
「メソッド01_A1セル_だけ_をオブジェクトとして返す」に
「代入された」と
「分かるのか?」。
つまり、
なぜ
「メソッド01_A1セル_だけ_をオブジェクトとして返す」という「モノ(ここではメソッド)」が、
「A1セル」の 言わば「分身」・「イコール」となったかが分かるのか?・・・・・・
・・・というと、
まず、
今現在、シート上に「10」という値が入力されているセルは「A1」セルだけしか無いので、
なら逆に、
『 ウォッチウィンドウの「値」の列に「10」と出ている 』ということは、
「ああ、これは」、
「メソッド01_A1セル_だけ_をオブジェクトとして返す」ってヤツは、
「A1セルと何らかの関係があるな・・・」
と分かります。
また、
そのセルがウォッチウィンドウで、左端に「+」マークがあるので
「ああ、これはウォッチウィンドウの ”値 ”の列が 10と表示されてはいるけれども、
一般データではなくてオブジェクトだな」、
「10」と出ちゃったのは、「.Value」の「省略 、の意味」があるからだな、
と分かり
かつ、「型」の列も「Range/Range」となっていて、
「左端に +マークがあっても、”××( ~ to ~ )”みたいには
なってないから配列ではない!!
ならオブジェクト確定!!」
と分かるからです。
(「Range/Range」のように、「/」が表示されている場合は、
「Range型のオブジェクトに確定ですよ!」という意味なので。
「/」が表示されてない・かつ・「Object」だけ、とか「Range」だけ、とか、
あるいは
「/」が表示されていても、「Variant/Enmpty」とかだと、
「まだ何も型が確定していない状態」です。)
で、今、「End Function」の行が黄色くなった状態なので、ここでさらにF8キーを押します。
すると、以前の号のプロパティのときと同じように、
プログラムコードの実行はいったん「自作obj操作1st」モジュールの側に戻ります。
戻ると同時に、そこで、
先程の
「メソッド01_A1セル_だけ_をオブジェクトとして返す」ってヤツが「A1セル」と「イコールになったよ」・・・
という状態のまま、
「o_Obj01.」と「.Address」が先頭と最後尾にかかって、
なおかつ、
「Debug.Print」、すなわち、「イミディエイトウィンドウに表示しろ」
という命令もかかってきます。
そして、それが実行されますので、
「$A$1」が
イミディエイトウィンドウに表示されます。(下図)
なお、さきほど
「メソッド01_A1セル_だけ_をオブジェクトとして返す」ってヤツが「A1セル」と「イコールになったよ」・・・
と書きましたが、
実はこれは、
より正しく言うと、
「o_Obj01.メソッド01_A1セル_だけ_をオブジェクトとして返す」ってヤツが「A1セル」と「イコールになったよ」・・・
ということになります。
「o_Obj01.」を付けてお話ししないといけなかったです。
余りゴチャゴチャ書くとわかりづらくなってしまうといけないので、これ以上書きませんが、多分、クラスの「インスタンス化」の意味が理解できている方は、「だよね、じゃないとおかしいよね」とお感じになられたと思います。
そのことの証明として、ウォッチウィンドウで、
「o_Obj01.メソッド01_A1セル_だけ_をオブジェクトとして返す」
をドラッグで青色選択して、ウォッチウィンドウにさらにドラッグで放り込むと、
「+」マークが付いて、かつ、型も「Object/Range」となり、「オブジェクトだ」とわかると思います。
「.Address」も含めて、
「o_Obj01.メソッド01_A1セル_だけ_をオブジェクトとして返す.Address」
をドラッグで青色選択して、ウォッチウィンドウに放り込むと、
「$A$1」が、その「値」の列に表示されます。
※注・補足
少し前に「メソッド01_A1セル_だけ_をオブジェクトとして返す」だけをウォッチウィンドウに放り込んだとき、「+」マークが付いてオブジェクトだと判断できた理由は、その時点で居た場所が、
「A1セルonly操作装置1st・クラスモジュール」の中、だったからです。
今の時点では、プログラムの実行が「自作obj操作1st・標準モジュール」に戻ってきているので、
「 o_Obj01. 」を先頭に付加しないと、ウォッチウィンドウの中で「+」マークは付いてきません。
(※「自作obj操作1st・標準モジュール」においては、「 o_Obj01 」は、
「Set」したわけなので、「 A1セルonly操作装置1st 」と同義です。)
そこだけ、微妙に面倒くさいですが、ご理解し間違いのないようにご注意ください。
(下図参照)
ここまでが
「オブジェクトを返す」
「だけ」
「しかしない」
「ほかは」
「なんもしない」
「メソッド」
の中身でした。
いかがでしたでしょうか?
例によって
「余計にワケワカランくなった!どうしてくれる!!!」
となってしまったらごめんなさい。
では次に、
「Debug.Print o_Obj01.プロパティ99_A1セル_だけ_をオブジェクトとして返すG.Address」
のほうに移りたいと思います。
こちらは、「プロパティ」ですが、
実は
先程の
「メソッド01_A1セル_だけ_をオブジェクトとして返す」
というメソッドと全く同じ動きをします。
つまり、
「オブジェクトを返す」
「だけ」
「しかしない」
「ほかは」
「なんもしない」
「プロパティ」
です。
(※組み込みのプロパティだと、例えば「×××.Item」、「Workbook.Worksheets」、「Worksheet.Range」、「Range.Range」といったプロパティなどがそれにあたります。もちろん、メソッドにも同じように「オブジェクトを返す ”だけ ”しかしないモノ」があります。)
しかも、そのうえ、
「メソッド01_A1セル_だけ_をオブジェクトとして返す」
というメソッドと全くもって同様に、
「A1セルをオブジェクトとしてゲットする」
ということ
「だけ」
「しか」
「しません」。
これは実際にF8キーで実行して頂ければ、理解できると思います。
ゴチャゴチャ書くとわかりづらくなってしまうといけないので、
ポイントだけ書きます。
まず、F8キー押下すると、
「A1セルonly操作装置1st」モジュールの「プロパティ99_A1セル_だけ_をオブジェクトとして返すG」のプロパティプロシージャにジャンプします。
その段階(黄色い段階)で、
「プロパティ99_A1セル_だけ_をオブジェクトとして返すG」
をダブルクリックで青色選択して、ウォッチウィンドウにドラッグで放り込みます。
メソッドのときと同じように「値」が「Nothing」になっているので、
その「Nothing」を見つめたまま、
F8キーを
「2回」
押します。
「Nothing」が「10」に変わります。
理由は、メソッドの時と同じ理屈で、
「Set プロパティ99_A1セル_だけ_をオブジェクトとして返すG = ActiveSheet.Range("A1")」
というコードの実行により、
「プロパティ99_A1セル_だけ_をオブジェクトとして返すG」に
アクティブシートのA1セルがオブジェクトとして代入された(戻された)からです。
ざっと、以上のような動きなのですが、
とにかく
「メソッド01_A1セル_だけ_をオブジェクトとして返す」メソッドと
まったく同じ動きですので、
何度も見比べてみてください。
(ウォッチウィンドウはもちろん、イミディエイトなども使って。)
「まったく同じ動きをする」ことや
「プロパティでもメソッドでも関係なく」、「オブジェクトを返すだけ」ということができる、
といったことなどが明確にわかると思います。
「必ず」、下図もご参考にしてみてください。
では最後に、
「Call o_Obj01.メソッド02_値が100ならメッセージ」
を実行してみたいと思います。
これはあまり難しくありません。
F8キーで実行すると、普通に、「自作関数をコールして実行するだけ」みたいな感じです。
「何も返さずに」
「A1セルの値が100だったらメッセージを発し、違ったらイミディエイトにメッセージ表示する」
だけです。
下図をご参照ください。
今回のポイントは、
メソッドでもプロパティでも
「オブジェクトを返す」
「だけ」
のモノが作れる・自作できる、
ということでした。
★★ そしてそれは、
★★ 「×××.Item」、「Worksheet.PivotTables」、
★★ 「PivotTable.PivotFields」といった、
★★ 「組み込みのメソッド」や
★★ 「×××.Item」、「Workbook.Worksheets」、「Worksheet.Range」、
★★ 「Range.Range」といった、
★★ 「組み込みのプロパティ」でも、
★★ 「まったく同じことが言える」
★★ ということが、
★★ 「さらに重要」
★★ です。
★★ 自作するわけではありませんが、
★★ 「もとから」
★★ 「オブジェクトを返す」
★★ 「だけ」
★★ のものが、
★★ 「相当数」、
★★ 「メソッドにもプロパティにも、両方に」、
★★ 「在る」
★★ ということです。
(※なぜ「全部プロパティ」じゃなくて「メソッドにも在る」となっているかの理由はよくわかりませんが・・・・。
プロの人にQ&Aサイトなどで聞いてみてください。)
今回の実験で、今後、それも多少理解しやすくなるはずです。
(特に、ヘルプやオブジェクトブラウザを扱う中で。)
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
----------------------------------------------------------------------
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
発行システム:『まぐまぐ!』 http://www.mag2.com/
配信中止はこちら https://www.mag2.com/m/0001691660.html
----------------------------------------------------------------------