★ExcelVBA・AccessVBA ~ 「オブジェクト」も「値」に含めて理解してしまう理由(急遽はたと思ってChatGPTにも質問してみました→日本のVBAの講師ども「特にレジェンド」が「AI以下」ということが露呈したかも?)
  
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。

  

VBAにおいて、なぜ「オブジェクト」も「値」に含めて理解してしまうのか?

VBAのヘルプを読む際には、そう理解してしまったほうがしっくりくる場合が少なからずあるから、、、です。

実は、明確に、オブジェクト=値の1つ、と解説されたヘルプページはなさそうです。
でも、実際にVBAのヘルプを読む際には、「オブジェクトも値のうちの1つ」と理解してしまうほうが意味を理解しやすい場面が多々、あります。

例えば、エラーメッセージの解説で、
「代入式の左辺の関数呼び出しは、バリアント型またはオブジェクト型の値を返さなければなりません。」
というものがあります。

「オブジェクト型の値」とあります。これは、「オブジェクトも値のうちの1つ」と理解してもOKということです。(無理矢理かもしれませんが。)

また、「バリアント型またはオブジェクト型の値を」とも書かれているわけですから、
これはつまり、「 ”バリアント型の値” と ”書いた” 」ということと同じです。
そもそもなのですが、例えばバリアント型の変数には、文字系のデータだけではなく、オブジェクト(オブジェクトへの参照)も格納出来てしまいます。

(※「文字系のデータ」=「プリミティブな型のデータ」です。プリミティブ=基礎的な、とか、原始的な、とかの意味だそうです。ここでは、数値、文字列、日付データ、時刻データ、Ture/Falseの論理値、などのことを指します。VBAのヘルプにはプリミティブという言葉は出てきませんが、他のプログラミング言語ではヘルプ的なモノはどうなのかわかりませんが、でも多分たくさん出てきますので、一応、知っておかないといけないですし、それが、実は、「ある地点からの爆発的な上達」にも、意外と関係します。ナメると結構上達できなくなったりします。ご注意ください。)

ヘルプではバリアント型について、以下のように説明されています。

『バリアント型は特殊なデータ型で、固定長の文字列型 (String) データとユーザー定義型を除く、あらゆる種類のデータを格納することができます。また、バリアント型には、特殊な値 Empty 値、Null 値、およびエラー値や Nothing なども格納することができます。』

これはどう見ても「オブジェクト型のデータもOKだよ!」と言ってもいることになります。「あらゆる種類のデータを格納することができます」なのですから。(固定長の文字列型 (String) データとユーザー定義型は除くけれども、ですが。でも「ほぼ全部」、というくらいの感じです)

なら、バリアント型のデータを説明するとき、その「値」(中身)については、文字系のデータはもちろん、オブジェクトも含まれるわけですから、
逆に言うと、
VBAでは、「バリアント型というデータ型があるがゆえに」、
「値」=「プリミティブな型のデータ(数値や文字列など)とオブジェクト型のデータの両方」、
としなければ、なかなか説明がつきません。

そもそも「戻り値」とか「値を返す」などの場合、VBAに限って言えば、
「戻り値はオブジェクトです」とか、
「オブジェクトが返されます」とか、
そういう文章を何度も見ます。
これも、「値=オブジェクトも含む」の証となると思います。

引数だって「オブジェクト」の引数がありますし。

さらに「そもそも」ですが(話がヘルプから逸れますが)、
例えばオブジェクト変数にオブジェクトを格納する、というのは、
「オブジェクトのコピーを格納するのではなくて、オブジェクトへの参照を格納する」
という意味でもあります。

その際、「オブジェクトへの”参照”」の「参照」とは、
すなわち、「オブジェクトへのショートカットアイコンのようなもの」です。
デスクトップに置いた「ファイルやフォルダ、プログラム本体などへのショートカットアイコン」のことです。

つまり、「オブジェクト変数にオブジェクトを代入する」、とは、
「オブジェクト変数に、オブジェクトへのショートカットアイコンのようなものが代入される」という意味でもあります。

「オブジェクトを”指し示す”ショートカットアイコンのようなものが代入される」という意味です。

で、その「オブジェクトへのショートカットアイコンのようなもの」は、結局は
「メモリに読み込まれた状態の”オブジェクト”へのメモリアドレス」であり、
その実体は「16進数のメモリアドレス」です。
(メモリは1バイト区切りで、16進数で「番地」=「アドレス」が決まっています。
 そのメモリアドレスのことです。)

ってことは、
「オブジェクト変数に格納されたオブジェクト」とは、
=「メモリに読み込まれたオブジェクトへの”参照”」
=「メモリに読み込まれたオブジェクトへの”ショートカットアイコン”」
=「メモリに読み込まれたオブジェクトへの”メモリアドレス”」
=「それは結局は16進数のメモリアドレス」
=「それは結局は、数値=プリミティブ型の値」

ということになります。

であれば、
「オブジェクト型のデータも、結局は実体は”16進数のメモリアドレス”という」、
「ある意味」「プリミティブ型の値」と言えなくもない・・・、といえます。

このような考え方は関数の引数の「ByRef」も似た感じの話です。

これはVBAだけでなく、他の言語でもこういう理解の仕方の言語はあると思います。
(※後述のChatGPTへの【質問04】と【質問05】でおおむねそれが分かりました。AIの回答なので正確ではないかもしれませんが。)

そのほか、Rangeオブジェクトでは、 「Range.ListObject」プロパティの説明において、以下のように説明しています。
「 Range オブジェクトに対応する ListObject オブジェクトを返します。値の取得のみ可能です。ListObject オブジェクト型の値を使用します。 」

ここでは、「ListObject オブジェクト型の値」、つまり、
「××××××オブジェクト型の」「値」、と説明されています。

ここからも、「オブジェクトも値のうちの1つ」と理解してもOK・・・と読めます。

そのようなことから、VBAでは「値=プリミティブな型のデータとオブジェクト型の両方」ととらえてしまったほうがヘルプや全体を理解しやすいと思います。

  
他の言語ではプリミティブな型のデータとオブジェクトを分けて説明することも多いかと思いますが、、、。

例えば、
「値」は「プリミティブ型のデータのみ」を指し、「オブジェクト」は「オブジェクトとしてのみ」、というかたちで理解する、、、とか。

あるいは、

①「値」→「値型」→「プリミティブ型のデータのみ」
②「オブジェクト」→「参照型」→「オブジェクト型のデータのみ」
といったような感じの理解の仕方とか。

(※もともとこのくらいしか知らないのでごめんなさい。ただ、今回はたまたまですが、はた、と思いついて、ChatGPTに聞いてみました。後述の【質問04】や【質問05】の部分をご覧ください。)

VBAの場合は、以上のような明確な線引きはされていません。
(だから、「逆に」「質が悪い」、のですけど・・・。VBAレジェンドども、VBA講師ども(特にチルドレンたち)はバカだからまったく説明しないし。)

説明になってないような説明で済みませんが、そのような理解で良いと思います。

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

以降、ちょっと長いですが、ChatGPTに聞いてみたときの質問内容とその回答も載せておきます。でも、結構興味深いお話もありました。
是非、面倒がらずにしっかり読んで「爆発的上達」に役立ててください。
(AIの回答なので信用し過ぎずに、でも、理解や調べ物の「大きなヒント」として。)

※ご注意
AIの回答なのでご参考程度に。(結構ヨイショがすごいんですね。びっくり!)
でも、2つ目までの質問の回答などは、多分、間違ってない感じですけど・・・。
ただ、このような内容は、他のオブジェクト指向プログラミングの言語をやっている人なら、誰でも知ってます。多分小学生でも、そこから入った子なら知っています。中高生なら間違いなく理解できています。
なのにVBAの場合は、レジェンドどもも他の講師どももまったく説明しない。
そもそも
「この”値に対する認識”の不足こそが混乱を呼び上達を妨げる諸悪の1つという意識」、
すら
「無い」。
であればVBAやVBAユーザーがバカにされるのもあたりまえですよね。
小中高生でもわかることを教えてもらってないのですから。
それでクラスモジュールも作れないくせに10年以上扱ってるというだけで「上級者」と名乗るバカが多い。VBA的に「上級者」であってもプログラミング的には「単なる落第人間。」
さらには、(いわば)「データ管理の世界標準命令郡」の「SQL」すらも扱えない。

しかもVBA講師も同じ。それと変わらない。
そのレベルの人が少なくない。
バカにされないほうがおかしいです。

日本のVBAの講師ども(特にレジェンド)が「AI以下」ということが露呈したかと思います。

(※「SQL」=僕と同じような超ド素人の方々は「複雑な条件での集計やリストアップをするための理論?命令郡?言語?的なモノ」と思っておけばおおむねOKです。データの蓄積方法や実際のデータ加工などの「世界標準」の基礎です。奥が深いですが初心者でも扱える部分がすごく便利です。パワークエリの仕事の半分はこちらを使うほうが早くて速いですし、VBAとの親和性もいいです。)

※これ以降、すべて、2025/04/18 にChatGPTに聞きました。

  

ついでに「オブジェクト」という言葉についてもChatGPTに聞いてみました。

またもやヨイショがすごかったですが、でもそれほど僕の考え方も間違ってもいないようにも見えました。

  

VBAの「オブジェクトブラウザ」で、
『「クラス」に分類はされているけれども、
 「オブジェクト」という「概念」からは「外れる」もの 』、
についても聞いてみました。
(2か所、『「定数しか内包していない ”モジュール”」』のことを『「定数しか内包していない ”標準”モジュール」』と誤解してるのと、『内容(VBEのオブジェクトブラウザでの「クラス」の列)』を『内容(”VBA内”での”例”)』と誤解してるので、回答的には間違っているのかも???ですが。)

基本、「Newできないもの」は「オブジェクトじゃない」と思っていいみたいですね。
当たり前かもしれませんけど。

でも、日本のVBA講師って(特にレジェンドはレジェンドのくせに)、書籍でもサイトでもそういうこと教えてくれないので、(AIが正しいか間違ってるかわかりませんけど、でも、)そういうことが聞けるだけでもAIは便利なのかも・・・・
(それにしても、今回のChatGPTの回答がもし「全部」「正しい」なら、ものすごいことですよね。VBA講師はもう要らないのかも・・・って思っちゃいました。ヨイショがすごいけど内容も参考になりそうです。)

ちなみに、「Enum」だけでWeb検索すると、

『Enumって何?→→→ Javaのenum(列挙型)とは、複数の定数を一つのクラスとしてまとめておくことができる型です。 enumで定義する定数を列挙子と呼びます。 列挙型は、クラスとして定義されるので、フィールドやメソッドも定義できる点が大きな特徴です。』

『EnumとはVBAで何ですか?→→→ Enumは、複数の数値を1つの変数名で扱うための方法です。 「Enum変数名. 子要素の名前」でデータを扱うことができるため、直感的にわかりやすく数値のデータを扱うことができます(←「侍×××」での、「オブジェクトブラウザでのEnum」ではなくて手作りのEnumの解説でしたが)』

ということでした。

なので「クラスだけどオブジェクトじゃない」と捉えても良い可能性も少しあるのかも?ちょっとよくわかりませんけど。

  

あと、
1つ、ChatGPTに聞いたら、面白い答えが返ってきました。
誤りかもしれないのでちょっとご注意ください。
でも興味深いです。

  

以上、
「ChatGPTのほうが日本の低能・無能なExcelVBA講師どもよりもはるかにいいかも??」と思わされてしまうような質問と回答でした・・・。

ついでに、ChatGPTが推すものも聞いてみました。

  

FunctionプロシージャやPropertyプロシージャ、クラスが持つ変数=プロパティ、についても聞いてみました。

  

あと、「××××××××××××」テキストをはじめとする「ウソ」についても、ChatGPTに聞いてみました。意外と情け容赦なかったでした。

でもAIの言うことなので話半分でお願い致します。
(なんか最後には「ただ僕に合わせてるだけ」みたいなノリになってる気がします)

でも、こういう回答って、どういう学習をしてるとできるんですかね?間違った内容の初心者本が多いのに・・・。Webページなどの何らかの感想や文句も学習するのかしら?

内容的にはもっともらしいですけど、浅い回答なのかもしれないので(ヒントにはしてほしいですけど)、ALLの鵜呑みにはしないでくださいまし。m( _ _ )m

  

本記事の内容も、一部(オブジェクト変数へのオブジェクトの代入について)も、聞いてみました。

  
ついでに、VBAが手続き型プログラミング言語なのか、オブジェクト指向プログラミング言語なのか、どちらなのかも聞いてみました。

正しいかどうかわかりませんけど、「まあ、確かにそうかも・・・」という感じの、割と納得はできる内容でした。

「どうせ誰かに聞いても、ここまで詳しく明確に、また、(自分がメインで使う言語などに対して)そこそこ忖度無しに教えてくれる人は居ない」と考えると、「ある程度の基準」としては受け入れていいのかも?です。

ただ、「ハイブリッド」なんて言葉を使えるようなものだろうか?という部分はひっかかりました。それを言ったら、他の言語だって同じものがあると思うので・・・。

なので、それも聞いてみました。

  

最後に、ChatGPTに諭された質問を載せておきます。
「あ、はい、すんませんでした・・・」って感じです。