★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0037:タイトル:なぜあなたが「いつまで経ってもVBAが上達しないのか?」04 「プロパティ」の真実?正体?その2(Property Let プロシージャ)~ついでに、VBAの「真の基礎」のひとつ、「クラスモジュール」の簡単なモノの自作と操作について~ 03
  
バックナンバー目次ページは→こちらです。

まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
  
  
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)

Vol.0037

タイトル:なぜあなたが「いつまで経ってもVBAが上達しないのか?」04 「プロパティ」の真実?正体?その2(Property Let プロシージャ)~ついでに、VBAの「真の基礎」のひとつ、「クラスモジュール」の簡単なモノの自作と操作について~ 03
  
  
バックナンバー目次とサンプル号
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.プロパティ99_A1セル_だけ_をオブジェクトとして返すG.Address

という1文の命令を、

Debug.Print o_Obj01.メソッド01_A1セル_だけ_をオブジェクトとして返す.Address

という行の直後にコピペして書き加えてください。

  

これによって、
「メソッドでもプロパティでも」
「オブジェクトを返すだけ」という「動き」を取る(あるいは「させる」)ことができる・・・、
ということが、なんとなくでも分かると思います。

  

  

ではまず最初に「F5」キーを押します。下図のようになります。
「F8」ではなくて「F5」です。

下図のように、一気に実行が進み、前号でやった、
「Debug.Print o_Obj01.プロパティ01_値の状態設定G」までが実行が終わり、
その次の行の「Stop」で止まった状態になります。


  

じゃあ今日はここから、
「前回と名前が同じ」
「そういう」
「プロパティ」にて、そのプロパティの、
「設定」をする、という、
プロセスを見ていきたいと思います。
  

と、その前に、
動きが分かりやすいようにシートの「A1セル」の値を書き換えておきます。

現在「2」になってると思うのですが、
これを「10」とか、好きな数字に変えてください。
  

とりあえずここでは「10」にしてみます。
(下図参照。罫線が消えてるのは気にしないでください。)

  
  

では、今度は「F5」じゃなくて「F8」キーを押してください。

「Let o_Obj01.プロパティ01_値の状態設定G = 2」の行が黄色くなりました。

  
  

ここから、前回と同じように

「プロパティの中に入る」

ということをしていきたいと思います。

今回は「プロパティ値」への「設定系(設定編)」となります。

  

もういちど、命令文(=ステートメント)に注目してください。

行頭に「Let」がありますね?

  

「Let」が行頭にある・・・

ということは、

これは「代入ステートメント」ですね?
  

なので、命令文(=ステートメント)の意味としては、

オブジェクトが内包する「プロパティ01_値の状態設定G 」というプロパティの、
「そのプロパティ値」に、
「2」を
「設定しろよ~!オイコラ~!パソコンめ~!わかったか~!?」

という意味の命令です。

  
  

では、更に「F8」キーを押してください。

前回同様コードペインやら、プロジェクトエクスプローラやら、いろんなモノが、画面が一気に切り替わりました。
  

切り替わった場所は前号の時とほぼ同じです。

「自作obj操作1st」という標準モジュールの
「test001()」というプロシージャから、

「A1セルonly操作装置1st」というクラスモジュールの
「プロパティ01_値の状態設定G」というプロパティのことが書かれている場所に、

プログラムコードの実行が移動しました。

  
  

ただ、前回とは「少し」「異なり」ます。

  

前回と異なるのは、黄色くなった「行の位置」です。

前回は、同じ「A1セルonly操作装置1st」というクラスモジュールでも、
その1つ上の、
「Property Get プロパティ01_値の状態設定G()・・・」の行が
黄色かったでした。
  

今回は、その下、
「Property Let プロパティ01_値の状態設定G」と、
「Get」ではなく「Let」が付くほうが黄色くなりました。(下図参照)
  

  

で、ここで、

前述したことをちょっと思い出してほしいのですが、ここに到達する直前の命令は、

「自作obj操作1st」モジュールの、
「test001」プロシージャの、

「Let o_Obj01.プロパティ01_値の状態設定G = 2」

という命令でした。

  

先頭に「Let」がありましたよね?

だから、今回は

「同じ名前のプロパティ」であっても、
「Get」のほうじゃなくて
「Let」が付いてるほうに、プログラムコードの実行がジャンプ(移動)しました。

(って、本当にそれが理由なのかは僕にはわかりませんが。でも無関係ではないはずです。)
  

※一般的に「代入命令(代入ステートメント)」においては、「Let」は省略されます。
 だから、「Letが省略されていて」「本当は書かないとダメ」、「できれば書いてね」、
 ということを習えていないと、
 ここでの理屈が分からなくなってしまいます。

 逆に「Letの省略のことを知っていれば」、
 「本来はLetをちゃんと書く」ということを知っていれば、
 VBAの初心者クラスの方であっても、ここでの話が、
 「あ、前の命令が LetだからLetのほうに行くってこと?」・・・と、
 完全に理解できないまでも、
 なんとなくでも、
 イメージしてもらえると思います。

 VBAの「コツ」は「省略」にこそ、隠されていると思います。
 「省略したことにこそ」「VBAの本質」が、隠されていると思います。

 僕がいつも
 「省略はダメ」
 何度も書くのは、
 「そのため」も、
 「大きい」
 です。

 「学習が進んでないうちの安易な省略は」「手抜きと同じ」と、いうこともありますが、
 それよりも、
 「省略したことにこそ」
 「VBAの本質」が、
 「隠されている」、
 ということも
 「とても大きい」
 と思っています。

 ※とエラそうに言っておきながら、実際には僕も「Let」はよく省略してしまいますが・・・(^^)

  

  
  

わかりますでしょうか?

つまり、

プロパティの「プロパティ値」を「読み込む」ときは、「Get」のほうが使われ、

同じく、

プロパティの「プロパティ値」を「書き込む(=設定する)」ときは、「Let」のほうが使われる、

ということなんです。

  

そしてそれは
「属性やら状態やら」といった、
「値」、
「ではなくて」、

「れっきとした」、
「プロシージャ」、

「すなわち」

「明確に」、

「 命 令 」、

あるいは

「 機 能 」

「です」。
  

ついでに言うと、
「1つの同一モジュールの中なのに」、
「同じ名前の」、
「プロシージャ」が、
「共存もできてしまっている」という、
標準モジュールではありえないことが起きています。

ただこれは、多分ですが、お察しのとおり、
「Get」と
「Let」が
「異なる」ので、
「そこをちゃんとそれぞれのコードの中に書いているので」、
「プロシージャの名前が同じでもいい・別物と扱える」、
ということなんだろうと推測できます。

  

ちなみにですが、この「Get」と「Let」の「Propertyプロシージャ」は、

クラスモジュールだけでなく、

・「シートモジュール」や
・「ブックモジュール(ThisWorkbook)」
・「ユーザーフォームモジュール」
  

にも書けます(作れます)し、使えます。

(※ ★ つまりは、それらにも「自作のプロパティが作れる」、ということを意味しています。)

  

理由は・・・、

僕はまだVBA初心者なので よくわかりませんが、

・「シートモジュール」も
・「ブックモジュール(ThisWorkbook)」も
・「ユーザーフォームモジュール」も

「クラスモジュール系」のモジュールだからではないかと思います。

それらは「全部」、
「すでに実体化(インスタンス化)」はなされている、
ので、
「Set」や「=」、などを使ったインスタンス化(実体化)は必要なく、
「Get」と「Let」の「Propertyプロシージャ」を書いただけですぐにそれを、(何もしなくても)使用できます。
(つまり、すぐに、自作のプロパティとして使えます。)
  

それも是非覚えておいてください。

  

ただ、もしや?と思って、「標準モジュール」にも作ってみたら、作れました。
「Get」と「Let」の「Propertyプロシージャ」、両方とも。
そして、機能します。

ただ、「型」や「オブジェクト」としては認識できないので、クラスモジュールのような「インスタンス化」はできませんでした。
これも「もうすでに実体化されている」ということなのかも?
だからなのか、どうなのか、まだよく分かりませんが、一応「標準モジュール名.プロパティ名」というかたちで、インテリセンスのドロップダウンには作ったプロパティの名前が出てきます。
このあたりはまだ自分自身よくわからないので、今後の学習課題ですね。

  

またまた、長い脱線、すみません。
  

では、次に、

「Property Let プロパティ01_値の状態設定G(設定したい値 As Double)」

が黄色くなってる状態から、またF8キーを押してみて下さい。

「ActiveSheet.Range("A1").Value = 設定したい値」

というステートメントが黄色くなったと思います。


  

これも実は「Let」を省略しています。ホントは書かないといけません。(^^)

  

で、この命令文の意味ですが、これは、

「アクティブなシートのA1セルの値を、引数の「設定したい値」に、設定しろよ~
 パソコンちゃんよぉ~!」

という意味になります。

もう少し別の言い方をすると、
「アクティブなシートのA1セルに、引数の「設定したい値」を、自動入力しろよ~
 パソコンちゃんよぉ~!」
ということです。
  

今回は、さきほど、A1セルの値を「10」に書き換えました。
  

で、

ここで言っている「設定したい値」とは、

ここに来る前の

「Let o_Obj01.プロパティ01_値の状態設定G = 2」

という命令文における、

右辺の「2」のこと、

です。
  

そういうことになっていますので、結果、

A1セルの値が「10」から「2」に書き換わります。
  

※「Let o_Obj01.プロパティ01_値の状態設定G = 2」の右辺の「2」が、なぜ、
 「Property Let プロパティ01_値の状態設定G(設定したい値 As Double)」の
 「設定したい値」にかかってくるのかは、ここでは細かすぎることになってしまい、
  かえって難しくなってしまうので、
 「あえて」、考えないでください。
 というか、僕自身、まだ全然分かってません。

 普通の「自作関数のルール」「プロシージャのルール」で考えたら、
 いくら相手がクラスモジュールの「プロシージャ」だとしても、
 「あくまでも・プロシージャ」なわけですから、
 で、その、「設定したい値」という「引数」に対して、
 「2」を渡したいわけですから、
 普通で考えるなら、
 「Let o_Obj01.プロパティ01_値の状態設定G = 2」と書くのではなくて
 「Call o_Obj01.プロパティ01_値の状態設定G(2)」みたいに書きたくなってしまうと
 思うのですが、でも、実際にはそうはならない・・・というところです。

 なんで、「=」で指定したその右辺の数字(この例では「2」)が、その次の段階の、
 「Property Let プロパティ01_値の状態設定G(設定したい値 As Double)」という
 プロシージャの、その引数である「設定したい値」に、
 「かかってくる」「リンクしてくる」「つながってくる」の?
 「Call o_Obj01.プロパティ01_値の状態設定G(2)」みたいな風にはならないの?
 ということなわけですが、
 でもここではそれは、深く考えず、「そういうもんなんだ」、「そういう仕組みなんだ」、
 ということだけ、
 「イメージ」してください。
 今回の実験では、それで、十分です。

  

では、ワークシートのA1セルが見える状態で、F8キーを押して、

実際に、今黄色くなっている

「ActiveSheet.Range("A1").Value = 設定したい値」

の行を実行してみましょう。

下図のようになります。


  

ちゃんと、10(あるいは皆さんが入力した値)が、「2」に書き換わりましたでしょうか?

  

では、このプロシージャの最後の行の「 End Property 」を実行してみます。

これを実行すると、プロパティの役割(コードの実行)を終えて、
「自作obj操作1st」標準モジュールの
「test001()」プロシージャのほうに戻ります。
  

では、実際に、F8キーを押して実行してみましょう。

もどりましたね。

そして、今号の冒頭で、一番最初に実行した、
「Let o_Obj01.プロパティ01_値の状態設定G = 2」
の行の、次の行、の「Stop」に移動しました。


  

いかがでしたでしょうか?
  

前号と今号合わせて、ここまでが、
自作の「プロパティ」の、そのプロパティ値の「読み込み」と「設定」の「ペア」の動きです。

  

★ で、

★ ここでは「自作の」プロパティについて実験しましたが、

★ 「組み込みの」プロパティも、
★ 「その仕組みは」、
★ 「同じようなものだ」、と

★ 思ってください。(「ペアのプロシージャなんだ!」と。)

  

  

そうすると、「ヘルプ」も「オブジェクトブラウザ」も、ウォッチウィンドウ、も、全部、
読みやすくなります。

逆に、そうしない場合は、

「永遠に」、

「VBAを」、

「理解できません」。

たとえば、
使ったことが無いオブジェクトに出会うたびに、
あるいは、エラーが出てそれが消えなくて困り果てるたびに、
Q&AサイトやWeb記事などに答えを求めることになるのですが、
「ヘルプ」も「オブジェクトブラウザ」も、ウォッチウィンドウ、も、全部、
「まともに読めない」
もんだから、
「結局解決できない」、
か、
(とりあえずの対処はできたとしても)回答や記事の意味が分からずに、

「もやもや」が

「ずーっと」、

消えません。

(※もちろん『 そんなもん気にしてどーする!VBAなんてなあ、とりあえずその場しのぎができればそれでOKなんだよ! 』という考え方もありますが、「自分だけのプログラム」を作るときはそれでもいいのですが、「他人も使うプログラム」を作るときは「エラー解決がすぐにできないといけない」ので、それではやっぱりまずいです。下手をすると賠償問題やクビになる可能性すらあります。
日本のVBA教育は、『 そんなもん気にしてどーする!VBAなんてなあ、とりあえずその場しのぎができればそれでOKなんだよ! 』という進め方・教え方でです。
実は僕もそれに近い姿勢でやってきてしまっていました。一生懸命やってるときはそう思わなかったのですが、色んな事が少しずつでもちゃんとわかってくると、「そうだったんだ・・・やられた・・・騙されてた・・・・」と気づきます。なお、日本のVBA教育は、今その姿勢が変わる兆しがまったくが無いので、「ゼロ」なので、というか、クズ本がどんどん出てきて、SQL(データ管理の基礎)もまったく教えないですし、昔よりだんぜんひどくなってるので、今後も変わらないと思います。
(※「SQLは、商業科の高校生でも習っていて、そして、扱えます。なのに大人になると誰も教えてくれません。)
哀しい事だと思います。
日本の「データ管理の現場」は、色んなソフトで色んな機能は増えましたが、でも使いこなせる人は増えておらず、20年前から進歩していませんが、このままでは、今後も、まるで進歩しないと思います。
VBA講師やその他のExcel講師たちがサボりにサボってきたおかげで、ピボットすら知らない人、うじゃうじゃ居ますし、SQLも使える人なんて、マジほんの少しだし、結果、本来書く必要のない無駄なVBAコードや関数書く「羽目」にさせられています。更に結果、VBA習う人間が増えたとしても、その中でまともに「自力で全部組み立ててエラー解決できる人」なんてほんの一部。少し。更に更に結果、「VBAかじっただけの何もできない人」が量産されるだけで、データサイエンティスト「的な人」すらも育たないし、日本の「データ管理の現場」は、20年前と何も進歩しておらず、今のままでは、今後も「進歩しようがない」です。)

  

そうなってしまってはいけませんので、是非、前号と今号でやった2つのプロシージャのことを
覚えておいてください。

  

つまり

「Get」と「Let」の2つの「Propertyプロシージャ」の「セット」のことです。

で、さらには、
その
「Get」と「Let」の2つの「Propertyプロシージャ」の「セット」こそが、
「プロパティの正体」であり、
また、
「プロパティ」とは「状態でも属性でも値でも」「なくて」、
「自作関数と同じ」「プロシージャなんだ」

「プロパティ」とは、
「オブジェクトの状態=属性=値」を「読み書き」するため、
 それ「専用」の、
「プロシージャ(たち)なんだ」、

と理解することこそが、

「上達の早道である」

ということも。

上達が早まる理由は、
(本当に大切なので)何度でも同じことを言いますが、
それによって、「ヘルプ」も「オブジェクトブラウザ」も、ウォッチウィンドウ、も、全部、読みやすくなるからです。

  

ひとまずは、ここでいったん区切りですが、もしよければそのあとの2行、
  

Debug.Print o_Obj01.プロパティ98_値の読み書きG
Stop
Let o_Obj01.プロパティ98_値の読み書きG = 10
Stop

の命令も、も「F8キー押下」で、ゆっくり、ステップ実行してみて下さい。
  

この2行の
「プロパティ98_値の読み書きG」は、

今号と前号でやった、
「プロパティ01_値の状態設定G」と

「まったく同じ動き」をします。
(※「Get」のほうも「Let」のほうも。両方とも。)
  

つまり、プロパティの「名前」を「変えただけ」のモノです。
  

「より意味のわかりやすいプロパティ名ってないかなー」と思って、
今号・前号でやったプロパティの、「名前だけを変えて対比させてみる」、
ということのために作りました。

そのサンプル・事例、として実験として作ってみました。
ここからも何かヒントを得て頂けるとうれしいなと思います。
  

実際の動きが「まったくいっしょ」なので、

「値の状態設定(=属性設定)」も「値の読み書き」も「同じことだよね!」

ということがより明確になってくれると、うれしいな、と思います。
  

そのほか、以下のようなことが分かる・想像ができる、気もします。
  

名前が変わっても・・・、

・プロパティであることは変わらない。
・「Get」のほうと「Let」のほうの、2つのプロシージャを「セット」で「1つ(1組)」として使っていることも変わらない。
・「Get」のほうか「Let」のほうかのいずれかのプロシージャをクラスモジュールに書けば、Excelはそれに対して、ちゃんとプロパティアイコンを割り当ててくれる。
             (=プロパティだと認識してくれる)
・異なる名前のプロパティであっても、動きを同じ内容に作れる。
・逆に、微妙に動きの異なるプロパティを作れる。
・逆に、名前をいつでも変えられる。
・ただし、名前を変えたいなら、
  「Get」と「Let」両方ともを同じ名前に変える必要がある。
・べつに、英語の名前にしてもよい。

・★「プロパティ」とは、結局のところ、2つの「読み書き用の」プロシージャの「セット」に付けた「名前」のこと。

                     etc・・・

・・・ということなんだと思います。

  

そこから、発展して、

・★「プロパティ」の動きから逆に考えてみると、 オブジェクトとは、
『 ”操作したいモノ”に対する処理を、、プロパティやメソッド・イベント、というかたち(=命令)でまとめたもの。バラバラになるとプロシージャなどを管理しづらくなる・見つけづらくなるので。 』
ということも言えるのかもしれない。

・★ と思うと、VBAって、今のVisualBasic2019とかに比べたらはるかに簡単な文法・画面だし、オブジェクトブラウザやウォッチウィンドウなどでなんでも「値と型」「階層」をチェックできるので、他の言語よりも本当に「初心者向き」だと思う。
「値と型」「階層」、そこさえつかんでしまえば、どの言語よりも簡単かも??
「どの言語よりも」、「値と型」「階層」をウォッチウィンドウで確認しやすいのは間違いないです。
「値と型」を「明確に」「目で」確認できる、しやすい、というのは、初心者にとって本当に幸せなこと。

・★ 「オブジェクト」のことを「操作の対象」という説明をする書籍が多いけど、どうせ「操作」という言葉を使いたいなら、「操作したいモノ」「あやつりたいモノ」と訳す方が、まだマシ(若干わかりやすい)かもしれない。ただ、それでは「ヘルプ」も「オブジェクトブラウザ」も、ウォッチウィンドウ、も、全部読みづらいままなのでおススメは絶対にしませんけど・・・。
逆に「ヘルプ」も「オブジェクトブラウザ」も、ウォッチウィンドウ、も、全部読めるようになりたいなら、「オブジェクト=装置」のほうがかなりマシだと思う。
なお、「オブジェクトを人間に例える」例え方は「悪い例え方」だと思う。
服の色、目の大きさ、などは「プロパティ」にはなりえないから。
「プロパティ」はそれらを「設定」「する」という「動きをとる」「命令」だから。
「液晶テレビ」のほうが「オブジェクト」の感覚に近いと思う。

といったことなども、前号・今号の実験から、なんとなく想像できるような気もします。
  

というわけで、
ぜひ、ウォッチウィンドウなどを駆使しながら、動きなどが理解できるまで、
残りのコードも、
何度も、
F8ステップ実行してみてください。

  

  

  

今回は以上です。
  

==========================================================================

バックナンバー目次とサンプル号

★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):~バックナンバー~

----------------------------------------------------------------------
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
発行システム:『まぐまぐ!』 http://www.mag2.com/
配信中止はこちら https://www.mag2.com/m/0001691660.html
----------------------------------------------------------------------