★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0055 :【番外】VBAで「値」に「オブジェクトも」を含める理由」とChatGPTへ質問(=某業界・出版界の怠慢露呈?)
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0055
タイトル:【番外】VBAで「値」に「オブジェクトも」を含める理由」と
ChatGPTへ質問(=某業界・出版界の怠慢露呈?)
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
こんにちは。
「【番外】20年以上・ほぼ・説明してもらえない、「セル内に余計な改行がある場合のバグ」について01」の続きを書こうと思いましたが、その前に、たまたまChatGPTに質問を投げかけてみたら、「へえ~・・・・」となりましたので、番外の番外としてご報告をしたいと思います。
他の「オブジェクト指向プログラミング言語」では、細かい違いはありますが、大きく分けて2つのデータを操作します。
以下の2つです。
(01)「プリミティブ型(値型)のデータ」
(02)「オブジェクト型(参照型)のデータ」
これを「主に変数に入れて操作する」ことで「自動化を図る」のが「プログラミング(特にオブジェクト指向の。)」です。
VBAも「オブジェクト指向プログラミング言語」の一種だと思っていいと思いますが(「もどきなだけで違う」というご指摘もありますが)、その際、VBAでは「値」という用語のなかに、上記の(01)と(02)の両方を含めてしまいます。
その理由について、今回、僕の勝手な理解ですが、
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/atai01
にまとめました。
で、その際、「あ、そういえば、こういうことってChatGPTに聞いたらどんな答えが返ってくるんだろう?」と、はた、と思いましたので、ChatGPTに聞いてみました。
そしたら、色々と興味深い答えが返ってきたので、みなさんにもご紹介しようと思います。
AIの回答なので正しいかどうかはわかりませんが、多少の誤りはあったとしても、今回は「質問」のほうが結構参考になると思います。
(というか、もしVBAが「上達したい」なら「質問」のほうは、必読だと思います。ご自分でも考えてみてください。)
『 ChatGPTってこんなに「ヨイショ」ができるのか!!』とすごくビックリしましたが、
VBA教育界(出版界含む)の「怠慢」について、「これほどの回答が返ってくるとは・・・」「どこで学習するの?こういうのって!!??????」と、本当に驚きましたので、是非ご紹介したいなと思います。
ChatGPTには、プログラムコードについて質問するだけでなく、「プログラミング」についての基本的な考え方なども聞いてみるのもいいのかも・・・と思いました。
それが正しいかどうかは、ご自分の先生が居ればその方に聞けばいいし、先生が怪しげな答えしか言わなかったら知恵袋やteratailなどでも聞けばいいと思います。
でもChatGPTの答えは大きなヒントに必ずなります。
下手にQ&Aサイトで聞くよりもいいかもしれません。
(かといってもちろん盲信はご法度ですけど)
というわけで、以降に、その質問を回答の内容のWebページのURLと、質問内容自体を貼っておきます。
是非、VBAの上達のヒントにしてみてください。
僕は「超重要だ」と思っています。
特に「VBAが初めてのプログラミング言語」という方は読んだほうがいいと思います。
今回のものを読まない方は、多分、上達しないと思います。
他の言語を経験されている方は読まなくても大丈夫です。
では、よろしくお願いいたします。
============================
● URL
============================
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/atai01
============================
● 質問内容
============================
※URL先で、Ctrl+Fにて、「【質問××】」で検索してくださると速く見つかると思います。
【質問01】
ExcelVBAにおいて、「値」という言葉があったとき、
プリミティブ型の値のほかに「オブジェクト」も「値」に含めて考えてもいいですか?
ヘルプを読むとそうとしか捉えられないのですが。
【質問02】
ではVBAに限って言えば、
プリミティブ型の値を「データ」ととらえて良いなら、
オブジェクト型の値も「データだ」ととらえてよい、、、、という理解でもOKですか?
【質問03】
ついでにですが、「Variant型」というデータ型が存在する、ということは、
例えば、その型の変数には、プリミティブ型のデータも、
オブジェクト型のデータも代入できるわけですから、
なおさら「値=プリミティブ型もオブジェクト型も両方を含める」
と考えて差し支えありませんか?
【質問04】
逆に、他のオブジェクト指向プログラミングの言語において、
VBAのVariant型のようなデータ型を用意している言語はありますか?
【質問05】
そのような他の言語たちを、
「値=プリミティブ型もオブジェクト型も両方含む」という基準で種類分けするとすると、
どういう表になりますか?
あいまいな地点に居る言語は「あいまい」というところに入れるとして。
【質問06】
さらについでにですが、「オブジェクト」という言葉について教えてください。
以下のように考えていますが、どうでしょうか?
****
「オブジェクト」という言葉は、
手続き形(=キャラクターベース・2Dの)プログラムとの区別をするためだけの
「装置(モノ・3D)」的な意味あいとして、
言わば「概念だけ」のことを意味し、
なんらかの実体を1対1で直接意味しているわけではない。
「オブジェクト」とは、そういう「概念」を意味するだけの言葉。
「概念だけ」のことを言っている。
「概念の話」。
そして「オブジェクト」のその実体としては、
「VBAに限って」言うと、
(a)まず、クラスモジュール(俗に言う「クラス」)に、「定義=プログラム=文字データ」
という形で実在し、
(b)次に、それがNewされるとメモリ上(メモリ内)に「インスタンス」という形でも実在する。
どちらもレイヤー?シーン?は違うけれど、
「オブジェクトという“概念”が実体化・リアル化されたもの」と捉えて良い。
【質問07】
日本のVBA講師は、
「オブジェクトという言葉」=「概念の話」という説明をまったくしないので、
習う側や独学者は、「文脈として」、
①「オブジェクト」という言葉がクラス(クラスモジュール)のことをさしている文脈
②「オブジェクト」という言葉がインスタンスのことをさしている文脈、があり、
③どちらも正解、
ということが理解できずに、
「さもなにか1対1の意味が紐付ているかのごとく」、
ずっと間違いを押し付けられているように思えます。
それがVBAが教えられるようになって20年以上、放置されたままです。
このような現状になった理由は何だと思いますか?
【質問08】
(※正確に質問をとらえてもらえなかったので、回答にはご注意ください。)
さらについでにですが、 VBAではオブジェクトブラウザの画面の「クラス」の列には、
クラスアイコンのほかに
「定数しか内包していないモジュール」や
「ユーザー定義型」や
「Enum(列挙)」のアイコンもあるのですが
それらも「クラス=オブジェクト」ですか?
また、「構造体」も「クラス=オブジェクト」ですか?
例えばですが、オブジェクトブラウザの画面の「クラス」の列の
A:「定数しか内包していない ”モジュール”」
B:「ユーザー定義型」
C:「Enum(列挙)」
D:「構造体」
は、
以下の①~③のどれになるのでしょう?
①「クラス」というだけのことで(=クラスとして定義はされているけれど)、
「振る舞い=メソッド」を持たないので、
「クラスではあるけれどオブジェクトとまでは言えない」。
②メソッドを待たなくても、「クラス=オブジェクト」と捉えてOK。
プロパティや定数(つまり「データ」 )の内包「のみ」であっても
「クラス=オブジェクト」と捉えてOK。
③その他
【質問09】
ではせっかくなので「Set が必要な値/不要な値の違い」を教えてください。
【質問10】
「どうして“オブジェクトは参照”なのか」も教えてください。
【質問11】
「Set を使うことで何が保証されているのか」も教えてください。
【質問12】
「値型と参照型の違い」も教えてください。
【質問13】
「Variantでの型チェック」とはどんなことですか?
【質問14】
さらについでですが、例えばオブジェクト変数にオブジェクトを格納するということは、
オブジェクトへの参照(メモリアドレス=文字列=ある意味プリミティブな値)が格納される、
ということですから、その意味からでも、
「オブジェクト型のデータ」=「結局はある意味プリミティブな値と同じようなモノ」、
と言えそうでしょうか?
【質問15】
さらについでにですが、
「オブジェクト変数にオブジェクトを代入する」ということは、
『オブジェクト変数の中に、オブジェクトを指し示す「言わばショートカットアイコン」が代入された・・・』、
という理解でも良いですか?
そしてその「ショートカットアイコンの実態」は、「C言語のポインタのようなもの」という理解です。
【質問16】
さらについでのついでですが、VBAに限って言うと、
VBAの自作関数(Functionプロシージャ)は、値を返す場合、
プログラムの最後に関数名に値を代入します。
そのような仕様になっていますが、それは結局、
「関数名」が「変数のような機能も持ち合わせている」と考えても良いですか?
そう考えると、クラスモジュールでのPropertyプロシージャで、
ゲッターとセッターというか、
PropertyプロシージャもLetやSetで値を代入したり、
Getで値を取得できたりしますが、
その動きはFunction的なんですけれども、
Propertyプロシージャの名前も、Functionプロシージャのように
「変数的な機能も、持ち合わせている」と考えると、
「クラスにおける変数=データ」のことを「プロパティと呼びます」ということが、
「たとえPropertyプロシージャがFunctionプロシージャ的な動作をしていたとしても」
「クラスに属する変数=プロパティ」と理解しやすくなるかなあと思うのですが、
どうでしょうか?
【質問17】
では、Propertyプロシージャに対する私の理解は、
『 「プロパティ=クラスの内包する変数(=データ)」という原則 』?から
ハズレてはいない、と理解して良いですか?
【質問18】
以上のことはすべて、誰も教えてくれないので、
VBAのヘルプとオブジェクトブラウザやウォッチウィンドウ、
オブジェクトモデル一覧図、を何度も読んでが7割と、
残りの3割は、
クラス作成のWebサンプルが2か所くらい、
あと、1冊のプログラミング初心者本の
「マンガと図解でスッキリわかる プログラミングのしくみ」
(https://amzn.asia/d/a7qFZMJ)
を読んで、自分なりに理解しました。
僕のようなVBA初心者(クラスモジュールもほんの少ししか作れない奴)でも
そこまで理解できるのに、
なぜVBA講師どもが何の説明もしないのか全く理解できません。
そのことについてはどういう評価を受けそうですか?
※↑この質問、実際にはもう一冊の本もきっかけになりました。
「いちばんやさしいExcelVBAの教本 人気講師が教える実務に役立つマクロの始め方」
https://amzn.asia/d/4eBCz8J
その際、「間違い記述」のWebサイトや書籍もちょいちょい発見しました。
※なお、この質問ではChatGPTに諭されたので、今後はそうしようかと思います。
======================================
● ChatGPTに聞く前の僕の考え方。(URL先の冒頭からに書いたことです)
======================================
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に聞きました。
===================================
今回は以上です。
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
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
----------------------------------------------------------------------