★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0038:タイトル:なぜあなたが「いつまで経ってもVBAが上達しないのか?」05 「その他のプロパティの動き」、および、「5つの動き」との関連など。~ついでに、VBAの「真の基礎」のひとつ、「クラスモジュール」の簡単なモノの自作と操作について~ 04
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0038
タイトル:★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0038:タイトル:なぜあなたが「いつまで経ってもVBAが上達しないのか?」05 「その他のプロパティの動き」、および、「5つの動き」との関連など。~ついでに、VBAの「真の基礎」のひとつ、「クラスモジュール」の簡単なモノの自作と操作について~ 04
バックナンバー目次とサンプル号
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」で止まった状態になります。
そしたら、もうあと「3回」、「F5」キーを押します。下図のようになります。
「Debug.Print o_Obj01.プロパティ02_色の状態設定G」
の行の前の「Stop」で止まった状態ですね。
じゃあ今日はここから、
「セルの色の設定値を読み書きするプロパティ」の動きを見ていきたいと思います。
前々号と前号のように、「Get」と「Let」のプロシージャを通り抜けるところを見てみます。
「Debug.Print o_Obj01.プロパティ02_色の状態設定G」の命令のほうは、
「取得=読み出し」の意味となり、
「Get」のほうのプロシージャを通り抜け、
「Let o_Obj01.プロパティ02_色の状態設定G = 16777215」の命令のほうは、
「設定=代入」の意味となり、
「Let」のほうのプロシージャを通り抜け、
ます。
では、今度は「F5」じゃなくて「F8」キーを押してください。
「Debug.Print o_Obj01.プロパティ02_色の状態設定G」の行が黄色くなりました。
ここから、前回、前々回、と同じように
「プロパティの中に入る」
ということをすることになります。
今回は「プロパティ値」に対する、
「読み込み系(=言わば、読取編、取得編)」、
と、
「設定系(=言わば、設定編)」、
の
「両方」、
を見ていきます。
では、先程の命令文(=ステートメント)にもう一度、注目してください。
行頭に「Let」は無くて、「Debug.Print」がありますね?
あるいは、「Let」はもちろん、「=」がありません。
なら、これは(「=」が無いため)「代入していない」ということになり、
これは『 このあと「Let」のほうは通過しない 』、という意味になります。
このような消去法的な確認方法ではちょっと納得がいかない方も多いと思いますが、今はとりあえずこれでご勘弁ください。
下図もご参考にしてください。
※「Let」はよく省略されるので、図にも書いたとおり、「=」が「有る・無い」で判断してもよいです。
なお、「=」を使うシーンとしては、このほかに、
「比較」の意味の「=」のときと、
「名前付き引数の指定」の意味の「:=」のとき、
もありますが、今回のようにアタマに「Letがある」か「逆に・省略されて他のステートメント名も一つも無い」という場合は、「=」は「代入」=「設定」という意味になります。
あと、「=」が「代入」の意味になるケースは、「Let」のほかに「For」の場合があります。
「For 変数名 = 1 to 10」みたいな書き方です。
これは変数に「1~10」の値を順番に代入する、という意味になります。
※「=」が「比較」の意味の場合のときは、「行頭に Letが付く」ということはありませんし、「逆に、省略される=行頭にステートメント名が何もない」というケースもありません。
そして何か別のステートメント名が出てくる場合が多いです。
例えば、「If」、「Do」、「Debug」、などのステートメント名のあとに在る「=」は、大抵は「比較」などの意味で、「代入」の意味ではありません。
また、「名前付き引数の指定」の意味の場合は「:」が余計についています。
よって、いずれも、そこで、『「代入」の意味では「ない」』、と分かります。
※「Call(あるいはCallの省略)」、の場合は、「=」は出てこないか、もし「=」を使うとすれば、「部分的に使われ」、「:=」の「名前付き引数」の意味の場合が多いです。
なお、「Debug.Print」は、「イミディエイトウィンドウに表示しろ」、という意味の命令です。
なので、
「Debug.Print o_Obj01.プロパティ02_色の状態設定G」だと、
「o_Obj01(つまり、A1セルonly操作装置1st)というオブジェクト(=クラスモジュール)の、
プロパティ02_色の状態設定G というプロシージャで、
A1セルの色の状態をゲット(=Get)しろ。
そしてそのゲット(=Get)したものをイミディエイトウィンドウに表示しろ」、
とか、
「o_Obj01(つまり、A1セルonly操作装置1st オブジェクトの
プロパティ02_色の状態設定G というプロパティの設定値を、
イミディエイトウィンドウに表示しろ」、
という意味になります。
※ヘルプにも、「(このプロパティは)値の取得および設定が可能です。」という言い回しがよく出てくるのですが、その「取得」が「ゲット(=Get)の意味だ」ということになります。
では、更に「F8」キーを押してください。
前回・前々回 同様、コードペインやら、プロジェクトエクスプローラやら、いろんなモノが、画面が一気に切り替わりました。
プロパティへ 「ジャンプ」、したわけです。
「o_Obj01(つまり、A1セルonly操作装置1st)」というオブジェクト(=クラスモジュール)の、
「プロパティ02_色の状態設定G」というプロパティの
「Getプロシージャ」のほうに、
ジャンプしました。
「色の状態を表す値をゲットしたい(取得したい)から」→「Get」のほうに移動・ジャンプした・・・
みたいに考えてもらっていいです。
下図のようになります。
で、ここに、
「プロパティ02_色の状態設定G = ActiveSheet.Range("A1").Interior.Color」
という命令文(ステートメント)があります。
この命令文の意味は、
「アクティブなシートの、A1セルの内側の色(俗に言う「セルの背景色」)の値を、
”プロパティ02_色の状態設定G ” に代入しろ」
という意味となります。
もう少し言い換えると
「アクティブなシートの、A1セルの内側の色(俗に言う「セルの背景色」)の値を、
”プロパティ02_色の状態設定G ”という「自作関数」めいたモノに代入しろ」
という感じになり、
もっと言い換えると、
「アクティブなシートの、A1セルの内側の色(俗に言う「セルの背景色」)を、
”プロパティ02_色の状態設定G ” として、ユーザー側 に返せ」
という意味になります。
では、これを実際に実行してみたいのですが、
と、その実行の前に、
「プロパティ02_色の状態設定G」というモノ(式)の「値」がどう変化するかも、
ついでに見ておきたいと思います。
今、
「Property Get プロパティ02_色の状態設定G() As Double」
の行が黄色くなっていると思うので、
その中の、「プロパティ02_色の状態設定G」という部分だけを、(黄色いまま)
ドラッグ選択して、青色反転表示にします。
そしてそれをさらにドラッグで、「ウォッチウィンドウ」の中に放り込んでください。
下図のようになります。
「値」の列の数値は「ゼロ」ですね。
では、この状態のまま、F8キーを押してみましょう。
「プロパティ02_色の状態設定G = ActiveSheet.Range("A1").Interior.Color」
という命令文のところが黄色くなります。(下図)
さらに、F8キーを押してみたいのですが、このとき、ウォッチウィンドウをよ~く注目しててください。
ウォッチウィンドウを見ながら、F8キーを押したいと思います。
では、実際にF8キーを押してください。
どうなりましたか?
ウォッチウィンドウの「ゼロ」が
「 16777215 」
に、変化しましたか?
今、プログラムの実行は、
「End Property」
という命令文のところが黄色くなったところで止まっています。
それは、「プロパティ02_色の状態設定G = ActiveSheet.Range("A1").Interior.Color」
という命令文が、
(※上図の場合の黄色い行の命令文が)
「ちゃんと実行されましたよ~!」
ということを示しています。
そして、それを実行したことによって、
ウォッチウィンドウの「ゼロ」が「 16777215 」に変化しました。(下図)
ということは、
先程
「プロパティ02_色の状態設定G = ActiveSheet.Range("A1").Interior.Color」
の意味として書いた、
「アクティブなシートの、A1セルの内側の色(俗に言う「セルの背景色」)の値を、
”プロパティ02_色の状態設定G ” に代入しろ」
「アクティブなシートの、A1セルの内側の色(俗に言う「セルの背景色」)を、
”プロパティ02_色の状態設定G ” として、ユーザー側 に返せ」
といったことが「ちゃんと実現された」ということも意味します。
では、さらにF8キーを押して、
「End Property」
を実行しましょう。
プログラムコードの実行はいったん「自作obj操作1st」モジュールの側に戻ります。
戻ると同時に、そこで、
先程の
「プロパティ02_色の状態設定G の値が、16777215 に変化したよ!」・・・
という状態のまま、
「Debug.Print」、すなわち、「イミディエイトウィンドウに表示しろ」
という命令もかかってきて、それが実行されますので、
「16777215」がイミディエイトウィンドウに表示されます。(下図)
いかがでしたでしょうか?
「色の値を読み書きするプロパティ」で、その「色の値を読み込む」という「動き」、
なんとなくでも意味がわかりましたでしょうか?
同じような感じで、F8キー実行にて、
「Let o_Obj01.プロパティ02_色の状態設定G = 16777215」
も実行してみてください。
なお、この命令の場合は、
「色の値を読み書きするプロパティ」で、その「色の値を書き込む」、すなわち、
「設定する」という「動き」、をします。
「Let o_Obj01.プロパティ02_色の状態設定G = 16777215」の右辺の値を「16777215」から
「255」に変えると、セルの色が赤くなります。
そういうことも一度、ためしてみてください。
なお、
「自作obj操作1st」モジュールの「test001」プロシージャ において、
その中の、
「プロパティ02_色の状態設定G」と
「o_Obj01.プロパティ02_色の状態設定G」を
ウォッチウィンドウにドラッグ追加したときの、「値」や「型」の表示状態の違い。
というものを、図にしてみました(下図)
ウォッチウィンドウの「見方」も少し書いてありますので、必ずこちらの図 ↑ の説明も、確認しておいてください。
ウォッチウィンドウにドラッグした変数、定数、プロパティ、メソッドなどの「値」や「型」が表示されるのは、基本、「有効期間中」しか、表示されません。
(※「有効期間」は「スコープ」とも呼ばれ、普通は変数だけのことで使う用語ですが、ここではムリヤリ、プロパティ、メソッドなどにも使ってしまいました。)
組込のプロパティ、メソッドの「値」や「型」については、すでに「すべてのオブジェクトが実体化している」ので、「Set」でインスタンス化(=実体化)しなくてもその「値」や「型」がいつでもちゃんと表示されます。
なお、ウォッチウィンドウに何か追加すると、無関係のコード実行したときもその追加したモノが実行されます。
なので、例えばメソッドで「画面に何かメッセージなどが表示されるモノ」を追加してしまうと、何回も同じコードが実行されて、無関係のコードであっても、1行実行するごとに、メッセージが画面に出てきてしまってうっとおしいです。
あるいは、それが原因でデータが吹っ飛ぶ、みたいなことも起こりえます。
メソッドをウォッチウィンドウに追加する時は、慎重に、動きを予測してから追加してください。
(※オブジェクトや値を返す「だけ」のメソッドならいいのですが・・・)
・・・ところで・・・・
以前の号で「VBAの・すべての・命令単語の」、「5つの動き」について書きました。
33号
★「謝罪」ウォッチウィンドウで、セル範囲のアドレスを「直接」調べる方法(超マヌケだった僕)と、Yahoo知恵袋で700閲覧をして頂いた回答について
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01-33
内容的な以下のようなことです。
*************************************
例えば、ExcelVBAの命令だけに限って言えば、
・演算子、
・各種VBA関数(Excel専用、Office共用、など、いろいろ)、
・WorksheetFunctionオブジェクトのメソッド、
・プロパティ、
・メソッド、
・ステートメント名(ステートメント用の「キーワード」)、
・API、
などなど・・・、
のカテゴリがあり、
そしてこの Excelの場合だけでも、合計で「1000個以上」の命令単語があります。
が、それらの命令単語はそのように、様々にカテゴライズされて、
『 使うシーン・操作対象・書き方は異なりますが 』、
でも、
「基本的には」「すべて」「以降の(a)~(e)の5つの自作関数の動き」の、
「どれかにあてはまります」。
使うシーン・操作対象・書き方(構造)が異なるので「呼び方が異なるだけ」・・・。
「本質・動き、は全部同じ」、と思ってください。
なので、最初にワークシート関数で「関数」についてその仕組みを学んでください。
(※ただ、ワークシート関数だけでは学べませんが、
特に、「オブジェクトを返すタイプの関数」、
の意味・仕組みを知ることが重要です。)
では、以降、その(a)~(e)の、5つの動きです。
(a)「一般データ」を返すこと「だけ」しかしない自作関数(=オブジェクトは返さない)
(b)「何らかの動き」をしつつ、同時に、「一般データをも返す」自作関数
(c)「オブジェクト」を返すこと「だけ」しかしない自作関数(=もちろん一般データは返さない)
(d)「何らかの動き」をしつつ、同時に、「オブジェクトをも返す」自作関数
(e)何も返さずに、「何らかの動き」だけをする自作関数
※「一般データ」とは、数値、文字列、日付、Ture/Falseの2値、などのことをさします
※「オブジェクト」とは、「装置(あるいはユニット、部品、あるいは、
Excelという工場で働くミニミニロボット)」のようなイメージです。
※ そして、「プロパティ」や「メソッド」は、
「特定のオブジェクトのなか」「だけ」でしか「動けない」、
「自作関数と似た動きをするもの」、
です。
呼び出し方法、名前付き引数、カッコ有無、などのルールは、
自作関数(=自作のプロシージャ) でのルールと同じです。
※ ここで言う、「何かしらの動き」とは、
「一般データの場合」であれば、主に「四則計算、検索、変換、比較、切出し、などなど」、
「オブジェクトの場合」であれば、主に、「開く/閉じる、追加、削除、フィルタ、並べ替え、
Excel操作としての検索や変換(置換)、外部データ接続と吸込み、グラフ作成、
メッセージ表示、などなど」をさします。
*************************************
といういわけで、これまで、いくつかの自作のプロパティについて見てきましたが、
それらのプロシージャが上記の(a)~(e)の、どれにあてはまるか、一応、書いておきたいと思います。
(01)「プロパティ01_値の状態設定G」プロパティの場合
※ここでの「G」は「グローバル」の意味で勝手に付けただけなので、「Get」とは無関係です。
「Get」のほうのプロシージャ →(a)です。アクティブシートのA1セルの入力値を返すだけなので。
「Let」のほうのプロシージャ →(e)です。何も返さずにアクティブシートのA1セルに値を自動入力するだけなので。
(02)「プロパティ98_値の読み書きG」プロパティの場合
「Get」のほうのプロシージャ →(a)です。アクティブシートのA1セルの入力値を返すだけなので。
「Let」のほうのプロシージャ →(e)です。何も返さずにアクティブシートのA1セルに値を自動入力するだけなので。
※この「プロパティ98_値の読み書きG」プロパティは、
動きとしては「プロパティ01_値の状態設定G」プロパティと全く同じです。
名前が違うだけで。
(03)「プロパティ98_値の読み書きG」プロパティの場合
「Get」のほうのプロシージャ →(a)です。アクティブシートのA1セルの色の値(Double型)を返すだけなので。
「Let」のほうのプロシージャ →(e)です。何も返さずにアクティブシートのA1セルに、変えたい色の値を自動設定するだけなので。
ちなみに、次号以降でやる予定の
・「メソッド01_A1セル_だけ_をオブジェクトとして返す」メソッド
・「プロパティ99_A1セル_だけ_をオブジェクトとして返す」プロパティ
・「メソッド02_値が100ならメッセージ」メソッド
の3つについては、以下のようになります。
(03)「メソッド01_A1セル_だけ_をオブジェクトとして返す」メソッド
これは(c)です。
Functionプロシージャで、アクティブなシートのA1セルを、
Range型のオブジェクトとして、ユーザー側に「返すこと」「だけ」しか「しない」ので。
(04)「プロパティ99_A1セル_だけ_をオブジェクトとして返す」プロパティ
これも(c)です。
Getのほうのプロシージャで、アクティブなシートのA1セルを、
Range型のオブジェクトとして、ユーザー側に「返すこと」「だけ」しか「してない」ので。
※オブジェクトを返すプロシージャは「Funciton(≒メソッド)」だけじゃない、ということですね。
(05)「メソッド02_値が100ならメッセージ」メソッド
これは(e)です。
Functionプロシージャで、アクティブなシートのA1セルの値が「100」だったら
メッセージボックスを出して、
「100」じゃなかったら「イミディエイトに」メッセージを表示する、
というだけのことしかしておらず、
ユーザー側には、一般データもオブジェクトも何も返してないので。
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
----------------------------------------------------------------------
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
発行システム:『まぐまぐ!』 http://www.mag2.com/
配信中止はこちら https://www.mag2.com/m/0001691660.html
----------------------------------------------------------------------
- 投稿タグ
- 「本物」に近づくために, ExcelVBA, Excel連携VBA, パソコンでの自動化, マクロ, 独学, 自動化