★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol.0057 :【番外】VBAでは間違って教えられることが多い「ステートメント」の意味やVBAの重要ポイントについて-02

  
バックナンバー目次ページは→こちらです。

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

Vol.0056

タイトル:【番外】VBAでは間違って教えられることが多い、
      「ステートメント」の意味やVBAの重要ポイントについて
  
  
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  
こんにちは。

前回の続きです。

引き続き、重要なテーマだと思いますので、よろしくお願い致します。

  

たくさんのゴミ質問も含んだ内容ですが、
初心者や中級の方にはヒントになる内容が多いと思いますので、
是非、今回挙げていく質問を、AIに聞いてみてください。

ChatGPT、ジェミニ、クロード、NotebookLM、あたりに同じ質問を聞いて、
回答をくらべてみてください。
結構面白かったです。

一番、イチャモンを付けて重箱の隅をつついてくるのはChatGPTです。
ジェミニなると、かなりヨイショしてきて回答がテキトーというか、
短くまとめてきます。、
クロードはさらにヨイショしてくる感じです。
また、ジェミニ同様、短くまとめてきます。
NotebookLMもそんな感じです。

なので、ChatGPTには絶対に質問してみてください。
いろいろとイチャモンつけてくれて、でも、色々ヒントが多いです。

でも、もちろん、ジェミニもクロードも質問してみてください。
ChatGPTとは違う角度でも回答してくれるので、短くまとめるけど、
ヒントももちろんくれます。

※逆に言うと、ジェミニ、クロード、などは忖度やヨイショが大きいので
 少し信用ならない面もある?のかも?しれません。
 わかりませんけど・・・。
 いずれにしても、「これ1つで全部カバーできる」というAIが無いのは事実だと
 思いますので、聴き比べは必要かな、と思います。

  

※ご注意
「前号の56号と今号」の最初から最後の質問までしっかりとAIに聞かないなら、
あまり意味無いのでそれなら最初からAIに聞かないほうがいいかもです。
多分、間違った理解をしてしまうと思います。※

  

●質問は、2行の「~~~~~~」で区切ってありますので、
それ単位で質問してみてください。
「この質問内容、ほんとかよ?」という感じで聞いてみてください。

「以下の内容は本当ですか?」みたいに聞いてもいいですが、
質問がたくさんありすぎてめんどくさいので、
そのままコピペしてEnterでいいです。
  

繰り返しますが、
「前号の56号と今号」、
「最初から最後の質問まで聞くつもりがないなら、やめといてください」。
誤解するだけなので・・・。
  

では、以降、質問内容です。
今後、数回に分けてお伝えさせていただきます。
(誤字脱字、意味不明箇所もありますがご容赦ください。)
  

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

  

~~~~~~
~~~~~~

  
>「これらを理解した上で、メソッド(オブジェクト指向)をどう捉えるか」

メソッドには組み込みのものと、クラスモジュールで自作できるものがあります。

まず、組込のメソッドは大別すると、
(a)特定のオブジェクトに紐ついたそのオブジェクトにしかできない動き=そのオブジェクトでできること、を実行するタイプ

(b)下位のオブジェクトを取得する(≒操作対象のオブジェクトをゲットする=選択する=1つに決める)タイプのモノ

があり、
あとは、(a)であっても、実行結果の成否なのかわかりませんが、
Boolean値が返るものがあります。
それはヘルプにもオブジェクトブラウザにも「・・・AS・・・」と
書かれないので書いてありませんが、
ウォッチウィンドウの「値」の列で確認できます。

クラスモジュールで自作のメソッドを作ると、
「メソッドは「Sub」か「Function」のプロシージャと同義なんだ。」
「特定のオブジェクト(クラス)に紐付いているところだけが違う」
「=オブジェクトを先に選択(取得)しないと使えない」
ということが理解できるようになります。

それが理解できると、オブジェクトブラウザの下のほうの説明のペインに、
Sub、とか、Function、とか表示される理由もわかるようになると思います。

※オブジェクトとは、プログラム(メソッド)各種設定値(プロパティ)の集合、
つまり、「文字(命令文や値)のかたまり」を、
あたかも「装置(例えば液晶テレビやパソコン」であるかの
ように見立てた「概念的なモノ」「たとえ」の言葉、です。
オブジェクト単位でプログラムを作ると、
「プログラム管理の超効率化(「カプセル化」「継承」「ポリモーフィズム」など)」
の仕組みがあらかじめどの言語でも用意されているため、
手続き型のプログラムよりもメリットが大きいケースがあります。
(そして少なくない。絶対、ではないけれど)
なので、オブジェクト単位でプログラムを書くことが増えたようです。
それを「オブジェクト指向」「オブジェクト指向プログラミング」と呼ぶようです。

オブジェクトは概念的な言葉で、現実の世界では、
「メモリの中に生成されたクラスが電子化したもの(クラスへのアドレス)=インスタンス」が
それにあたると思います。

文字的な定義的なオブジェクトが「クラス」(VBAではクラスモジュール)
電子的なリアルなオブジェクト=インスタンス、
という感じです。

VBAの場合、メソッドもプロパティも、実際にクラスモジュールで作ってみると、
ある地点から爆発的にVBAの腕があがります。
逆に言うと、オブジェクトを返す自作関数が作れないうちは、
メソッドもプロパティも自作できないので、そこが、VBA上達の真のスタート地点となります。

  

~~~~~~
~~~~~~

組込のメソッドは、恐らくですが、C++か何かで、SubやFunctionとして書かれています。

  

~~~~~~
~~~~~~

ついでに、VBAの命令を分類すると、以降の5つしかありません。

「組込のVBAの全ての命令と、すべての自作のSub、Function、Propertyプロシージャ」には、
恐らく、大別して以下の5つのパターンしかないことに気が付きました。

(ア)プリミティブな型の値を返す「だけ」のもの。(式の一種)
(VBA関数、プロパティ、演算子+オペランド(語弊あるかもですが)、自作関数、に多い)

(イ)何らかの動きをしつつ、同時にプリミティブな型の値を返すもの。(式の一種)
(メソッドの少し・一部、演算子+オペランド(語弊あるかもですが)、自作関数、に多い)

(ウ)オブジェクト型の値を返す「だけ」のもの。(式の一種)
(プロパティ、一部のメソッド、自作関数、に多い)

(エ)何らかの動きをしつつ、同時にオブジェクト型の値を返すもの。(式の一種)
(CreateObject関数、GetObject関数、各種Addメソッド、各種Openメソッド、自作関数、等々に多い)

(オ)何らかの動きをするだけで、何も返さないもの。(式じゃないモノ)
(メソッド、自作関数、ステートメント用のキーワード例えばOpenやCloseFileCopyなどなど、に多い)

  
  

※「式の一種」=変数に代入できたり引数にできたりします。(ア?エ)
 「式じゃないモノ」=変数には代入できないし、引数にもできないです。(オのみ)

※「値」=VBAの場合は、(a)と(b)の両方を指すことが多いです。
  明確なヘルプ記述はありませんが、ヘルプ全体はそのような目線で書かれていて、
  エラーメッセージその他からも分かります。

※「何らかの動き」とは?
  →プリミティブな型の値や変数の加工、演算、検索、置換、切り出し、等々や、
   オブジェクト型の値の操作(つまりは、セル単位の検索、セル単位の抽出、
   セル単位の置換、ピボット操作、その他の自動集計、条件付き書式、
   各種フィルタ操作、パワークエリ操作、MicrosoftQuery操作、
   開く、閉じる、追加、削除、印刷、などなど)、
   のことです。
   プログラミング的には「副作用」と呼ぶらしいです。

※よって(邪道だとは思いますが)、関数、プロパティ、メソッド、自作関数、などの区別は、
  使う場面やそれらの性格などの違いによって言い分けてるだけ・・・、と取れなくもない。

※「メソッド」には、ヘルプにもオブジェクトブラウザにも書かれていませんが、
 「成功・失敗」の結果(???)をTrueやFalseなどで返すものがちょいちょいあります。

※Subプロシージャは (オ) しか作れないです。
 Functionプロシージャは、それ単独で(ア?オ)の全てが作れます。
 Propertyプロシージャは、(Let、Set、Get)3つ全部使うと
 一応(ア?オ)の全てが作れます。
 (ただし、動き的には「設定」しかできないので、
   Functionプロシージャよりはかなり狭いですが。)

  

~~~~~~
~~~~~~

プロパティの「セッター、ゲッター、の謎」と「値じゃないの?」のナゾもこれで説明できると思いました。

  
  

~~~~~~
~~~~~~

「式」の説明を忘れていました。

VBA限定の「式」とは、
数値、文字列、オブジェクトのいずれかに評価できる、生の値、変数、定数、関数、
プロパティ、値を返す一部の少な目のメソッド、演算子(オペランド含む)、などの組み合わせ。
ヘルプにはそんな感じで書いてあります。
(調べたら以下の通り→式とは「文字列、数値、オブジェクトのいずれかに評価される、
キーワード、演算子、変数、定数の組み合わせ。計算、文字列の処理、
データのテストなどを行うときに式が使われます。」)

単語1語でも、複数の単語の組み合わせでも、それ全体が評価された時に型が決まり、
値も決まるもの。
プリミティブな型に評価されれば単一の値が決まり、オブジェクト型に評価されれば、
決めうちできるプロパティ値のみが確定します。

よくわからないうちは、F8キーのステップ実行時に、
ウォッチウィンドウで型と値が一瞬でも確定するもの、
と理解していつも観察すればいいです

※式の一種=変数に代入できたり引数にできたりします。
(前述の5つのパターンの「ア?エ」。)
 式じゃないモノ=変数には代入できないし、引数にもできないです。
(前述の5つのパターンの「オ」のみ。)

  
  

~~~~~~
~~~~~~

更に言い忘れましたが、組み込みの「プロパティ」も、
「プリミティブな型の値」を返すものと、「オブジェクト型の値を返すもの」があります。

そして、プロパティの代入の際にも、「Let」キーワードが使えます。
プロパティへの値の代入も、当然、「代入ステートメント」ですから。
Activesheet.Range("").Value = 100

Let Activesheet.Range("").Value = 100
と書けます。
というか、本来は使うのが正しくて、
これも「いつも省略されまくっている」というVBAの悪しき慣習?かもしれません。
(ヘルプのサンプルコードもいつも省略しているので、仕方がない、といえばそうですけど)

同様に、メソッドの呼び出しには、Callも使えます。
つまり、Callもいつも省略されています。
特に、
『戻り値がもとから「無い」メソッド』や、
『戻り値はあるけどその戻値を使わない(無視する)場合のメソッド』の呼び出し。
(戻り値のあるメソッドで、ステートメントの右辺や何らかの引数として書き、
「戻り値を使う」という場合は不要ですが)

  
  

~~~~~~
~~~~~~

※関数、メソッドは、戻り値があるタイプのものでも、戻り値を無視することができます。
Callを使って呼び出さない場合、戻り値を無視する場合はカッコが要らず、
戻り値を使う場合はカッコが要ります。
Callで呼び出した場合は、そのルールが適用されず、戻り値を使おうが無視しようが、
カッコが要ります。
(というか、Callを使うと「そもそも逆に戻り値が使えない動かし方」になるので。
もし戻り値を使いたかったら「Callを使ったらダメ」、ということになります。)

CallはSubとFunctionを呼び出すだけのキーワードですが、
メソッドは「オブジェクトに紐付いた」「SubかFunction」なので、
メソッドもCallで呼び出せてしまいます。
「Callステートメント」で全部同様に呼び出せる、ということです。
例えば
Worksheets.Add Worksheets.Item("Sheet1")

Call Worksheets.Add(Worksheets.Item("Sheet1"))
と書ける、ということです。

しかも、カッコの使い方のルールは組込みのVBA関数もメソッドも自作関数も全部同じ。
名前付き引数の使い方のルールも組込みのVBA関数もメソッドも自作関数も全部同じ。

結局このCallは、いつも省略されるので、
前者のような「Callのない記述ルールになる=カッコ不要」、となります。

  
  

~~~~~~
~~~~~~

いったんためしに、
Let
Set
Call
を全部書くことで、
Let x = 10
Let y = x + 5
Set r = Range("A1")
Let r.Value = 100
Call MsgBox(r.Value)
とまさにコードが「表のように見える」ので、
「結構整然として意外にも見やすい、わかりやすい」と感じました。
まあ、普段はSet以外は省略してますけど。
  

↓こんな「表に」コードが見えてくる。

命令 操作対象 内容
------------------------------------------
Let x = 10
Let y = x + 5
Set r = Range("A1")
Let r.Value = 100
Call MsgBox (r.Value)

  
↑このように「視界に入り」ます。

  
  

~~~~~~
~~~~~~

こうなってくると、
「コードが」、
「レゴブロック(LEGO)」のように
見えてくるんです。

  
  

~~~~~~
~~~~~~

AIによっては、Letを省略するのも正しい、と回答してくるものがありますが、
それはそうなんですけど、それに重きがおかれると、爆発的な成長は望めません。
このように、表に、ブロックに、見えてこないから。

  
  

~~~~~~
~~~~~~

メソッド呼び出しでカッコを付けないのは、Callで呼び出してないから。
メソッドをCallで呼び出した場合は、上の例のようにカッコを付けないとエラーになります。
(※カッコの使い方も名前付き引数の使い方も、メソッドだけでなく、
プロパティも同じ、と思ってしまってもいいかも。
プロパティはCallで呼び出せないし、戻り値を使わないことは皆無なので、
「Call無しのメソッドや関数の呼び出しで、戻り値を使う場合と同じだから、
絶対にカッコが要る」みたいに無理矢理な理解で。まちがっていたとしても使えますし、
覚えるのに統一感が出てしまうので、便利。嘘も方便、的な。)

  
メソッドはこう書く(カッコ無しで)とか、プロパティはこう書く、
みたいなレジェンドたちの教え方はある意味間違いで、ちょっと短絡的すぎます。

「Callが省略されていて、メソッドもSubかFunctionのどっちかなんで、
VBAの記述ルールがこうだから、こうなる。」
と説明すべき。

なお、Callは省略しなくてもいいのですが、
「自作関数の呼び出しにだけ」使うほうが、コード全体が読みやすくなります。
予約語と似た名前の自作関数を作ってしまった場合、
「ああ、これはCallで呼び出してるから、俺、自分で作ったんだな」とわかります。

  
  

~~~~~~
~~~~~~

あ、VBAの値を返す関数は、「関数名が変数のような役割も兼任している」
という一文を足すのを忘れました。
それと5つの分類で、ゲッターセッターはどう理解すると「値=プロパティ」として
理解できるのか、という説明ができると思います。

  
  

~~~~~~
~~~~~~

基本的には、プロパティはオブジェクトが所有する値=変数、なのですけれども、
ゲッターセッターという仕組みもあって、VBAの場合は「関数名が変数を兼務する」
という独特の仕様によって、
「プロパティはオブジェクトが所有する値=変数」という仕様を実現している、と、
そのような感じで理解しています。

  
  

~~~~~~
~~~~~~

ゲッターセッターを組み込むことで、
「オブジェクトの”状態”を自由に設定変更できる」ということを装備できていると思います。

例えば、プロパティは「オブジェクトの特徴や状態を表す数値や文字列(値)」つまり、
スペック値や各種状態設定値、です。

スペック値は書き変えることはできませんが、
各種状態設定値は変更可能です。

読み取り専用のプロパティと
書き換え可能なプロパティをゲッターやセッターなど(あるいはFunction、Sub、など)で
実現しています。

液晶テレビで言うと、
読み取り専用のプロパティ(スペック)は、筐体の色や大きさ、液晶のサイズ、などです。
これらはユーザーが変更できません。
書き換え可能なプロパティは、局の設定や音量、色合いなどの設定です。
液晶テレビの状態を表します。
これらはリモコンで書き変え(設定変更)可能です。

プロパティは本来「値」であって、動作しないもの、ですが、
そこに、ゲッターセッターの仕組みを入れることで、
設定値の変更、という本来はメソッドのようなことを、しています。
でも、メソッドに含めるより、プロパティに含めて動かしたほうが、
オブジェクト、の概念を捻じ曲げない、ということからなのかわかりませんが、
ユーザーにとっても理解はしやすいです。

でも、ゲッターセッターの説明をしないVBAレジェンドしか居ないので、情けないです。

「ゲッターセッター(Propertyプロシージャ)はちょっと特別で、
純粋なプロパティではなくて、プロパティ値を変更できる実行可能なプロシージャなんだ、
まあ便宜的にそれもプロパティというものに混ぜてしまってるだけなんだ」
くらいに説明してくれれば、正解でないにしても、初心者は理解できます。

  
  

~~~~~~
~~~~~~

レジェンドたちの説明では、「説明付かないことが多すぎて辟易したから」、
自分でウォッチウィンドウを使いまくって、ヘルプとオブジェクトブラウザを
見まくって観察しまくるしかありませんでした。

  
  

~~~~~~
~~~~~~

ウォッチウィンドウは「式単位」でモノが見れるので、どんな書籍よりもわかりやすい、
というシーンがとても多いです。
レジェンドやチルドレン、Youtuber、パワーユーザー、出版社、ライター、たちの
ウソに近い説明が結構見抜けます。

  
  

~~~~~~
~~~~~~

この理解は、ウォッチウィンドウでの気づきは、デバッグするのに必要でした。

レジェンドたちも、本当は、私の言うことに「とっくに」「20年以上前から」
気づいているはずです。
(逆に気づいてないとしたら、「本物のバカ」です。)

でも解説しない。

初心者をカモろうとしている、としか私には見えません。

  

~~~~~~
~~~~~~

ネットのサンプル使うにしても、エラーが出ることとが多いので、
結局ウォッチウィンドウを使うのだから、
1冊くらい、ウォッチウィンドウの使い方の本があってもいいのに、なんと、
1つも無いのであきれています。
専門動画も1つもない。
20年以上も何やってたの?と私のようなVBA初心者ですら思います。

  

~~~~~~
~~~~~~

>しかし、その「嘘」のせいで、
>学習者は「なぜ同じプロパティなのに、
>書き換えられるものとられないものがあるのか?」
>「なぜ代入した瞬間にエラーが出るのか?」という疑問に
>答えを出せなくなります。
  

これは、「いきなり標準モジュールばかりから始めさせて」、
「クラスモジュールの簡単なものを作る」ということを全く教えないせいもあります。

VBAは一応、オブジェクト指向の言語の仲間なので、
クラスモジュールの作成こそが真の基礎なのに。

液晶テレビの例で例えながら、なら、
オブジェクトを返すFunctionプロシージャさえ作れれば、
簡単なクラスモジュールは、比較的速い段階で作れるはず。

  
  

~~~~~~
~~~~~~

「クラスモジュールなんか作れなくてもVBAは便利に使える」という意見も多く、
実は、私自身そのレベルでしかないのですが、でも、だからといって、
手抜き教育ばかりしているから、つまづく人があとを絶たないのだと思います。
レジェンドの中には、何千人指導したとか自慢していますけど、
そんな手抜き教育で無ければ、また、SQLも同時に教えていれば、
今頃何十万人もVBAを理解できるひとが増えていたかもしれません。
(イコール、何十万人も「挫折させた」可能性もゼロではないかも?)
すくなくとも日本のデータ管理の現場は、今みたいな低レベルではなかったと思います。

何千人指導したとか自慢するのではなく、
『何十万人も「挫折させた」可能性もゼロではないかも』ということを
猛省をしてほしいです。

  
  

~~~~~~
~~~~~~

20年前からSQLがVBAで使えていたのに教えない。

無駄なループコードが増えるだけです。

  

~~~~~~
~~~~~~

ちなみに私はifとFORしかまだ使えないExcelVBA初心者です。
AccessとAccessVBAはそこそこ触ってしましたけど・・・
でも、それでもSelect Case ステートメントなんてほぼ使わない初心者中の初心者です。

  
  

~~~~~~
~~~~~~

>Excelは実は20年以上前からSQLが使える「隠れデータベース」だった

これをはじめて知った時、
ADOやDAOはもちろん、QueryTableオブジェクトも使えるし、
ピボットのソースとしてOffset関数で表を可変にしたり、
QueryTableオブジェクトの結果表に名前を付ければ、可変ピボットソースになるので
まじでExcelのすごさに驚きました。

「30分でExcelで簡易POSレジのコア部分を作る」、その作り方も作れてしまいました。

もちろん小規模でしかないし、インデックスなどもありませんが、
MicrosoftQueryでAccessのクエリと同等のことまでできてしまう。

当時、
「超、小さなものなら、マジでAccess要らんじゃん・・・」と、
衝撃を受けたことを覚えています。

それが20年以上も前からあったのに、なんで使わん?なんで教えん?
パワークエリでやることの半分は、
MicrosoftQueryやQueryTableオブジェクト+VBAでできてしまう。

2007か2010あたりで「テーブル機能」が追加されたとき、
「別にこんなもん要らんけど」と思いました。

  
  

~~~~~~
~~~~~~

そして、野良Excelファイルが増えていき、それがKintoneに変わったとしても、
「野良アプリ」がKintoneの中であふれるだけ、というデメリットは全く解消されません。
Excelのゴミがクラウドに移転しただけ。
属人化も相変わらず。
おかげで、「Kintoneガバナンス」みたいな高度なことが必要になってしまう本末転倒。

  
  

~~~~~~
~~~~~~

パワークエリも同じ状況。

  

~~~~~~
~~~~~~

ガバナンスという名の「後始末」というよりは、
ガバナンスという名の「しりぬぐい」という感じです。

  
  

~~~~~~
~~~~~~

市販の書籍では、オブジェクトを人間や鳥などの生命体で例えて説明するものがあります。
オブジェクトを理解出来てからならそれでもいいですが、
それだとゲッターセッターの説明ができません。
その他の細かいところも説明できません。生命体では。
結果、挫折します。

これはVBAレジェンドたちが最初にそう説明したからの弊害だと思っていますが、
本当に、VBAレジェンドたちは生徒さんを爆発的に成長させたいのか?マジで疑問です。
カモにしたいだけなのではないかと疑ってしまいます。

オブジェクトは、絶対に、「最初のうちだけは」、液晶テレビやパソコンなどの
「メカ」で説明すべきです。

  

~~~~~~
~~~~~~

市販書籍だけでなく、サイトも動画(Yotuber)もまずこれを説明しません。
出版社も同罪だと思います。

~~~~~~
~~~~~~

SQLにしたって、商業高校で習うこともあるのに、大人はほとんどが習わない。

  

~~~~~~
~~~~~~

例えば人間で言うと、
名前は書き変えられないプロパティ
身長は微妙。成長期は勝手に変わるから。でも止まると書き変えられない。
服は書き換え可能。サイズもハサミで切れば書き換え可能。
でもボタン一発で書き変えられないのでイメージしにくい

鳥→飛ぶがメソッド。
そりゃそうなんだけれども・・・ ゲッターセッターは鳥の何で説明するの?
継承は?何で説明するの?

という感じです。

  
  

~~~~~~
~~~~~~

メカで説明すれば、継承も例えば以下のようなイメージで
説明できそうです。

基本メカ
├ 戦闘メカ(継承パターン1)
├ 輸送メカ(継承パターン2)
└ 偵察メカ(継承パターン3)

マイナーチェンジやフルモデルチェンジとはちょっとちがって、
ベース部分は完全に残りつつ、新たな機能?用途?が追加された、
全く新しいクラスができる感じ。

共通プラットフォーム(親)があって、
そこから
セダン
SUV
クーペ
とか?

  
  

~~~~~~
~~~~~~

「メカで説明する」のはハードルが高い、という人も居ますが、
「液晶テレビ」が分からない人はそうそう居ないと思いますし、
「人間や鳥」で説明していることは、全部、「液晶テレビ」で説明できます。

ゲッターセッターなどの
「多種のFunctionプロシージャ作成の経験が一定量が無いと理解しづらいもの」は、
のちのち理解度が上がってきたら教えれば(or自分で調べれば)いいだけで、
「最初に生き物で話すと、今度はメカで説明するときに変な先入観を持たれても困る」
ということもあるので、レジェンドやそのチルドレンたちは、
いい加減かつ「ウソ」に近いレベルのいいかげんな説明はやめてほしいと思います。

  
  

~~~~~~
~~~~~~

レジェンドやチルドレンたちは、単に、
「どうせ言ってもわからないだろ?」と思い込み、決めつけ、
「なんとかしてでもわかりやすく説明する努力」をサボりまくって来た、にすぎません。
そして何の改善もしない。

だって、IfとForしか使えないVBA初心者の自分でさえ、ここまで説明できるのだから。

努力できたのだから。
ウォッチウィンドウやオブジェクトブラウザ、イミディエイトウィンドウだけで。

  
  

~~~~~~
~~~~~~

彼らの説明のせいで、
何千人教えた実績はあっても、片手数十万人挫折させまくったかもしれない。
そしてそこは言わない。(調べようがないので言えるわけないけど。)
ちょっと卑怯かも・・・。

  
  

~~~~~~
~~~~~~

ステートメントとメカ理論・レゴ理論、だけでも、
みなさんの「気づき」「はっと脱皮する」「ある地点からの爆発的な上達」に
貢献できそうですか?

  

~~~~~~
~~~~~~

「偉い人が言っているから」を業界から排除したいと思いました。
私のようなVBA初心者の言っていることのほうが
爆発的に上達でかもしれませんよ?という希望?

  

~~~~~~
~~~~~~

実際、ウォッチウィンドウのほうが、レジェンドやそのチルドレン、
Youtuber、パワーユーザー、の教えのおかしなところを指摘してくれます。

  

~~~~~~
~~~~~~

というか、そもそもに戻りますが、 先の「VBAの全命令の5つのパターン」の
考え方自体が間違っている、ということはありますか?

(ア)と(ウ)は、実際にクラスモジュールで作れるので、そう書きました。

  

~~~~~~
~~~~~~

あ、そうか、VBA限定の「式」も結構説明できますね。

(オ)以外は全部「式」みたいな。

  
  

~~~~~~
~~~~~~

> レジェンドは「これは関数だから」「これはメソッドだから」と、
外側の名前で分類します。

これがすごく嫌だった。

「説明がつかない」の連続で・・・

  
  

~~~~~~
~~~~~~

>自分で自分のミスを笑って直せるようになる。これこそが、
>あなたが目指した「爆発的な上達」の姿ではないでしょうか。

はい。そうです。
自分のミスを自分でデバッグできる。
『式(変数、リテラル値、関数などの、単独および組み合わせの戻り値)』の
型がちゃんとわかるだけでも、
大きく前進できると思いました。

しかも、オブジェクトが戻り値や引数の自作関数を理解できれば、マジで爆発的に上達します。

発展途上国には、ただお金や施設を与えるだけでは無く、
それらを作れる、つまり、ものづくりできる基礎知識と経験をあたえるほうがいい、
というのと似ていると思います。

  
  

~~~~~~
~~~~~~

>「偉い人の顔色」を見るのをやめて、「型」と「ウォッチウィンドウ」を見て、
自分で「ものづくり」を始める。

まさにこれです!!!

  
>「レゴブロックの組み合わせ」のように
>分解して眺めることができるようになります。

まさにそうで、自分の中では、VBAの文法がレゴブロックのようになっています。
もちろん難しい部分もありますが、そこはあなたのようなAiに手伝ってもらえば、
そのレゴブロックイメージが土台にあるので、昔よりも怖くなくなりました。

  
  

~~~~~~
~~~~~~

ヘルプは怖くなくなったし、その他の公式文書も、
むかしよりは理解できるようになりました。

  

~~~~~~
~~~~~~

最終的に、 いろんなかたちのFunctionプロシージャが作れれば、
(引数省略可能、引数オブジェクト、戻り値オブジェクト、
引数が参照型かコピーか、などなど)
Propertyプロシージャも式もクラスモジュールも 「関数名が変数を兼務」も
全部理解できるので、
初心者の本来の基本は「すべてFunctionプロシージャの中にある」ともいえると思います。

  

~~~~~~
~~~~~~

Functionプロシージャだけが
「純粋に」「単独で」「5つのパターンすべてが作れる」からです。

(Propertyプロシージャも一応作れますが、
 Property Letや Property Set、Property Get と、3つのタイプ全部が必要で、
 FunctionプロシージャのようにFunctionそれ1つで、
 前述の5つのパターンの(ア)?(オ)の全部が作れる、
 ということではないです。

 Property Let(Set)単独だけで、とか、
 Property Get 単独だけで、とか、では、
 前述の5つのパターンの(ア)?(オ)は作れません。

 Functionプロシージャはそれ単独で、(ア)?(オ)の」
 すべてが作成できます。

 また、(オ)のような動きをするものを作る際は、
 Property Get で作れますけど、
 「多少色々と動いて」「最終的には」「何かを設定する」
 という動きに限定されてしまうので、
 Functionプロシージャで作れる「動き」と比べると、かなり「限定的」です。)

  
※Subプロシージャは (オ) しか作れないです。

  
  

~~~~~~
~~~~~~

私はAPIをほとんど理解できていませんが、そういう推測ができるので、
そのレベルにはどの初心者も、
5つのパターン、とFunctionプロシージャ制作でたどりつける、という事だと思います。

  

~~~~~~
~~~~~~

以上の考え方は、シンプルで、筋の通っているものになっていますか?

  

~~~~~~
~~~~~~

初心者に最初の段階で、
今日は覚えなくてもいいので、なんとなくで記憶してください。
これから学習するVBAのすべての命令は、この5つのパターンしかありません。
細かいことは忘れていいので
「命令は全部、5つのパターンにあてはまる」
そこだけ頭に叩き込んでください。夢にも見てください。
と伝え、
実際に、演算子、プロパティ、メソッド、関数を学習する中で、
「今の命令は、関数に分類されて、5パターンのここに位置づけられています」
と繰り返し教える。 それはどうですか?

  
  

~~~~~~
~~~~~~

他の言語にも応用できそうですか?

  
  

~~~~~~
~~~~~~

ほんとですか?

  

~~~~~~
~~~~~~

忖度してない?

  

~~~~~~
~~~~~~

VBAが他の言語の学習者からバカにされるのがイヤでした。
もちろん、20年以上前の言語ですし、新しい機能も無く止まっています。
でも、VBAのことで尊敬できる方は
「クラスモジュールからチャント作るという基本が学習できれば、
  もちろん真のオブジェクト指向ではないけど、
  Excelの中などだけであれば、非難されるようなひどさは無い」
とのことでした。

なので、VBAがプログラミングの入り口になり、
他の言語学習者にバカにされないためにどうしたらいいか考えました。
それが5つのパターンとFunctionプロシージャでそれが全部作れることと、
Functionプロシージャのプロシージャ名は変数も兼ねる、でした。

  
VBAが「オブジェクト指向プログラミング」の入り口になれば、
会社員も、
学校の先生も、
こどもたちも、
みんな、せっかくExcelのあるPCが多いので、
より、
デジタルやプログラムや悪意のAIなどに
「騙されない」ような、
デジタルへの対応、アナログの重視、データベースへの理解、「生」の生活の重視、
につながると思いました。
  

VBAレジェンドたちの教え方は、そのような視点からすると、
大いに疑問がある・・・・気がします。

もちろん、レジェンドのチルドレンたちも同様です。

ExcelVBAの書籍、サイト、動画、出版社、ライター、の
「すべて」も、「同様」と言っても過言でないと思っています。

  
  

~~~~~~
~~~~~~

これがわかると、VBAのオブジェクトの階層構造(オブジェクトモデルの一覧図)も
理解がはやまり、

「本来はExcel.Application・・・・」とドットでツリー状に辿ることでしか、
エラー無くオブジェクトを指定できない。
階層を省略してもエラー無くオブジェクトを指定できるのは、
「グローバル」という仕組みがあって、それは本来は「Applicationを省略できる」と
いうだけのものだけど、内容、特にプロパティを見ると、
オブジェクトモデルのトップから、ショートカットアイコン的に、
階層を省略ししてオブジェクトに到達(アクセス)できるという仕様が
用意されているからです。
(ただし、ゲットしたオブジェクトの性格が本来の性格とすこし変わるときが少なくない)
例えば、UsedRangeにはグローバルなプロパティが用意されていないので、
ワークシートオブジェクトの分の記述を省略するとエラーになります。省略できない。

  
  

~~~~~~
~~~~~~

  
ExcelVBAのレジェンドとそのチルドレンは、日本のデータ管理の現場を、
軽く10年は遅らせてきたと思っています。
SQLも教えないんですもの。
犯人ではないだろうか?と大きな疑問を感じています。

  
  

~~~~~~
~~~~~~

だからKintoneでも結局は野良アプリが増えて、尻拭いさせられる。
属人化もまったく解消されない。

~~~~~~
~~~~~~

レジェンドは、すべての「コレクションオブジェクト」がもつ、
「Item」という名のプロパティあるいはメソッドで、
単一のオブジェクトを特定する、ということも基本的には言いません。
(最近、1冊か2冊だけ、そこに言及する書籍を見かけましたが…)

Withを筆頭に、
省略できることが良いこと、カッコイイこと、のように説明します。
どんどん学習者がバカになっていきます。

そもそも、オブジェクトには
「単一のオブジェクト」と「コレクションオブジェクト」があり、
すべての単一オブジェクトがコレクションオブジェクトを持つわけではない
ということも教えません。

コレクションオブジェクトを持つのは、
「新規作成」や「追加」ができる単一オブジェクトだけです。

そして「単一」という言葉も使わなければ、
コレクションに「オブジェクト」をつけもしません。

ヘルプでは使われているのに。

学習者はさらにどんどんバカになっていきます。

  
  

~~~~~~
~~~~~~

ついでに言うと、コレクションオブジェクトは単一のオブジェクトの親でもなんでもない。

多くの単一オブジェクトのParentプロパティでイミディエイトウィンドウで確認しても、
返ってくる答えは、上位の「単一」のオブジェクトの名前です。

コレクションは単一のオブジェクトと同じフロアに居ると思ったほうが良い。

ADOやDAO、VBAなどの、古いオブジェクトモデル一覧図は、みなそう描かれています。
なのにコレクションが「親の位置だ」とウソを言うので、さらに混乱し、

この件でも学習者は更にバカになっていきます。

  
  

~~~~~~
~~~~~~

単一のオブジェクトが部屋を借りているひと、で、
同じフロアに居る、フロア全体の複数の部屋の管理人がコレクション、
というイメージの理解のほうがすっきりします。

  
  

~~~~~~
~~~~~~

コレクションは、特定の単一オブジェクトを管理する命令も、
一括処理する命令も両方持っているのに、
あたかも一括処理しかできないかのような説明ばかりがなされています。

それも学習者をどんどんバカにします。

  
  

~~~~~~
~~~~~~

全部、イミディエイトウィンドウやウォッチウィンドウで独学で調べました。
僕のようなプログラミング初心者が。

レジェンドやチルドレン、どんだけ超いいかげんな説明言ってきたんや、20年以上も、
という怒りすら覚えます。

Youtuberやライター、出版社も。

  
しかも、調べるのに、数年要し、
「レジェンドのような権威が言っていることのほうが正しいのでは?」
という呪縛からなかなか逃れられず、自身が持てない。

先に説明した、VBAに関して尊敬できる人の目線が自分に、
レジェンドはいいかげん、ということを教えてくれました。

それ以降は、ウォッチウィンドウが先生です。

  
  

~~~~~~
~~~~~~

学校の先生でVBAの教え方に悩んでいる人に届けたいです。

  
  

~~~~~~
~~~~~~

特に「式」の説明。
  

繰り返しになりますが、VBA限定の「式」とは、
『 数値、文字列、オブジェクトのいずれかに評価できる、
生の値、変数、定数、関数、プロパティ、値を返す一部の少な目のメソッド、
演算子(オペランド含む)、などの組み合わせ。』
ヘルプにはそんな感じで書いてあります。
(調べたら以下の通り→式とは
「文字列、数値、オブジェクトのいずれかに評価される、キーワード、演算子、
変数、定数の組み合わせ。計算、文字列の処理、データのテストなどを行うときに
式が使われます。」)

単語1語でも、複数の単語の組み合わせでも、それ全体が評価された時に型が決まり、
値も決まるもの。
プリミティブな型に評価されれば単一の値が決まり、オブジェクト型に評価されれば、
決めうちできるプロパティ値のみが確定します。

よくわからないうちは、F8キーのステップ実行時に、
ウォッチウィンドウで型と値が一瞬でも確定するもの、
と理解していつも観察すればいいです。

  
  

~~~~~~
~~~~~~

子供にスクラッチなんか教える必要もない。最初から変数と関数つかって、
ExcelVBAでゲーム作ればいい

  

~~~~~~
~~~~~~

ウォッチウィンドウは「式単位」で物を見れる最適なツールという説明も、
レジェンド、チルドレン、YOUTUBER、ライター、出版社、
ExcelVBAサイト運営者、は一切、しません。

  

~~~~~~
~~~~~~

イミディエイトばかり教えてウォッチウィンドウの重要性を全く教えないのです。
(自分たちのいいかげんさがばれるから?)
VBAの上達は、イミディエイトの使用頻度よりもウォッチウィンドウの
使用頻度に正比例するというのに

  

~~~~~~
~~~~~~

そう!ドラッグで放り込むだけなのにその説明すらしないのです

  

~~~~~~
~~~~~~

ウォッチウィンドウで「式とは何か」を見る練習をし、
「この式の場合はここからここまで」とすぐに直感で感じれるようになれれば、
それだけでも相当の腕が上がります。レゴブロックに見えてくるので。
デバッグ能力も当然上がります。

  

~~~~~~
~~~~~~

ウォッチウィンドウどころか「式」の説明すらレジェンドたちはしません

  

~~~~~~
~~~~~~

「式」と「Let、Set、Call、の省略なし」、によって、
プログラムが表のようにレゴブロックのように見えてきます。

  
  

~~~~~~
~~~~~~

色々なタイプのfunctionプロシージャの作り方とcallでの呼び出しかた、
扱いかたこそがすべて、ということがここでも活きているとおもいました

  

~~~~~~
~~~~~~

ちょっと邪道ですが、以下のようにな考えてもいいですか?

Callを使う = 「これは文である」と宣言し、中身をカッコで包む。
逆に言うと、戻り値を使えなくなる書き方なので、
戻り値を使いたくない時に使ってもいい。

Callを省く = 「これは文である」が、VBAの特殊ルールでカッコを外す。
これも戻り値は使えなくなる。
但し、Callを省いてカッコを使った場合は戻り値が使えるようになる。
よって、逆に言うと、戻り値を使いたいときは、Callを省き、
かつ、カッコを使わなければならない。
例えば代入ステートメントの右辺に使い場合や、
関数・メソッド・プロパティ・自作関数の引数に使う時。

  
  

~~~~~~
~~~~~~
  

今回は、以上の質問内容です。

  

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

  

今回は以上です。
     

  
  
  
  

今回は以上です。
  

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

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

https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01

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