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

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

まぐまぐのページは以下です。
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

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

またサボりにサボっててすみませんが、宜しくお願い致します。
  

「文字列型のセルデータに余計な改行が入っていると、
 VBAでの転記(=代入)処理などで、転記先セルの行高が異常に広がってしまう。」、
というバグの続きをやらないといけなかったのですが、
「ステートメント」という用語について、よく間違いが説明されていますので、
ちょっとそのことと、ChatGPTに聞いてみて欲しいことを、数回に分けてお伝えしようかと思います。
  

今回、そこそこ重要なテーマだと思います。
よろしくお願い致します。

早速ですが、僕自身が考えている「VBAの重要ポイント」について、
ChatGPTやらジェミニやらに聞いてみたら、自分の考えも悪く無さそうだったので、
「一度、AIに聞いてみてください」という「質問事項」を今回から数回で列挙していきます。

1つ1つ最後までAIに聞くと、色んなことが分かると思います。

質問自体も、「VBAがある地点から爆発的に上達するための」「VBAの重要ポイント」に
なっていると思います。

それを質問すると、AI(特にChatGPT)がイチャモンつけてきて、色々説明してくれます。

「この質問内容、ほんとかよ?」という感じで聞いてみてください。

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

  
ただ、最後の質問までを聞くと、途中でそのイチャモンが少しおとなしくなります。

  
  

質問の前半はAIが「あんたはここが甘い」「間違ってる」とイチャモンつけてきますが、
このメルマガでも何度か書いた、「命令の5つのパターン」について聞き始めたあたりから、
AIのイチャモンが減ります。(無くなりはしませんが。特にChatGPT。)

なお、「命令の5つのパターン」については、次号以降になります。
メッチャたくさんの質問があるので。

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

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

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

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

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

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

  

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

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

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

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

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

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

  

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

あるExcelVBAの市販書籍に、

「ステートメントには、ここで解説している「制御を行うキーワード」という意味の他に、「プロシージャの中の一連の命令文」という意味もあります。」

と解説されていました。

これ、逆じゃないですか?

  

自分のこれまでの理解ですと、以下のようになりますがどちらが正しいですか?

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

ステートメントは文です。
命令文です。
1行で完結する文の場合もあれば数行でブロックになる文もあります。

そして、「subやif~then、FOR、dim」、などは「キーワード」です。
VBAのヘルプでも「明確に」「キーワード」に分類されています。
「ステートメント」には分類されていません。

subやif~then、FOR、dim、などのキーワードはそのステートメントを性格付けるキーワードで、VBAのヘルプではステートメント名と呼ばれることもあります。
ステートメント名、つまりステートメントの種類?性格?を表すキーワードは、制御を行うものもあれば、コマンドプロンプトのコマンドのようなもの、あるいは引数を必要とする関数やメソッドに似たもの、など色々とあり、必ずしも制御を行うモノだけを指していません。

他の言語でも基本的にはキーワードのことをステートメントとは呼ばず、文という意味しかない、ということがほぼすべてです。

それに「キーワード≒予約語」だと」思っていました。
なのでそもそもステートメントではない。

更に言えば、ファイル操作のcloseやfilecopyを使った文もステートメントですよね?
このようなコマンドプロンプトのコマンドのようなものもある。
Beepとかも同じ。
制御だけじゃない。

そして引数が必要な関数のようなものまである。
SendKeysとか。

結局のところ、ステートメントには、
・制御
・宣言、定義
・ファイル操作
・ハードウェア操作
など、色んなものがあります。
  

そもそも、
「ステートメントには、ここで解説している「制御を行うキーワード」という意味の他に、「プロシージャの中の一連の命令文」という意味もあります。」
って、順序が逆。

「プロシージャの中の一連の命令文」という意味、のなかに
「制御を行うキーワード」が在ります。
あるいは、
「プロシージャの中の一連の命令文」という意味、のなかに
「制御を行う命令文」が在ります。

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

  
  

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

「ステートメントには、ここで解説している「制御を行うキーワード」という意味の他に、「プロシージャの中の一連の命令文」という意味もあります。」

という説明についてですが、
ある特定サイトにも、ステートメントについて同じようなことが書かれています。

ある書籍でも、同じようなことが書かれています。

多くのVBA市販書籍やWebサイト、動画でも似たような、
『 特に「制御を行うキーワードが多い」と誤解をさせる説明 』がなされていることが決して少なくないです。
(※これは、そもそもステートメントはキーワードではないし、また、ステートメントは制御用だけではないので、2重の間違いになってしまっています。)

「VBAの歴史的に、文という意味と、命令単語に意味と、文脈で使い分けられる」的な説明もあります。

が、
しかしながら、
もしVBAを入り口にして他言語にもある程度容易に移行できるように
学習したい場合は、このような説明内容は「ダメ」だと思います。

もちろん、「VBAの歴史の事実としては理解しても」、
でも、今となっては、結局はそう考えないほうがよいと思います。

「のちのち”根本的な”ミスを生む温床・諸悪の根源になり得る」ので。

例えば
『DimもLetもSetもPrivateも全部「制御」と誤解させられてしまう』とか。

また、
「市販書籍やサイトや動画の下手な説明よりも確実で正しい、
 ”ヘルプやウォッチウィンドウ”の説明を読めなくさせられる」、
「自力でデバッグできなくさせられる」、
です。
(結果、ChatGPTでコード作成しても間違いの修正ができないし
 Q&Aサイトで質問しても回答の意味が理解できません)

つまり、「ある地点からの爆発的な成長」ができなくなります。

  
  

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

  

VBAに限らず、多くの人がプログラミングの学習に挫折する理由はかんたんで、
「挫折する人の全員が全員100%」
「 ”自分で、自力で、デバッグができないから。”」(※デバッグしたことが無いひとも含む)
です。

そして、更にその一因は、確実に、
「ステートメント、式、予約語、キーワード、記号、などの区別が明確になっていないから」です。

  
つまり、例えば、

「ステートメントには、ここで解説している「制御を行うキーワード」という意味の他に、「プロシージャの中の一連の命令文」という意味もあります。」
とか、

VBAの歴史的に2つの意味がある。 (文または命令単語の2つ)
とか、

ステートメントは、オブジェクト操作以外の命令が多いです。

といったような教え方は、

百歩譲って、いくら(歴史的に)「VBAのドキュメントでは、ステートメントという用語が二つの意味で使われています。」だったとしても、
現代では
「ステートメント、式、予約語、キーワード、記号、などの区別ができなくて、
自力でデバッグできなくする」という温床なので、 やらないほうがいい教え方です。

「やってはいけない」と言ってもいいかもしれません。

学習者を独り立ちできなくする小さからぬ一因となってしまうので。

つまり、「有害」「害悪」になりえます。

(生徒側からの目線で)もっと言うと、「成長できないように教えている」、と言われても反論できない「かも?」しれません。

  
  

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

なお、「ステートメント」の「種類」の説明は、ヘルプにはこうあります。

宣言ステートメント
代入ステートメント
実行可能ステートメント
  

枝分かれさせるなら、ここを起点にするほうがいいですよね。

  
  

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

以下の説明はどうですか?

「ステートメント」は「文」であり、キーワードではありません。
Dim、Sub、If、For、などの単語はステートメントではなく「キーワード(予約語)」に分類されます。
基本的には、各ステートメントの先頭にあるそれらのキーワードが、各ステートメントの種類・性格、を決めることになります。
そしてその「キーワード」を用いて、便宜上、「〇〇ステートメント」と呼び、ステートメントの種類・性格を表現します。

「Dimキーワードを使用したステーメント」
「For…Nextキーワードを使用したステートメント」
などという見出しを書くと長くなってしまうので。
記事にするときも冗長になって読みにくくなります。

でも、「〇〇ステートメント」の意味は、そういうことです。
「〇〇キーワードを使ったステートメント」という意味です。

ステートメントはヘルプでは以下の3つに大別されています。
(01)宣言ステートメント
(02)代入ステートメント
(03)実行可能なステートメント

そして、(03)実行可能なステートメントは、さらに、色々な種類があります。
(ヘルプには明示的に書かれてはいませんが。)

ステートメント、キーワード、実は細かいステートメントの種類、については、
最初から詳しく知っておくと、
VBAの腕が「ある地点から爆発的に上達する」、その源泉になります。
また、市販書籍やサイト、動画のウソを見抜く力も養えます。
  

なお、ステートメントは、1行で完結する場合と、複数行のブロックになる場合があります。
そして、複数行のブロックになる場合は、さらにそのなかに、
1行で完結する場合と、複数行のブロック、を入れ子状態に含めていく(=ネストする)ことができます。
  

※記号の「 : 」を使うと、2行のステートメントを1行で書くこともできます。
※記号の「 _ 」を使うと、半角スペースと併せることで、長い1行のコードを複数行で表現することもできます。

※キーワードを先頭に書かないこともあります。
 例えば「Let」とか。
 しかし、キーワードを先頭に書かないケースは、
 「VBAの記述ルールで省略が認められているから」です。
 でも初心者のうちから「省略」ばかりやっていると、
 VBA的に「バカ」にさせられてしまいます。
 「省略」は、
 「VBA自体の構造の学習=1年後くらいの爆発的な上達そのもの」を
 完全い破壊する、「諸悪の根源」です。
 ご注意ください。

  

以降、上記3つの大別ステートメントの、少し詳しい分類です。
(3つめは自分が勝手に分類したものです。正式なものは多分無いと思いますが、
 学習するうちにご自分でも分類してみてください。)

  

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

  

3つのステートメントの大別順に少しずつ行きます。 まず最初の2つ。
ただし、詳しい説明ではなく、初心者向けのアウトライン的な説明です。

====
(01)宣言ステートメント

変数、定数、手続き(プロシージャ)の名前と型を定義する、などをします。
Dim、Const、Static、Public、 Sub、 Function、 Type、Enum、Property(Get・Let・Set)、
などを使ったステートメント。

  

(02)代入ステートメント
変数または定数に値や式を代入します。
let、 Set、を使ったステートメント。ここだけはこの2つのみです。

let→「プリミティブな型の値に評価されたもの」の代入時。
     (まず省略されるが実はしないほうが腕が上がる。)
Set→「オブジェクト型の値に評価されたもの」の代入時。

  
プリミティブな型とは?
=数値型、文字列型、日付型、論理型(論理値2値(True/Falseのこと)
=Integer、Long、Double、String、Date、Boolean、など。
(※「プリミティブな型の値」という表現≒「リテラル値」が代表例)

 大雑把に言えば、「2D]な「文字系」のデータの型のことです。

  
オブジェクト型とは?
=自作のクラス名と同義、および、組み込みのクラス(=Workbook、Workbooks、Worksheets、Worksheet、Range、Font、など)のこと。
(※オブジェクト型の場合、「リテラル値」は存在しませんが、
  同義の存在としては、「オブジェクト式(後述)」があります。)

 大雑把に言えば、「3D」な「装置、ユニット、に見立てた」のデータの型のことです。

  
====

※補足
両方の型とも、そのような値に評価された「式」も同等の扱いになります。
たとえば、
Letなら、関数などの戻り値がプリミティブな型だった場合、も使いますし、
Setなら、オブジェクト式や関数などの戻り値がオブジェクト型だった場合、も使います。
  

LETを先頭に書くから「=」が「代入」と分かります。
(SETは絶対に代入とわかります)
先頭に何もキーワードがないステートメントの「=」が代入か比較かのどちらなのかは、
以下のような感じでわかります。
以下の場合は代入です。
・LETが先頭にある。
・LETが先頭に無い場合、先頭に書き足してもエラーにならない。
(プロパティへの値の代入の際も同じ)
・For ステートメントの先頭行の「=」の場合。

まだあるかもしれませんが、これら以外なら「比較」です。

「式」の意味を分かっている人なら、以下の説明のほうがすっきりする
かもしれません。「Let」が省略されていても、なんとなくでも理解できると
思います。あいまいかもしれませんが。
特に前者からスタートするといいです。

「式」の中の「=」→ 比較
「式の中じゃない」とか、文として書かれている「=」→ 代入

  

※更に補足。オブジェクト式とは?(超簡易説明。見てくれ説明のみ。)
 オブジェクト式とは、
 以降にいくつか挙げたような、
 『「1個のオブジェクト」として評価される(≒値を返す)、
  オブジェクトの階層構造を「ドット」でつないだ式』
 のことです。
 (or「1個のオブジェクトへアクセスするための式」、という見方もできるかも…
   「ドット」は、Windowsのフォルダパスを「\」で区切るのと似ています。
   また、コマンドプロンプトの命令(exeやcom)が、フォルダの階層を経て、
   それらの「exeやcom」のファイルをフルパスで指定しないと、本来は動かない、
   実行できない、というのとも似ています。
   よく言われる「オブジェクトを取得する」、とは、イコール、
   「操作対象のオブジェクトを」「1個」「選択する」というイメージでもいいです。
   オブジェクトの階層構造(ツリー構造)は、最初からマイクロソフトが
   決めてしまっているので、ユーザーは、
   その1個のオブジェクトを文字で表現するのに、
   「\」ではなくて「.(ドット)」を使う…、
   みたいな感じです。
   『階層ごとに、ドットごとに、”部分オブジェクト”を経て、
    1個のオブジェクトを表現している』…
   みたいなイメージでもいいかもです。)

 (「Activesheet」のように、
   階層辿りをせずにショートカットアクセスを許す
  「1単語」のものもあります。
  「Worksheets」のような「コレクションオブジェクト」は
  基本、1語で表せます。「CreateObject」関数を使うモノもあります。)
  
  以下、オブジェクト式の実例です。
  Activesheet
  Worksheets.Item("Sheet1")
  Worksheets
  Activesheet.Range("A1")
  Worksheets.Item("Sheet1").Cells(1, 1)
  Charts.Item("グラフシート01")
  Activesheet.Range("A1").Font

  Worksheets.Add
  CreateObject("MSXML2.XMLHTTP")
  CreateObject("Scripting.FileSystemObject")

   ※上記のうち、Worksheets.AddやCreateObject(...)は
    既存のオブジェクトを参照するのではなく、
    新しいオブジェクトを生成して返す式です。
    いずれもオブジェクトに評価される点は同じです。

====

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

  
  

長いので3つか4つに分けます。

(03)実行可能なステートメント
処理を起動します。このステートメントは、メソッドまたは関数を実行し、
コードのブロック間をループしたり分岐することができます。
実行可能なステートメントには、通常算術演算子や条件演算子が含まれます。

(a)プログラム呼び出し
 Callを使ったステートメント。
 SubとFunctionプロシージャだけの呼び出しのみに使われます。
 Propertyプロシージャの呼び出しはできません。
 
 メソッドの実行時にも使えます。その先頭に記述してもエラーにならないです。
 メソッドは特定のオブジェクトに紐ついた「Sub」か「Funcition」のプロシージャだから。
 (ただし、Callを使うとメソッドでも自作関数でもカッコの記述方法が変わってしまいますが。)
 自分でクラス(クラスモジュール)を作ると分かるようになります。
 組込のクラス(≒組み込みのオブジェクト)でも同じです。
 自作関数(ユーザー定義関数)とメソッドは似ています。ほぼ同じと言っても過言ではないかもしれません。
 なので逆に言うと、Callは「いつも省略されている」ということなのかもしれません。
 (※Callは自作のプロシージャを呼び出す時だけに使うほうがプログラムが読みやすくなります。
   が、はじめのうちは、全部にあえて書いてみると、「VBAの仕様」が明確になります。)
 (※「似ている」というくくりで言うと、Propertyプロシージャ(Get、Set、Let)も
   自作関数と似ていて、ほぼ同じ、と思っていいかもしれません。)

(b)制御フロー(分岐、繰り返し、など)
 If…Then…Else、For(Each)…Next、Do…Loop、Select…Case、などを使ったステートメント。

(c)停止、一時停止
 End、Exit、Stop、などを使ったステートメント。

  
  

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

  

(d)フォルダやファイルの操作(コマンドプロンプトのコマンド的、関数的、メソッド的、なもの)
 ChDirを使ったステートメント。 フォルダの変更
 ChDriveを使ったステートメント。 ドライブの変更
 FileCopyを使ったステートメント。 ファイルのコピー
 MkDirを使ったステートメント。 フォルダの作成
 RmDirを使ったステートメント。 フォルダの削除
 Nameを使ったステートメント。 ファイルまたはフォルダの名前の変更
 SetAttrを使ったステートメント。 ファイルの属性情報の設定

(e)テキストファイルの読み書き・その他(コマンドプロンプトのコマンド的、関数的、メソッド的、なもの)
 Openを使ったステートメント。 ファイルの操作または作成
 Close、Resetを使ったステートメント。 ファイルを閉じる
 Kill、 Lock, Unlockを使ったステートメント。 ファイルの操作
 Get、Input #、Line Input #を使ったステートメント。 ファイルからの読み込み
 Print #, Width #を使ったステートメント。 出力形式の制御

  
(f)エラー処理
 On Error、Error、Resume、などを使ったステートメント。

  
(g)その他(コマンドプロンプトのコマンド的、関数的、メソッド的、なもの)
 AppActivate、を使ったステートメント。 他のプログラムの実行
 SendKeysを使ったステートメント。 キー コードの転送
 Beepを使ったステートメント。 ビープ音を鳴らす

  
  

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

最後です。

ちなみにヘルプでは以下のような分類がされているページがあります。
ここでは「制御構造に関するキーワード一覧」だけご紹介します。
(2007か2010のヘルプで「キーワード」で検索するともっと沢山出てきます。)

キーワード全体の分類であって、ステートメントのみの分類ではないのですが、
こういう分類も大変参考になると思います。
  

●制御構造に関するキーワード一覧

機能 キーワード
分岐 GoSub...Return, GoTo, , On...GoSub, On...GoTo
プログラムの終了または一時停止 DoEvents, End, Exit, Stop
ループ Do...Loop, For...Next, For Each...Next, While...Wend
意志決定 Choose, If...Then...Else, Select Case, Switch
プロシージャの使用 Call, Function, Property Get, Property Let, Property Set, Sub
  

こういう分類方法に触れると、
「〇〇の処理をするには、プロパティやメソッド」、という説明は間違いで、
「〇〇の処理をするには、プロパティやメソッドも使えば、関数も演算子もステートメントも使う」という意識に変わります。

  

同時に、
プリミティブな型のデータを処理(操作)するには、
・VBA関数(ワークシート系含む)やプロパティや、演算子、自作関数、などを使うことが多く、
オブジェクト型のデータを処理(操作)するには、
・プロパティやメソッドや、演算子、自作関数、などを使うことが多い、
なんてことにも気付けると思います。

VBAの文法?分類?は小さなカテゴリチックではなくて、縦横断的な分類で俯瞰して見たほうがいいので。

結果、もっとも大きなメリットとしては、
「VBAレジェンドやチルドレンたちの手抜きやウソ」も、「かなり見抜ける」ようになります。

  

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

  

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

  

今回は以上です。
     

  
  
  
  

今回は以上です。
  

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

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

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
----------------------------------------------------------------------