★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol.0001:プログラミングとは?「変数」について。「変数」を大別すると?~

ExcelVBAを独学し始めたとき、多くの方が「初心者本」を終えたあと、結局、行き詰って挫折することが多いです。
そうなってしまう理由はただ一つです。
「値を返すモノはもちろん、特に、オブジェクトを返す自作関数」が思いどおりに作れないから・・・、です。

逆に言うと、それがクリアできれば、「半年~1年後に・爆発的に・上達する」、その最低条件を手に入れることができます。

つまり「値を返すモノはもちろん、特に、オブジェクトを返す自作関数が思いどおりに作れること」は、Excelに限らず、VBAの「真のスタートライン」なのです。

ここを説明しないVBA教則本が多すぎます。

最初から教える気なんて「さらさらない」からです。

巷の初心者本では、「値を返すモノはもちろん、特に、オブジェクトを返す自作関数」のことをまったくと言っていいほど「やらない」ので、「そりゃ当然・挫折するわ。スタートラインにすら立っとらんのだから」ということになります。

お金を払って習っていても、そんな状況だと「確実に」「挫折」します。
エラーの自力の解決も、死んでも、できません。

「巷の初心者本で学習したところで」、そういう理由で、「そのあと」を「どう学んでいいかさっぱりわからず」、場合によっては「次の本は急激に難易度が上がって難しい内容になり」、「そのせいで、ほぼ100%」、挫折します。

本メルマガはそうならないように・・・、(ただ、まずは細かいところまではやりませんが)「このことを深めないと絶対に上達しません」ということだけ、アウトラインだけ、お話していきたいと思います。
  
    
  

<サンプル号内容>

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)

Vol.0001 サンプル号

タイトル:プログラミングとは?、「変数」について。「変数」を大別すると?、「生データ」とは?

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

本メルマガは、以下の(01)~(17)のことについてお話します。

対象読者に制限はもちろんありませんが、特に・・・

・ExcelVBAの初心者本を1、2冊、やってみた方
・「この本の内容はわかったけど何をどう使っていいかわからない」、という方、
・「オブジェクト、プロパティ、メソッドがイマイチ分からない」、という方、
・「エラーが自力で解決できない」、という方、
・「ヘルプとオブジェクトブラウザが読めない」、という方、

などなど・・・

そのような方のお役に立ちやすいのではないか???と推測しています。

真面目に以下の(01)~(17)のことの掘り下げに取り組めば、1年後には、爆発的に、上達する、可能性が高まると思います。

少なくとも、Webのサンプルや売られているすべてのVBA本は、7~8割は意味が分かるようになれると思います。
もちろん、Q&Aサイトでの回答もわかると思います。
  
  
★ (01) プログラミングとは?
★ (02)「変数」について。「変数」を大別すると?
★ (03)「生データ」とは?
★ (04)「変数」~ 「生データ」を操作する道具たち(=道具=命令・機能)
★ (05) ExcelVBAを学ぶ上で、上達する・しない・のターニングポイント。
      (=ある意味もっとも重要な基礎。)
★ (06) 挫折しないための「オブジェクト」とは?
★ (07)「オブジェクト」を「スチームオーブンレンジ」や「ATM」やに例えると?
★ (08)「オブジェクトを取得する方法」とは?
★ (09) 挫折しないための「コレクション」とは?
★ (10) 挫折しないための「プロパティ」とは?
★ (11) 挫折しないための「メソッド」とは?
★ (12)「オブジェクトブラウザ」の使用目的・使用意義
★ (13)「Variant型」の変数の使いどころ
★ (14) 質の悪いVBA講師を30秒で見抜く方法(もちろん生徒さんでもできます。)
★ (15) おススメするVBA関連の書籍
★ (16) ExcelVBAの参考サイト
★ (17) VBAに挫折してしまう、その「本当の理由」。
     今のVBAの教育界の、「本当に残念ながら」の、
      「かなり」「ひどい」「状況」について
  
  
私は、Accessはある程度わかるのですがExcelはさっぱりです。

今でも、ワークシート関数はほとんど使えません。

Accessは一応、2000しか扱えませんが、30台弱の「クライアントサーバもどき」のシステムを制作し、20年ほど稼働させて運用しています。

でも、システムの前任者が、Excelでもその一部を作っていて、(バージョンが古いため)最近その機能追加・改修の要望が多く、それに伴うエラー処理も増えてきました。

なので、ExcelVBAを独学することにしました。
  
  
でも、巷の初心者本、あるいはWebページを読むと、「けっこういいかげんなこと(ウソに近いことまで)」書いてあって、私自身、「ドツボ」に「ハマる」経験を何度かされられました。

腹も立ちますが、無知な自分が悪いだけです。

なので、これからExcelVBA、AccesVBAを学ぶ方々が、そのような「ドツボ」にはまらないように・・・という願いを込めまして、このメルマガを書きました。

短いですが、よろしくお願いいたします。
  
  

※本メルマガの内容は、「あくまでも」「ヒントやメモ」「ある意味随筆」です。
学術書でもなんでもありません。
「アマチュア目線のひとつの考え方・学び方」を示しているにすぎません。
書いているのはほぼ初心者の私ですので、「間違っている」風に目に映ることもあるかもしれません。
でもそれは「あえて」そう書いているので、また、くりかえしますが、学術書でもなんでもありませんので、その点はあらかじめご了承くださいませ。

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

  
  

★ (01)プログラミングとは?

当方はプログラミングについては(乱暴ですみませんが)、以下のように考えています。

『 プログラミングとは、どんなプログラミング言語であっても、
 「変数」というものを動かして(操作して)、「自動化」を実現する作業のこと。
  乱暴に言ってしまうと、プログラミングというものにおける操作の対象は「変数」。』

当然、この定義からハズレる言語もあるかとは思いますが、でも、現実にはこういう言語が多いのも事実だと思います。

特にVBAはこういう言語にあてはまると考えても差し支えないので、勝手にそう解釈してしまっています。

ExcelでもAccesでもWordでも同じです。

もちろん、「本当の操作の対象」は、「変数」ではなくて、その中に代入する「生データ」が、「真の」「操作の対象」だとも思っています。

でも、そこまで言ってしまうと、『 逆に、細かくなりすぎて、VBAの全体像を捉えにくい 』です。(特に初心者の方はそうです。)
なので、あえて、「変数どまり」にさせて、解釈しています。
  
  

参考の関連図表

https://euc-access-excel-db.com/00000WPPDF/vba-study-a-zu.pdf
(2種類の変数とそれを動かす道具の関係などについてまとめた図です。)

https://euc-access-excel-db.com/00000WPPDF/tool_for_hennsuu01.html
Vol:0002に関係する図ですが、いちおう、参考のため、ここにも示しました。変数を動かすための道具(=各種命令)の若干の詳細と、使用場面などとの関係を一覧にしてみました。

https://euc-access-excel-db.com/00000WPPDF/vbe_n_mod_n_proc01.pdf
プロシージャやモジュールと、VBE(VisualBasicEditor)の関係についてまとめた図です。
Ctrlキーを押しながら、マウスのホイールで拡大して見てみてください。
  
  
↑以上のうち、PDFは、もしエラーで見れなかったら、例えばIE11の場合なら、エラーを消してすぐに、「”戻る”をすることなく」、「F5」キーを押して再表示してみてください。

  
  
##############################
##############################
  
  

★ (02)「変数」について。「変数」を大別すると?

参考表
https://euc-access-excel-db.com/00000WPPDF/hennsuu01.pdf
※A4・1枚に印刷できるようにしてしまったので、文字が小さすぎるので、Ctrlキーを押しながら、マウスのホイールを回して拡大して見てみてください。
エラーで見れなかったら「F5」キーを押して再表示してみてください。

  

VBAに限って言うと、変数を大別すると、以下の(イ)と(ロ)の「2つしかありません」。
(と、当方はとりあえず理解しています。)
  

(イ)生の一般データを代入するための、「一般変数(配列も含む)」

(ロ)生のオブジェクトを代入するための、「オブジェクト変数」
  

つまり、
『 VBAでの操作の対象は、「一般変数」と「オブジェクト変数」の2つしかない、とも言える 』
と思います。
  

また、変数に代入するものは「生データ」と、いう風にも勝手に理解しています。
  

これも、ExcelでもAccessでもWordでも同じです。

※数学の「変数」の場合は、代入できるものは「数だけ」ですが、コンピュータの「変数」の場合はそうではありません。
数字以外にも、文字列(単語や文章)、日付データ、Ture/Falseの2値(論理値)、表データ丸ごと、オブジェクト(メカ・装置)、なども代入できます。
そこがちょっとややこしいかもしれませんが、ふーん・そっかー、くらいに思っておいてください。

  

※「生データ」の種類については、次項でも説明していますが、ここでも少し補足します。
大別すると、以下の2つがあります。「一般データ」と「オブジェクト」の2つです。(「変数」の場合と同じように、「生データ」もこの2つしかありません。)

一般データ=文字ベースのデータ。数値、文字列、日付データ、TureやFalseなどの論理値など。2Dデータです。

オブジェクト=原則的には「複数の細かい機能たちの集合体」のことです。
「ユニット、パーツ(部品)」とみなせることも多いです。3Dユニットというイメージです。
エクセルという工場で働く「ミニミニロボット」、というイメージでもいいと思います。
Excelの場合に限って言うと、「オブジェクト」とは、ブック、シート、セル、グラフ、ピボット、
あるいは、各種の機能のカタマリ(セルの書式操作機能全体、並べ替え機能全体、フィルタ機能全体、など)が相当します。
(この場合は、前述した「複数の細かい機能たちの集合体」と捉えている・・・ということになります。)

『 セルの書式操作機能全体、並べ替え機能全体、フィルタ機能全体、等々 』は、「ユニット・パーツ」、という捉えかたよりは、
それらの中には細かい設定項目や更なるサブ機能がたくさん詰まっているので、
そうなると、その「粒度」でオブジェクトとして扱える方が「ラク」だから、
「えーい!めんどくさい!もうこの細かい機能の集まりを "オブジェクト扱い "にしちゃえ!」ってなっちゃったのかもね?という感じです。(当方の勝手なイメージですが)

巷で良く言われる「対象」とか「操作対象」とか、「モノ」とかいうだけの覚え方で分かるならそれでもいいですし逆に、よく分からないなら、『 細かい機能たちの集合体、ユニット、パーツ(部品)」と、覚えればOKです。
「対象」とか「操作対象」とかいった、そういう覚え方だけにこだわる必要はありません。
(ちなみにですが、「対象」というだけの覚え方だとヘルプやオブジェクトブラウザとリンクさせられないため、なかなか理解が深まらないかも・・・?)

のちのちに出てくる、
「★ (06) 挫折しないための「オブジェクト」とは?」や
「★ (07)「オブジェクト」を「スチームオーブンレンジ」や「ATM」やに例えると?」、
「★ (08)「オブジェクトを取得する方法」とは?」、
「★ (09) 挫折しないための「コレクション」とは?」、
などでも少し詳しく説明しています。
  

変なたとえですみませんが「生のデータ」は、料理で例えると、『 素材(肉や魚、野菜、お米など) 』で、
「変数」は、『 その「素材」を仮置き・仮乗せしておく「小皿」「バット」「ボウル」のようなもの 』・・・です。

そして「変数」は、よく「空き箱」にも例えられます。(名前付きの「空き箱」に。)

なので「変数」は、
『 素材を仮に入れておくための「名前付きの空き箱」 』・・・というイメージでもいいかもしれません。 (※素材=プログラムの場合は「生のデータたち」)

  

※2020/06/13追記

ムリヤリ「料理にこじつけて」しまいましたが、ムリに料理にこじつける必要もありません。
  
  

人によっては、

『 変数は、名前付きの「1枚のメモ用紙」のようなもの 』

とか、あるいは、

『 変数は、名前付きの「クリップボード」のようなもの 』

と考えるほうがしっくりくる方もいらしゃるかもしれません。

そのように考えても全然オッケーです。
  
  

前者は文字どおり、メモ用紙(しかも1枚の)で、
「メモ用紙の上で仮の計算をしておく」・・・みたいなイメージです。

仮の計算だから、内容はコロコロと変わります。
逆に、「変えてもイイ」、のです。
  

後者も、まあ、言ってみれば、「デジタルな」「メモ用紙」みたいなものです。

そして、細かいことを言ってしまいますと、
「変数はメモリ上に作られる(宣言と同時に自動生成される)」ということがありますです。

つまり、変数の実際・実体・実態、は
「メモリ上に数バイト単位で確保された、名前付きのスペース・領域・空き箱・小皿」、
です。
※参考
 1バイトは8ビットです。1ビットは「ON・OFFの組み合わせが1個分」ですので、
 1バイトは、「「ON・OFFの組み合わせが8個分」ということになりますので、
 「256通りの何か」、を表現することができます。
 (http://www.pasonisan.com/pc-parts/interface-bit.html もご参考に)
 その「バイト」という単位で、変数はそのひとつひとつの容量が決まります。
 実はメモリの中身も「1バイトごと」に仕切られているので、
 その単位(1バイト単位)なら動きやすいのです。
 例えば「String型(文字列型)」の変数なら、その容量は2バイトと決まっていて
 ヘルプによると「約 63KB までの長さの固定長文字列、約 2GB (20 億文字) まで
 の可変長文字列を格納できます。」ということだそうです。
 20億文字はともかく、
 「日本語などの全角文字1文字分は、2バイトに相当」と考えますと、
 「63KB」であれば、日本語で約3万文字強(31600文字)まで格納できる、
 そういう容量の変数が用意される・生成される、ということになります。
 (文字コードによっても変わるのかもしれませんが。)
  

なので、パソコンに慣れている人にとっては、変数は・・・、

『 メモリ上に生成される、「名前付きのミニミニクリップボード」のようなもの。』
『 クリップボードみたいなものだから、中身のデータは常にコロコロと入れ替わる。』

(※クリップボードのように、画像や音声、テキストがごちゃごちゃに保管はできず、
  同じデータ型のデータの範囲内で、コロコロ入れ替わる、入れ替えることができる、
  ということなのですが。)

・・・と説明したほうがしっくりくる方も多いかもしれません。
  
  

というわけで、以上、変数に関する、補足でした。
  

これも「1例」ですのので、ご自分でも色々に例えてもらって、ご自分の好きな覚え方で、理解してみて下さい。
  

  
##############################
##############################
  
  

★ (03)「生データ」とは?

参考表
https://euc-access-excel-db.com/00000WPPDF/hennsuu01.pdf
※A41枚に印刷できるようにしてしまったので、文字が小さすぎるので、Ctrlキーを押しながら、マウスのホイールを回して拡大して見てみてください。
エラーで見れなかったら「F5」キーを押して再表示してみてください。

  
  

「生データ」とは、変数の中に「代入」する、実際のデータのことです。

「一般変数」に対して、あるいは「オブジェクト変数」に対して、「代入する」ことになるモノです。
ただ、それぞれの形態は「大きく」「異なり」ます。

料理で言うと、「肉、魚、野菜、くだもの、米、その他穀物」みたいな感じです。
(「塩・味噌・しょうゆ・各種スパイスといった調味料等々は」は、
のちに出てくる「列挙(=Enum)」や「定数」なんかがイメージが近いかもしれません。)
  

で、「生データ」も、大別すると、一般変数やオブジェクト変数の場合と同じように、「2つ」しかありません。
そして、一般変数とオブジェクト変数、それぞれに呼応します。

例えば以下の(イ)や(ロ)のような感じです。
  
  

(イ)生の一般データ(=通称:一般データ)

「一般変数」に代入する「生データ」は、文字列系(文字ベース)のデータ、と理解していいと思います。
数値、文字列、日付データ、TureやFalseなどの論理値などのことです。

 ※「リテラル」とか「リテラル値」といったプログラミング用語がありますが、近いものがあると思います。
 ※ オブジェクト変数に代入する生データには「リテラル」といったものは存在しません。
※ どちらかとういうと「2D」的なイメージです。

※当方では生一般データのことを「値」とか「一般データ」と呼んでいます。
巷でも「値」と呼ばれることがあります(少ないかもですけど)

※文字系データなので、2Dなもの、というイメ―ジでOKです。
※ただし、写真や画像は、2D的なもの、というイメ―ジではなく、
「3D的な、額縁に入った絵や写真」というかたちでとらえます。
つまり「生のオブジェクト」のほうに区分します。
  
  

(ロ)生のオブジェクト(=通称:オブジェクト)

前項「★ (02)」で、オブジェクトとは、
・原則的には「複数の細かい機能たちの集合体」のこと。「ユニット、パーツ(部品)」とみなしてもOK。
・3Dユニットというイメージ。(文字ベースの、2Dな生データたちと比較して。)
・エクセルという工場で働く「ミニミニロボット」、というイメージでもよい。
・具体的には、ブック、シート、セル、グラフ、ピボット、などなど。
・シートやセル以外にも、機能のカタマリ(セルの書式操作機能全体、並べ替え機能全体、フィルタ機能全体、など)も、そう。
と簡単に補足説明させていただきました。

そして、それらの「オブジェクト」・・・それを「 "文字化"したもの」が「オブジェクト式」です。

なので、基本、「オブジェクト変数」に代入する、「 "生データ "に相当するもの」は、「オブジェクト式だ」と理解してください。

「オブジェクト式」とは、
『 オブジェクト(絵・アイコン・メニュー)などを、
プログラムとして文字で扱えるように「文字のかたち」に変換したもの・・・ 』、
と、ざくっと理解して良いと思います。

具体的には、こんなような呪文みたいな長ったらしい式です。(例えば、Excel2010の場合)

Excel.Application.Workbooks.Item("Book1.xlsx").Worksheets.Item("Sheet1").Range("A1")

この式は、「Book1.xlsx」の「Sheet1」の「A1セル」を表している「オブジェクト式」です。これが「オブジェクト変数」に代入するモノ、です。
文字という2D的な形態ではありますが、本質は3D的な「部品・ユニット・各種機能のカタマリ・ミニミニロボット」のことをあらわしています。

※ 生のオブジェクトは、どちらかとういうと「3D」的なイメージです。
※ 巷では「オブジェクト」と呼ばれます。
当方では「生オブジェクト」とか「オブジェクト」「オブジェクト式」と呼んでいます。
※「オブジェクト式」は、「文字」ですから見た目は2Dですが、でも、
その「本質・中身」は「3D的なモノ・ユニット」、ととらえてください。

※★★ メッチャ注意事項01!!!
VBAでは、「オブジェクト式」をオブジェクト変数に代入しなくても
プログラムが書けてしまう仕様なので、それも諸悪の根源のひとつ、だと思います。
その仕様がかえってVBAをわかりにくくしています。
また、オブジェクト変数の学習をしなくなってしまい、VBAの「真のスタートライン」である、
「値やオブジェクトを返す関数の自作」をも遠ざけてしまいます。
そのため、大変残念ながら、「挫折」が、100%確実なものとなってしまいます。

※イメージとしては、
「オブジェクト」は、「実際に表示されているボタンやアイコンや絵や各種画面、
機能のカタマリ等々」とイメージし、
「オブジェクト式」は、「それらを(プログラミングに使えるように "文字化したもの "」
と思ってもらったらいいと思います。
「プログラムを書く画面の中」では「文字しか扱えない」ため、
「ボタンやアイコンや各種画面」といった「絵」を、「絵の状態のまま」動かすことは
できませんので、「絵」の状態のモノをいったん「文字」に置き換えてやる必要があります。

※ なので、
「オブジェクト」という3D的な「絵」の状態のモノを、
プログラムの中で「文字として」扱えるように文字化して変換したモノが
(=プログラムの中で・あえて文字化して「3Dユニットとみなした」モノが)
「オブジェクト式」・・・・ というイメージでいいと思います。

※ ★★ メッチャ注意事項02!!!
そして、「オブジェクト」には「階層構造」があります。
これを意識することが「メチャクチャ」重要です。
そのことから逃げて、それを省略して覚えないでいると、
エラーが出まくるようになりますのでご注意ください。
例えば、「Book1.xlsx」の「Sheet1」の「A1セル」を表す「正式な」オブジェクト式は、
以下のようになります。

Excel.Application.Workbooks.Item("Book1.xlsx").Worksheets.Item("Sheet1").Range("A1")

そして、その「セルの値」を表す式は、以下のようになります。(例えば、Excel2010の場合)
  

Excel.Application.Workbooks.Item("Book1.xlsx").Worksheets.Item("Sheet1").Range("A1").Value(xlRangeValueDefault)

例えばこれを、Rangeから書き出してしまって、

Range("A1").Value

とだけ書くことも可能ですが、これは階層構造を省略しまくってしまっていて、
エラーだらけになる「ダメな書き方」です。
ある意味「サンプル用限定」の書きかた、初心者・初学者向けに「最初のうちだけ」
仕方な く書く書き方で、「仕事」の「本番」で使うとエラーだらけになります。
「1つのブックの1枚のシートしか操作しない感じの想定」でしかまともに動きません。
そんな操作は現実には少ないです。
なぜダメなのかの補足を、のちに、「宛先に番地しか書いてない手紙」になぞらえて、
ほんの少しだけ後述しています。ご注意ください。

  
  

##############################
##############################