★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol.0058 :【番外】VBAでは間違って教えられることが多い「ステートメント」の意味やVBAの重要ポイントについて-03
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0058
タイトル:【番外】VBAでは間違って教えられることが多い、
「ステートメント」の意味やVBAの重要ポイントについて-03
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
こんにちは。
前回、以下のところが、「表のように」見えてなかったので一応修正です。
いったんためしに、
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)
今回は、前回、前々回、よりの、「VBAのポイントのまとめ」です。
引き続き、重要なテーマだと思いますので、よろしくお願い致します。
是非、今回挙げていく内容も、AIに聞いてみてください。
ChatGPT、ジェミニ、クロード、NotebookLM、あたりに同じ質問を聞いて、
回答をくらべてみてください。
結構面白かったです。
一番、イチャモンを付けて重箱の隅をつついてくるのはChatGPTです。
ジェミニなると、かなりヨイショしてきて回答がテキトーというか、
短くまとめてきます。、
クロードはさらにヨイショしてくる感じです。
また、ジェミニ同様、短くまとめてきます。
NotebookLMもそんな感じです。
なので、ChatGPTには絶対に質問してみてください。
いろいろとイチャモンつけてくれて、でも、色々ヒントが多いです。
でも、もちろん、ジェミニもクロードも質問してみてください。
ChatGPTとは違う角度でも回答してくれるので、短くまとめるけど、
ヒントももちろんくれます。
※逆に言うと、ジェミニ、クロード、などは忖度やヨイショが大きいので
少し信用ならない面もある?のかも?しれません。
わかりませんけど・・・。
いずれにしても、「これ1つで全部カバーできる」というAIが無いのは事実だと
思いますので、聴き比べは必要かな、と思います。
※ご注意
「前号の56号から今号」の最初から最後の質問までしっかりとAIに聞かないなら、
あまり意味無いのでそれなら最初からAIに聞かないほうがいいかもです。
多分、間違った理解をしてしまうと思います。※
=============
VBAの「ポイント」のまとめ
●VBAの命令を分類すると、以降の5つしかありません。
『 1000個以上ある組込のVBAの全ての命令と、
すべての自作のSub、Function、Propertyプロシージャ 』
には、大別して以下の5つのパターンしかありません。
(ア)プリミティブな型の値を返す「だけ」のもの。(式の一種)
(VBA関数、プロパティ、演算子+オペランド(語弊あるかもですが)、自作関数、に多い)
(イ)何らかの動きをしつつ、同時にプリミティブな型の値を返すもの。(式の一種)
(メソッド、演算子+オペランド(語弊あるかもですが)、自作関数、に多い)
(ウ)オブジェクト型の値を返す「だけ」のもの。(式の一種)
(プロパティ、一部のメソッド、自作関数、に多い)
(エ)何らかの動きをしつつ、同時にオブジェクト型の値を返すもの。(式の一種)
(CreateObject関数、GetObject関数、各種Addメソッド、各種Openメソッド、自作関数、等々に多い)
(オ)何らかの動きをするだけで、何も返さないもの。(式じゃないモノ。)
(メソッド、自作関数、に多い)
※「値」=VBAの場合は、(a)と(b)の両方を指すことが多いです。
明確なヘルプ記述はありませんが、ヘルプ全体はそのような目線で書かれていて、
エラーメッセージその他からもわかります。
※「(式の一種)」とは、代入ステートメントの右辺にもなれるし、引数にもできる、
という意味とイコールです。
※「何らかの動き」→具体的には、プリミティブな型の値や変数の加工、演算、
検索、置換、切り出し、等々や、オブジェクト型の値の操作など、です。
オブジェクト型の値の操作とは、Excelの場合に限れば、
セル単位の検索、セル単位の抽出、セル単位の置換、ピボット操作、
その他の自動集計、条件付き書式、各種フィルタ操作、パワークエリ操作、
MicrosoftQuery操作、開く、閉じる、追加、削除、印刷、などです。
(※プログラミング的には「副作用」と呼ぶらしいです。)
※よって(邪道だとは思いますが)、関数、プロパティ、メソッド、自作関数、などの区別は、
使う場面やそれらの性格などの違いによって言い分けてるだけ・・・、と取れなくもない。
●Functionプロシージャの重要性
Functionプロシージャだけが上記の「5つのパターンすべてが作れる」です。
結局、Functionプロシージャだけが、ア~オのすべてのものが作れます。
しかも、「関数名が変数の役割も兼任しています」し。
なので、いろんなタイプのFunctionプロシージャが作れることが、
(引数ありなし、既定値ありなし、既定値オブジェクト、戻り値オブジェクト、引数ByVal・ByRefなど)
「VBAのすべて」と言っても過言ではないです。
中でも、特に、「オブジェクトを返せるFunctionプロシージャ」や
「オブジェクトを引数にできるFunctionプロシージャ」が作れるようになると、
「学習開始から1年後くらい」に、「爆発的な上達」が「やってくる」可能性が高まります。
Propertyプロシージャも作れるようになり、結果、簡単なクラスモジュールが
すぐに作れるようになるので、それが作れることが
「VBAの真のスタートライン」となります。
また、「1年後の」「爆発的な」上達の「絶対条件」です。
●メソッドについて
クラスモジュールで自作のメソッドを作ると、
「メソッドは「Sub」か「Function」のプロシージャと同義なんだ。」
「特定のオブジェクト(クラス)に紐付いているところだけが違う」
「=オブジェクトを先に選択(取得)しないと使えない、というだけ。」
ということが理解できるようになります。
●「式」の説明。
VBA限定の「式」とは、
数値、文字列、オブジェクトのいずれかに評価できる、生の値、変数、定数、関数、
プロパティ、値を返す一部の少な目のメソッド、演算子(オペランド含む)、などの組み合わせ。
ヘルプにはそんな感じで書いてあります。
(調べたら以下の通り→式とは「文字列、数値、オブジェクトのいずれかに評価される、
キーワード、演算子、変数、定数の組み合わせ。計算、文字列の処理、
データのテストなどを行うときに式が使われます。」)
単語1語でも、複数の単語の組み合わせでも、それ全体が評価された時に型が決まり、値も決まるもの。
プリミティブな型に評価されれば単一の値が決まり、オブジェクト型に評価されれば、
決めうちできるプロパティ値のみが確定します。
よくわからないうちは、F8キーのステップ実行時に、ウォッチウィンドウで型と値が一瞬でも確定するもの、
と理解していつも観察しまくればいいです。
※C言語では単なる代入は『式』だそうです(最後にセミコロンが付かない状態)。
例えば「a=10」みたいなもの。(最後に「;」が付くとステートメントになるそうです)
JavaScriptでも似てるみたいです。
Pythonでも代入の「=」を「:=」と書くと式になるようです。
VBAだと「a=10」は「ステートメント」です。(Letを省略した代入ステートメント)
しかしながら『式』の『定義自体』は、
C言語でもVBAやPythonでもJavaScriptでも共通であり、
『評価されたときに何らかの型と値を持つものが式』
という考え方に相違はないそうです。
●VBAの命令単語のカッコや名前付き引数の使い方
※「式として使うかどうかでカッコが決まる」、
「カッコは”式にするための装置”」、
みたいに考えると整理しやすい方はそれで。
※「============」に挟まれた部分が
基本ルール・・・、みたいに覚えてみてください。
============
・SubとFunctionとPropertyプロシージャ(≒自作関数)、
・メソッド(自作と組み込みの両方)
・組み込みのVBA関数のすべて、
全部、
・「カッコを付けるルール」と
・「名前付き引数の書きかたのルール」は、
・「原則」、「全部同じ」、と
理解してOKです。
それに加えて、プロパティ(自作と組み込みの両方)の場合も、そうだとイメージしてOKです。
(あくまでもイメージです。しかも無理矢理ですが・・・。)
(ルール01)
Callを使わない→→カッコを使う場合→「戻り値を使う=代入時の右辺や引数として使う」という場合。
(代入時の右辺として、引数として、単純に戻り値として、
等々で使う時は、自動的にこの書き方になると思います。)
→→カッコを使わない場合→戻り値を使わない。逆に、戻り値が不要なときに使う。
(※メソッドの実行時で使う時は、自動的にこの書き方が多くなると思います。)
(ルール02)
Callを使う→→(ルール01)は無視される。戻り値が使えなくなる。逆に、戻り値が不要なときに使う。
原則、カッコが必須。戻り値が在ろうが無かろうが。
※注意点:引数が1つのときの「罠」
Callを使わず、戻り値も受け取らないのに、引数に無理やりカッコを付けて1つだけ渡すと、
VBAはそれを「カッコのルール」ではなく「値渡しにするための算術演算のカッコ」と解釈してしまいます。
MySub (a) ・・・ a をコピーして渡す(値渡し)という意味になる
MySub a, b ・・・ 正解
MySub (a, b) ・・・ エラー(カンマがあるのにカッコで囲むと、式として成立しないため)
※本質的・厳密的、には違いますが、
「プロパティを使う場合は必ず戻り値を使うので、カッコを必ず使う…」みたいなイメージで、
そう無理矢理理解してしまってもいいかも?です。学習の初期段階だけは。
(覚え方としてそう覚えてしまうと統一感があってラクかも?ということです。)
※個人的には、
『 自作関数(自作のSub、Function)を呼び出す時で、かつ、戻り値不要時 』、
「だけ」に使うと、
「あ、これは自分で作ったんだ」と見やすくなるので、そこだけにCallを使うほうが
いいかなと思います。
代入ステートメントの右辺に使う時はそれができないので微妙ですが、でもそれでも。
※メソッドを使う場合は、メソッド自体が特定のオブジェクトでしか使えないSubかFunctionなので
「Call」を先頭に書いてもエラーになりませんが、その場合、カッコが必須となります。
上記の(ルール01)、(ルール02)、いずれも適用されます。
============
以下、補足です。
※一応、
・Callの記述ルールは、SubとFunction、
および両方のメソッドにのみ存在します。
が、最初のうちはプロパティでも同じ、とイメージしてしまってもいいと思います。
そのほうが、カッコの記述ルールに統一感が出るので。
Propertyプロシージャでを自作のプロパティを作ると、
その意味がより理解できると思います。
・プロパティ値の書き変えについては、
代入ステートメントの形で書くのが普通なので、
プロパティがPropertyプロシージャを使うセッターだったとしても、
名前付き引数については、使う場面は、基本、ありません。
(例外があるかも?ですが。未調査)
話が逸れますが、プロパティ値の書き変えについては、
プリミティブな値の書き変えなら、先頭に「Let」が省略されていますので、
「Let」をあえて付けてもエラーになりません。
「aaa=Activesheet.Range("A1")」を
「Let aaa=Activesheet.Range("A1")」と書いても
エラーにならない、という意味です。
※あと、BeepやFilecopy、 などの「コマンドっぽい性格」の
「ステートメント用のキーワード」は、Callやカッコのルールは適用されません。
「コマンドっぽい」ので、「なんで?」と思うかもしれませんが、
ステートメント用のキーワードにはCallやカッコのルールは適用されません。
メソッドでもないので、オブジェクトブラウザにも出てきません。
ただ、名前付き引数は一部使えるものがあります。
例えば「Sendkeys」とか。
「SendKeys String:="^s", Wait:=True」
のように名前付き引数を使えます。
でも、関数やメソッドではなく、「ステートメント用のキーワード」です。
(※もしかしたら、カッコが使えるモノはあるのかも?調べてません。すみません。)
===================================
今回は以上です。
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
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
----------------------------------------------------------------------