★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol.0003:(05) ExcelVBAを学ぶ上で、上達する・しない・のターニングポイント。(=ある意味もっとも重要な基礎。)
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0003
タイトル:(05) ExcelVBAを学ぶ上で、上達する・しない・のターニングポイント。
(=ある意味もっとも重要な基礎。)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
今回はGWのため、少し早めにお送りさせていただきました。
早速ですが、ひとつ補足させてください。
サンプル号の「変数とは?」の終わりのところで、・・・
「生のデータ」は、料理で例えると、『 素材(肉や魚、野菜、お米など) 』みたいなもので、
「変数」は、『 その「素材」を仮置き・仮乗せしておく「小皿」「バット」「ボウル」の
ようなもの 』・・・です。
とか、
『 素材を仮に入れておくための「名前付きの空き箱」 』・・・
という感じで書きましたが、もうひとつ・ふたつ、付け加えておきたいと思います。
あのときはムリヤリ「料理にこじつけて」しまいましたが、ムリに料理にこじつける必要もありません。
人によっては、
『 変数は、名前付きの「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例」ですのので、ご自分でも色々に例えてもらって、ご自分の好きな覚え方で、理解してみて下さい。
では、以降、今回分の内容です。
===================
★ (05)ExcelVBAを学ぶ上で、上達する・しない・のターニングポイント。(=ある意味もっとも重要な基礎。)
ExcelVBAを学ぶ上で、上達する・しない・のターニングポイント・・・・
「=ある意味もっとも重要な基礎」は・・・・、
以降に示した(a)~(u)までの項目のうち、
「(g) ★★★」と「(h) ★★★」の2つだけ
です。
(g) ★★★「オブジェクト」や、「オブジェクト変数」を理解できていること。
(h) ★★★「値を返す自作関数」はもちろん、「特に」、「オブジェクトを返す自作関数」をある程度自由に作れるようになること。
この2つが理解できねば、Exceに限らず、AccessもWordも、VBAは、
・「100%」、
・「間違いなく」、
・「下の上」程度の腕のまま、
・「中級」には死んでも上がれず、
・「自分の思うような組み立て」など永遠にできず、
・「挫折します」。
「自動的に」
「例外なく」
「そうなります」。
「エラーも、自力での解決は」(本当に残念ながら)、
「え」「い」「え」「ん」「に」、(永遠に)
「で」「き」「ま」「せ」「ん」。
火を見るよりも明らかです。
そして、「(g) ★★★」と「(h) ★★★」の2つを理解するために、(a)~(f)、(i)~(u)の項目の学習が必須です。
初心者本を終えてからの次なる目標は「(g) ★★★」と「(h) ★★★」の2つを理解することです。
また、これこそが、「真のスタートライン」と言えると思います。
なぜ初心者本を読んだだけでは上達しないでしょう?
組み立てられないのでしょう?
あたりまえです。
この「(g) ★★★」と「(h) ★★★」という2つのことが理解できていないため、真のスタートラインに「すら」立てていないから、です。
なので以降の(a)~(u)項目は、
・「わかるまで」、
・「何百回でも」、
・「先生にはもちろん」
・「わが子にであっても」「後輩であっても」
・「謙虚に」
・「教えてもらわねばならない」
・「こと」
です。
もし、VBAで、
「ある程度、自分で、自力で」、
「自分の思うような」、
「プログラムの組み立てをしたい」
とお考えなら、以下の、(a)~(u)はマジで、「必須」です。
お金を払って習いに行っても、以下の(a)~(u)までのことが理解できていなければ、「100%」、「上達しません」。
100%の挫折が待っているだけです。
ぜひ、学習を続けて、少しずつでもいいので、理解を深めていってください。
============
【まずは項目のみ】
(a)「オブジェクトモデル(オブジェクトの階層構造」の「一覧図」「ありき」で全部をスタートする
(b)「変数」の型、を詳しく理解する。
(c)「返す」「戻す」の言葉の意味、感覚、しくみ、を理解できていること。
(d)「演算子」にも、「返す」「戻す」という「しくみ」「感覚」が用いられている、あるいは「なじみ」がある、ということを理解すること。
(e)VBAで使う、「かなりの多くの命令(道具)・7~8割かそれ以上」にも、「返す」「戻す」という「しくみ」「感覚」が用いられていることを理解すること。
(f)データの型と型のリレーでエラーを出さないために、今使おうとしている命令が、「まずは」、値やオブジェクトを返すのか?返すならどんな型か?を必ずヘルプやオブジェクトブラウザで事前に調べること。
(g) ★★★「オブジェクト」や、「オブジェクト変数」を理解できていること。
(h) ★★★「値を返す自作関数」はもちろん、「特に」、「オブジェクトを返す自作関数」をある程度自由に作れるようになること。
(i)「オブジェクトを返す」ということが「実際に」どういうことなのかを事例で理解すること。
(「値」についても、返す、という言葉の意味を「実際に」「事例で」、より理解すること。)
(j)「プロパティもメソッドも」、「値やオブジェクトを返す自作関数」と同じような仕組みで動いていて、「名前付き引数」も使える、ということを理解する。
(k)オブジェクトの階層構造(=オブジェクトモデル)を理解して、「階層構造の、まったく省略の無いオブジェクト式が書ける」こと。
(l)「オブジェクト、プロパティ、メソッド、イベント」の位置関係・主な役割をしっかりと理解していること。
(m)「オブジェクト」には「単一オブジェクト」と「コレクションオブジェクト」の「2つしか無い」ことと、その位置関係を知ること。
(n)プロパティやメソッドは、「 "親"となるオブジェクトも付加して言い表すクセにしないとハマる」ことを知っておくこと。
(o)オブジェクトブラウザの利用意義がわかること。(別の回でも後述します。)
(p)ローカルウィンドウ、イミディエイトウィンドウ、ウォッチ式、の、、操作はもちろん、エラー対策やプログラムの考案への活用ができる。特にVariant型の変数を使っているとき。
(q)ローカルウィンドウで変数に生データが代入されることを実際に直接、目で確認する操作ができること。
(r)ウォッチウィンドウで、計算式の内容を実際に直接、目で確認する操作ができること。
(s)「変数・その他を使っての」「型と型を」「つなげる作業(リレーする作業)」ができること。
(t)Web情報ありき、よりも、ヘルプありきのWeb検索、のほうが圧倒的にミスやエラーが減り、「急がば回れの近道になる」、ということを知る。
(u)最初のうちは「With」を使わない。オブジェクト変数を使う。
=======================
【それぞれの項目の少し具体的な説明】
(a)「オブジェクトモデル(オブジェクトの階層構造」の「一覧図」「ありき」で全部をスタートする
★参考資料
◎Excel2000~2003のヘルプの階層一覧図を、一部抜粋して描き直したPDF
https://euc-access-excel-db.com/00000WPPDF/object-model01.pdf
文字が超小さいので、Ctrlキーを押しながら、マウスホイールで拡大して見てみてください。
もしエラーが出たら、エラーを消して、F5キーで再表示してみてください。
オブジェクト式は、基本、この一覧図の階層順に「上から順番に」「省略せず」書くだけです。
「オブジェクトモデル(オブジェクトの階層構造」の「一覧図」は、Excel2000~2003のヘルプに付属しています。
これが「最初に」「あると無いとでは」、ExcelVBAの理解度が、天と地ほど、変わってきてしまいます。
マイクロソフトのサイトにもありますが、コレクションの位置関係が少し微妙な形で書いてあるので、お勧めしません。(後述のWebページ)
Excel2000~2003のヘルプに付属しているものが一番です。
(ただ、オブジェクト式のドットは「オブジェクト」の切れ目、階層の切れ目は「単一オブジェクトから単一オブジェクトまで」と理解していれば、Webのマイクロソフトの図でもなんとか問題ありません。死ぬほど見づらいですが。)
オブジェクトの切れ目と階層の切れ目は「異なる」・・・
「オブジェクト式のドット=オブジェクトの切れ目」ではあるけれど
「オブジェクト式のドット=階層の切れ目」ではない、
ということを必ず覚えておく。
それを理解するには、単一オブジェクトやコレクションオブジェクトが持つ、「Item」という名前のプロパティ・あるいは・メソッド、を、「省略しない」「オブジェクト式」が書けること。です。
★参考資料
(01)Excel2000~2003のヘルプの階層一覧図を、一部抜粋して描き直したPDF
https://euc-access-excel-db.com/00000WPPDF/object-model01.pdf
文字が超小さいので、Ctrlキーを押しながら、マウスホイールで拡大して見てみてください。
もしエラーが出たら、エラーを消して、F5キーで再表示してみてください。
各階層は1行分です。
ExcelVBAでは、この一覧図の「1行分が1階層」、となります。
コレクションと単一オブジェクトが同じ階層に居ますが、そのように理解するほうが
腕が速く上がります。
ヘルプもオブジェクトブラウザもそのような形が前提で書いてありますので・・・。
なお、これを作ったときのxlsxもありますので、ご自分の備忘録として色々書き加えて使ってください。
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/object-model_n_get-object-basic01
と
https://euc-access-excel-db.com/00000WPZIP/object-model01.zip
より。
いちおう、ESETでウィルスチェックしてあります。
※「コレクションが単一オブジェクトと同じ階層に居る」という図は、ADOやDAO、のExcel2000のヘルプにも載っていますので、「コレクションが単一オブジェクトと同じ階層に居る」と理解してもOKです。
(02)コレクションの位置関係など(PDFを作ったモトとなるxlsxは上記Zipの中に含まれています。)
※A4一枚に印刷して、かろうじて読めます。
https://euc-access-excel-db.com/00000WPPDF/get-object-basic01.pdf
https://euc-access-excel-db.com/00000WPPDF/get-object-basic02-disc-cut.pdf
こちらも文字が超小さいので、Ctrlキーを押しながら、マウスホイールで拡大して見てみてください。
もしエラーが出たら、エラーを消して、F5キーで再表示してみてください。
(03)マイクロソフトのWebの階層構造図
https://docs.microsoft.com/ja-jp/previous-versions/office-development/cc326844(v=msdn.10)
※終わりの「(v=msdn.10)」もURLに含めます。
(オブジェクト式のドットはオブジェクトの切れ目、階層の切れ目は「単一オブジェクトから単一オブジェクトまで」と理解していれば、このマイクロソフトの図でもなんとか問題ありません。死ぬほど見づらいですが。)
(b)「変数」の型、を詳しく理解する。
最初のうちはVariant型でやったとしても、初心者本を終えたら、絶対に詳しく学んでください。
でないとエラーになってしまうのと、
致命的なのは、
「値やオブジェクトを返す自作関数が作れなくなる」
からです。
「値やオブジェクトを返す自作関数が作れなくなる」と、
初級の「上」にすらあがれなくなる可能性が出てきてしまいますので・・・。
「変数なんか全部Variant型でいい」、と書いてある愚かな書籍もありますが、その場合は、「他人が使うプログラム」を「絶対に書いてはいけません」。
(ビジネスパーソンの「本業との兼業プログラミング」の場合は特に。)
最悪、「補償問題」「解雇」にまで発展する可能性があります。
本当に、ご注意ください。
(c)「返す」「戻す」の言葉の意味、感覚、しくみ、を理解できていること。
文字系のデータを返す(=値を返す、と当方は勝手に言っています)、の意味。
オブジェクトを返す、の意味。
両方とも。
「文字系のデータを返す」、の場合は、
「答えをくれる」「答えを返す」「答えを戻す」と同義・・・、
と考えていいと思います。
文字ベースのデータで答えを返してくれます。
「オブジェクトを返す」、の場合は、
「オブジェクトを、機能丸ごとを、1つ、選択する」とか、
「ユニット丸ごとを、1つ、投げ返してくれる」とか、そういう感じと同義・・・、
「パーツ丸ごとを、1つ、投げ返してくれる・よこしてくれる」とか、そういう感じと同義・・・、
「ミニミニロボット丸ごとを、1つ、投げ返してくれる」とか、そういう感じと同義・・・、
と考えていいと思います。
(d)「演算子」にも、「返す」「戻す」という「しくみ」「感覚」が用いられている、あるいは「なじみ」がある、ということを理解すること。
値(計算結果)や、Ture・Falseといった論理値が返ってくることが多いです。
https://www.officepro.jp/excelvba/basic/index6.html
https://www.vba-ie.net/programing/operator.php
算術演算子(+、-、*、/、など)→計算結果が「数値型データ」として返ってきます。
比較演算子(=、<、>、<>、など)→イミディエイトウィンドウなどでチェックするときに、TureやFalseといった「論理値」というモノが返ってきます。(Boolean型データとして)
(e)VBAで使う、「かなりの多くの命令(道具)・7~8割かそれ以上」にも、「返す」「戻す」という「しくみ」「感覚」が用いられていることを理解すること。
「返す」「戻す」という「しくみ」「感覚」は、
「ステートメントやキーワード等?、各種関数、演算子、プロパティ、メソッド、列挙、組込定数、・・・」といったVBAの「命令たち」のうち、
「ステートメントやキーワード等?」「列挙(Enum)」、「以外の」かなり多く・・・、
たとえば・・・・、
・演算子(算術演算子、比較演算子など)
・VBA関数(Excel独自のもの、WordやAccess等々独自のもの、Office共通のもの、等々のうち、多分その半部以上?)
・Excelの場合、WorksheetFunctionプロパティを用いてのワークシート関数?(全部)
・プロパティ(基本、全部。WordやAccess等々も。例外が多少あるかも?調べたことありません。オブジェクトブラウザで確認できます。)
・メソッド(おそらく半分以上?こちらも、オブジェクトブラウザで確認できます。)
・イベントの引数(多分、基本、全部。例外あるかも?)
・定数(全部。数字を返します。WordやAccess等々も。「定数」自体は英語です。)
・・・などに、用いられています。
あるいは「なじみ」があります。
これはつまり、VBAにおける「命令語句」などのうち、7~9割以上、になると思います。
(調べてないので外れてるかもですが、そう遠くないと思います。)
なので、「返す」、「戻す」というしくみ、感覚、わからないと、
VBAにおける「命令語句」などのうちの、7~9割以上、のことが、「わからない」ということになってしまいます。
ホントにそんなことになってしまったら、
結果、あっというまに挫折してしまい、「中級どころか、初級の「上」に上がることすら不可能となってしまいます。
基本、100%、挫折します。
特に「オブジェクトを返す」という、しくみ、感覚、がわからないとそうなります。
ご注意ください。
(f)データの型と型のリレーでエラーを出さないために、今使おうとしている命令が、「まずは」、値やオブジェクトを返すのか?返すならどんな型か?を必ずヘルプやオブジェクトブラウザで事前に調べること。
最初の方で、
・「生データと変数以外は」、「ぜぇ~んぶ!」、「命令だ!!」、ととらえてしまう。
・「ぜぇ~んぶ!」、「"変数"を、"料理"するため」の、「調理器具・道具だ!!」と、ととらえてしまう。
・「ステートメント、各種関数、演算子、プロパティ、メソッド、列挙、組込定数、」などなど・・・、それらは全部、「ぜぇ~んぶ!」「命令」だと、あえて、とらえてしまいます。
と書きました。
そして、そのうち、以下の命令の多くは、値やオブジェクトを返します、あるいはなじみがあります、と前項で書きました。
・演算子(算術演算子、比較演算子など)
・VBA関数(Excel独自のもの、WordやAccess等々独自のもの、Office共通のもの、等々のうち、多分その半部以上?)
・Excelの場合、WorksheetFunctionプロパティを用いてのワークシート関数?(全部)
・プロパティ(基本、全部。WordやAccess等々も。例外が多少あるかも?調べたことありません。オブジェクトブラウザで確認できます。)
・メソッド(おそらく半分以上?こちらも、オブジェクトブラウザで確認できます。)
・イベントの引数(多分、基本、全部。例外あるかも?)
・定数(全部。数字を返します。WordやAccess等々も。「定数」自体は英語です。)
前置きが長くなりましたが、プログラミングでは、その返されたものを、「変数に代入したり、引数としてさらに他の命令たちに渡す」=「リレーしていく」、という作業を多くやります。
ただその時に、基本、
・用意した「変数や引数」の、実際の細かいデータの「型」と、
・命令たちから返ってきた値やオブジェクトの、細かいデータの「型」が、
「同一」でないと、すぐにエラーになってしまいます。
なので、各種の命令たちが、
・そもそもその命令は「値やオブジェクトを返すのか?返さないのか?」
・もし「返す」なら、どんなデータの型の「「値やオブジェクト」を返すのか?
を事前にヘルプかオブジェクトブラウザで調べておく必要があります。
それは、
・ヘルプの「戻り値」や「戻」をCtrl+Fで探す、
・オブジェクトブラウザの説明ペインで「AS ××」があるかないか?とあればその内容を調べる
という作業で調べることができます。
Web検索しても出てこないことが少なくないので、基本、ヘルプとオブジェクトブラウザのほうが確実です。
「なんでエラーが?」となったときは、この作業をサボっている場合がほとんどです。
(タイプミス以外は。)
逆に言うと、エラーが出たときは、真っ先に、まず、この作業をします。
(g) ★★★「オブジェクト」や、「オブジェクト変数」を理解できていること。
短く話せないので省略します。
(h) ★★★「値を返す自作関数」はもちろん、「特に」、「オブジェクトを返す自作関数」をある程度自由に作れるようになること。
例えば「Rangeオブジェクト」を返す自作関数など。
これも短く話せないので省略します。
(i)「オブジェクトを返す」ということが「実際に」どういうことなのかを事例で理解すること。
(「値」についても、返す、という言葉の意味を「実際に」「事例で」、より理解すること。)
※「値」の場合は、値を返す自作関数が、「ワークシート関数」としても使えるのでわかりやすいと思います。
※オブジェクトを返す自作関数は、現存するメソッドの動きと同じような動きをするものを作ってみるとよいと思います。
※古いバージョンのExcelだと、「無い関数」が存在するのでそれを自作してみる、とか。
(j)「プロパティもメソッドも」、「値やオブジェクトを返す自作関数」と同じような仕組みで動いていて、「名前付き引数」も使える、ということを理解する。
「プロパティもメソッドも」、「値やオブジェクトを返す自作関数」と同じような仕組みで動いています。
それは
「プロパティも」
「メソッドも」
「値やオブジェクトを返す自作関数」も、
ぜんぶ、
「名前付き引数」が使える
ということがヒントになります。
そもそも「名前付き引数」は、メソッドだけのものじゃなくて、プロパティにも使えるし、
もっと言うとメソッドやプロパティだけのものじゃなくて、
もともと??は、「引数を持つすべてのプロシージャ」=「引数を持つすべての自作関数」のもの、です。
と、ヘルプにそう書いてあります。
で、その「引数を持つすべての自作関数」において、
ユーザー自身が独自に「値やオブジェクトを返すように」自作関数を作れば、
「引数を持つ・値やオブジェクトを返す自作関数」も、「名前付き引数」が使える・・・、
となります。
というわけで(細かい説明は省きますが)、結果だけ言うと・・・、
「プロパティも」
「メソッドも」
「値やオブジェクトを返す自作関数」も、
ぜんぶ、
「引数を持つもの/持たないものがあって」
「値を返したり(=文字ベースの一般データを返したり)」
「オブジェクトを返したり」
「何らかの動作をしたり」
「引数を持つものに限っては、名前付き引数を使ったり」
・・・・という、「同じこと」が、「できる」のです。
※引数を持たないプロパティやメソッド、自作関数、は、名前付き引数は使えません。
そこに気が付いて調べていくと、次のようなことがわかります。
「引数を持つ/持たない、値を読めるだけのプロパティ」
(××.Application、Workbook.CalculationVersion、など)
=「引数をもとに、あるいはそれなしに、設定値を読みだす(値を返す)、でも値の設定ができない、単機能な自作関数」と似た仕組みで動いている。
「引数を持つ/持たない、値を読み書き両方できるプロパティ」
(Range.Value、Shape.Height、Window.Width、など)
=「引数をもとに、あるいはそれなしに、値の設定、および、読みだす(値を返す)、という2機能を持った自作関数」と似た仕組みで動いている。
「引数を持つ/持たない、オブジェクトを返すだけのプロパティ」
(Application.Workbooks、Workbook.Worksheets、××.Item、など)
=「引数をもとに、あるいはそれなしに、オブジェクトを返すという単機能だけを持った自作関数」と似た仕組みで動いている。
「引数を持つ/持たない、値を読めるだけのメソッド」
(Application.DDEInitiate、
=「引数をもとに、あるいはそれなしに、設定値を読みだす(値を返す)、でも値の設定ができない、単機能な自作関数」と似た仕組みで動いている。
「引数を持つ/持たない、オブジェクトを返すメソッド」
(××.Item、Worksheet.PivotTables、など)
=「引数をもとに、あるいはそれなしに、オブジェクトを返すという単機能だけを持った自作関数」と似た仕組みで動いている。
「引数を持つ/持たない、何らかの動作のみができる値やオブジェクトを返さないメソッド」
(Worksheets.Delete、Worksheet.Move、など)
=「引数をもとに、あるいはそれなしに、何らかの動きだけをする何も返さない自作関数」と似た仕組みで動いている。
「引数を持つ/持たない、何らかの動作をしつつ、同時に、値やオブジェクトも返すメソッド」
(××.Open、××.Add、など)
=「引数をもとに、あるいはそれなしに、何らかの動きしつつ、値やオブジェクトを返す自作関数」と似た仕組みで動いている。
などなど。
(これらの他にも「何らかの動きをしつつTrueやFalseを返したりするメソッド」、ほか、いろんな動きをするものがあります。)
そして、無駄なようですが、でも、「あえて」、
「それらのプロパティやメソッドと同じような動きをする自作関数」を、作る練習をします。
これがわかると、オブジェクトブラウザが使え始めるか、
オブジェクトブラウザの利用意義がわかり始める、と思います。
結果、それをくりかえすうちに、
「ある地点から」
「爆発的に」
「VBAが上達」
します。
(k)オブジェクトの階層構造(=オブジェクトモデル)を理解して、「階層構造の、まったく省略の無いオブジェクト式が書ける」こと。
特に、Applicationプロパティや、更に、「特に」、Item(プロパティもメソッドも)などを省略しないこと。
「特に」「Item」という名前のプロパティやメソッドを省略しないことが本当に大切です。(ヘルプが、サンプルプログラムにおいては省略してしまっているのでちょっと悲しいですが)
省略すると、ヘルプもオブジェクトブラウザも読めなくなってしまい、本当に残念ながら、早速「挫折」が始まっていってしまいます。
下手をすると、講師の方であっても「ヘルプもオブジェクトブラウザも読めないひと」が居て、いいかげんなことを教えられてしまいます。
(ほんとうに残念だと思います。)
(l)「オブジェクト、プロパティ、メソッド、イベント」の位置関係・主な役割をしっかりと理解していること。
プロパティ、メソッド、イベントは、特定のオブジェクトに紐ついた=特定のオブジェクトに保持・保有・内包される、命令・機能たちです。
そして、「ステートメントや関数、演算子」、のように、オブジェクトの外側に、存在するわけではありません。
オブジェクトの内側に、存在します。
そのため、オブジェクト変数にオブジクト(=オブジェクト式)を代入すると、
その「オブジェクト」に内包される「プロパティ、メソッド、イベント」たちも、道連れに代入されます。
(というイメージです。実際には、代入されるのは「オブジェクトへの参照=オブジェクトへのどこでもドア=オブジェクトへのショートカットアイコン…のようなイメージ」、だそうですが)
(m)「オブジェクト」には「単一オブジェクト」と「コレクションオブジェクト」の「2つしか無い」ことと、その位置関係を知ること。
特に、「コレクションオブジェクト(通称コレクション)」は、「単一オブジェクト」の「親」ではない、ということを知ること。
「ヨコとかに居るかんじ」ということを知ること。
コレクションは単一オブジェクトの上位にはいません。
イミディエイトウィンドウでTypeName関数+Parentプロパティで調べればわかりますが、
コレクションの1階層親も単一オブジェクトの1階層親も、「同じ単一オブジェクト」です。
参考図
(02)コレクションの位置関係など(PDFを作ったモトとなるxlsxは上記Zipの中に含まれています。)
※A4一枚に印刷して、かろうじて読めます。
https://euc-access-excel-db.com/00000WPPDF/get-object-basic01.pdf
https://euc-access-excel-db.com/00000WPPDF/get-object-basic02-disc-cut.pdf
こちらも文字が超小さいので、Ctrlキーを押しながら、マウスホイールで拡大して見てみてください。
もしエラーが出たら、エラーを消して、F5キーで再表示してみてください。
(n)プロパティやメソッドは、「 "親"となるオブジェクトも付加して言い表すクセにしないとハマる」ことを知っておくこと。
でないと、ヘルプやWebで検索しても、自分が本当に知りたいものや答えにたどり着けません。
無関係のヘルプページやWebページを見てしまい、さらに混乱を招いてしまいます。
なので、「オブジェクトモデル=オブジェクトの階層構造」の一覧のことを学ぶ事は、その意味からもすごく重要です。
参考として、(書きかけですが)以下のPDFを参考にしてください。
https://euc-access-excel-db.com/00000WPPDF/object-model01.pdf
オブジェクト名で検索もできるので、どの位置に居るのかも明確になります。
(Ctrlキーを押しながらマウスのホイールを回すと、拡大表示されます。デフォはA4におさまる大きさなのですごく小さいです。)
例えば「Rangeプロパティ」には、Worksheet.Range、Shapes.Range、Range.Range、など、複数の「Rangeプロパティ」が存在します。
でも、すべて「親」となるオブジェクトが異なるので、みんな、動きも異なります。
例えば、Worksheet.Range プロパティのことを知りたいのに、
「親」となる「Worksheet」のことを意識しないで検索しても、
ヘルプもWebも、Shapes.Range や Range.Range、などがヒットしてしまう、
あるいは、知らずにそこを選んでしまう、というミスをおかしてしまいます。
そうすると、Worksheet.Range プロパティのことはまったく調べられません。
つまり、「Range プロパティ」は「Range プロパティ」でも、
「Worksheet.Rangeプロパティ」のことを調べたい時は、ヘルプでもWebでも、検索語句としては
「Worksheet.Rangeプロパティ」で検索しないと、ダメ、=間違ったものがヒットしてしまう・・・、
ということなのです。
そもそも「Rangeプロパティなんだけど、親が何かがわからない」という場合は、
イミディエイトウィンドウやオブジェクトブラウザも活用します。
例えば イミディエイトウィンドウでなら、
「? TypeName(Application.Selection.Parent)」(=今選択しているモノの親)とか、
「? TypeName(Range("A1").Parent)」(=A1セルの親)とか、
でEnterすると、プロパティの親となるオブジェクトの種類(型)が返ってきます。
例えば、セル(=セル範囲=Rangeプロパティ)の親となるオブジェクトが何なのかを知りたい場合は、
あるセルをクリックにて選択してから「? TypeName(Application.Selection.Parent)」でEnterしたり、
直接セル番地を指定して「? TypeName(ActiveSheet.Range("A1").Parent)」でEnterしたりすれば、
「Worksheet」と返ってくるので、
『 あ、今のこの場合は、「Worksheet」が、Rangeプロパティの親のオブジェクトなんだな・・・』、と分かります。
結果、「Worksheet」を「Range」の前にくっつけて、
「Worksheet.Rangeプロパティ」で検索すれば、ヘルプもWeb検索も正しい情報・求める情報がヒットする、
ということになります。
一方、VBEのオブジェクトブラウザでなら、
「完全一致」で、「Excelライブラリ」だけに絞り、「Range」という語句で検索すると、
中段の「検索結果」のペインに、「Range」という名前の「何か」を持つモノたちがずらっと並びます。
で、一番右の列にならんだプロパティアイコンのモノが、「Rangeプロパティ」で、
真ん中の「クラス」の列に並んだものがその「Rangeプロパティ」の「親」となるオブジェクトです。
そして、その「親」となるオブジェクトをクリックしてF1キーを押せば、
その親オブジェクトの場合限定の「Rangeプロパティ」のヘルプページが出てきます。
いったん、ヘルプが開けば、あとはオブジェクトブラウザで親オブジェクト(クラス)を選び変えてF1キーを押せば、
ヘルプの画面の中の内容もどんどん切り替わるので内容の確認(差、違い)も確認しやすいです。
この使いかたとしては、Excel2010、2007のヘルプが高速に動くし、Webにつながなくても動くので秀逸です。
もちろん、2003以前のヘルプも。
(o)オブジェクトブラウザの利用意義がわかること。(別の回で後述します。)
(p)ローカルウィンドウ、イミディエイトウィンドウ、ウォッチ式、の、、操作はもちろん、エラー対策やプログラムの考案への活用ができる。
特にVariant型の変数を使っているとき。
(q)ローカルウィンドウで変数に生データが代入されることを実際に直接、目で確認する操作ができること。
・一般変数に値(生の一般データ)が代入される、
・オブジェクト変数に値(生のオブジェクト)が代入される、
・値が返る、
・オブジェクトが返る、
・一般変数の中に値が返る、
・オブジェクト変数の中にオブジェクトが返る、
・オブジェクト変数の中に代入されたオブジェクトがちゃんと階層構造になっている、
・オブジェクト変数を使って、上位や下位の単一オブジェクトのプロパティも流用できる、
などを、実際に、目で、見ることが・確認することが、できます。
(ひいてはメソッドも流用できると分かるようになります。)
これが、いろんなことの理解にとても役立ちます。
(r)ウォッチウィンドウで、計算式の内容を実際に直接、目で確認する操作ができること。
(s)「変数・その他を使っての」「型と型を」「つなげる作業(リレーする作業)」ができること。
プログラミングは、プログラムの中において「型と型を」「つなげる作業」ができないとエラーを多発させます。
そして、その「型と型を」「つなげる作業(リレーしていく作業)」をスムーズに行うためには、
まずは、使いたいオブジェクトのプロパティやメソッドたち、関数たち、等々が(=使いたい命令のすべてが)、
「そもそも、値やオブジェクトを返してくるのかこないのか?」を知る必要があります。
そして、それが分かったなら、「もし返してくるなら、それはどんな型の何が返ってくるのか?」を調べることも必要です。
(※これは、最悪「値を返す自作関数」が作れるようになれば、オブジェクトブラウザやヘルプで、ほぼ簡単に調べられます。
とくに「オブジェクトを返す自作関数」がわかれば完全にスッキリわかります。
オブジェクトブラウザとヘルプのいずれかでわかりにくかったら、2つとも見て確認し合います。
なお、「値を返す自作関数」が作れなければ、調べてもよくわからないと思います。)
実際、それができないとエラーが多発します。
そして、その「型と型を」「つなげる作業」をスムーズに行うためには、前述した(a)~(q)などのことが必須です。
(t)Web情報ありき、よりも、ヘルプありきのWeb検索、のほうが圧倒的にミスやエラーが減り、「急がば回れの近道になる」、ということを知る。
ヘルプやオブジェクトブラウザが扱えるようになることを「面倒」とお感じの方もいらっしゃるかと思いますが、それは誤解なのです。
巷の講師や本たちが、そう教えてしまうので、鵜呑みにしている方も多いと思いますが・・・。
実際には、Web情報ありき、よりも、ヘルプありきのWeb検索、のほうが圧倒的にミスやエラーが減ります。
(u)最初のうちは「With」を使わない。オブジェクト変数を使う。
多くの書籍で「With」をえらく推奨しますが、こればかりを使うのも、「初心者が挫折するむかーーーしからの悪習・泥沼にハメられる騙しのひとつ」だと思います。
もちろん、便利なこともあるので、使えたほうがいいに決まってますが、
これを推奨するから・・・、
大したメリット・意味は無いのに「With」を必要以上に推奨するから、
「オブジェクト変数」を使わなくなってしまいます。
結果、意識しようがしまいが、「オブジェクトを返す自作関数の学習から逃げる」ことになってしまい、挫折街道を進まされてしまいます。
Withを使うのは、オブジェクト変数が自由に使えて、階層構造も理解できてからでも、ぜんぜん遅くありません。
逆に最初からWithばかり使っていると、大変残念ながら、
・「VBA的には」
・「オブジェクト変数が一向に使えず」
・「バカにさせられてしまう」という
・「デメリットのほうが大きい」
です。
Withはオブジェクト変数に対しても使えますので、どうせ使うなら「あえて」「冗長になってもいい」ので、オブジェクト変数に対して使うほうがいいと思います。
最初は「ムダに長い・二度手間かもしれないコードを書くことになるけれど」、「Withはオブジェクト変数に対しても使える」とわかれば、よりコードの書き方の選択肢も増えますし、できること・Wiyhを活かす方法、が増えると思います。
「ムダ」は「無駄じゃない」というやり方ができます。
=======================
ひとまず以上です。
繰り返しになりますが、中でも重要なのは、特に(g)と(h)です。
そのためには(a)~(f)、(i)~(u)などが必須です。
「そんな細かい事覚えられない」、と言ってしまうと、
「100%上達しないのが火を見るよりも明らか」ですので、
それだと本当に残念ながら、
「最初からVBAなんかやらないほうがいいですよ?
学生さんなどに安くやらせるほうがいいですよ?
ランサーズやクラウドワークスなどで依頼しましょう。」
ということになってしまいます。
嫌味で言っているのではなく、マジで、それも「正しい選択」なのです。
でももし、あなたが「そうなりたくはない」「どうせなら逆にそういうところで小遣い稼ぎできるくらいにはなりたい」とお思いなら、「素直に」「あきらめて」、「少しずつ学習していく」しかありません。
市販書籍の中には、レジェンドさんの本でも「そこまで細かく覚える必要はありません」と書いてある本もありますが、それはやはり「ウソ」です。
僕にはその「ウソ」が本当に理解できません。
なぜそんな「ウソ」を自分の本に堂々と書いて、しかも、「売っている」のでしょうか?
そんな「ウソ」が通用するのは、「あくまでも」「最初だけ」です。
「初心者本の段階」のなかだけのことです。
実際に、その講師の方々が実際に書いているコードを見れば、多分、「こまかいことだらけ」です。
「そこまで細かく覚える必要はありません」なんてレベル、「初心者本を終えただけ」のレベルでは、「自分の思い通りのプログラムの組み立て」など「100年経っても」できません。
しつこくてすみませんが、「そこまで細かく覚える必要はありません」なんていうことは、マジで、「ウソだから」、です。
「自分の思い通りのものを作りたい」となったら、前述した(a)~(u)は、「さすがに」「必須」です。
「避けて通れません」。
避ければ「100%の」、「挫折」と「例えば・習ったお金をドブに捨てる」ということが待っているだけです。
★ ぜひ、ゆっくりでいいので、上記の(a)~(u)は、上司、同僚、ひいては後輩やわが子にであっても、「何百回」でも「聞いて」、必ず「モノにして」ください。
そこまでやる気がないなら、最初から(仕事では)、VBAなどやらないほうが「マジで」絶対に「得」です。
エラーが自力で解決できないからです。
ランサーズやクラウドワークス、あるいは、安い学生さんや個人事業の安価なプログラマ、など、「わかるひと」に「最初から」頼んだほうが絶対に、「あなたのビジネスをクソエラーどもに」「邪魔されません。」
「時間」という超重要な資源を奪われません。
個人事業だったらどうします?
そうじゃなくても、もし、エラーのせいで、営業や各種作業、大事な商談や接客がストップしてしまったら?
怖くないですか?
「VBAごとき」、ビジネス的に言えば知らなくても何の問題もないので、「自分ではやらない」「知ってる誰かにまかせちゃう」ということも「立派な選択肢」であり、「大正解」「真の正義」である、というとは、声を大にして言いたいです。
どうか、市販書籍などの「カンタンだよ!」という言葉に騙されないようにお気をつけください。
それは「ウソ」です。
現実は、そんな簡単じゃあ、ありません。
現実はそんなに甘くはありません。
★ (a)~(u)は「必須」なのです。★
もし本当にカンタンなら、とっくに小学校、中学校、高校、大学、の「教科」になっています。
カンタンじゃないから、「20年も前と」「同じことしか教えておらず」「進化していない」です。
(むしろ20年前の市販書籍の方が誠実かも)
カンタンじゃないから、高等学校の普通科の必修科目にもなっていません。
(商業科の一部だけできか教えられていません。)
★くどくてすみませんが、逆に、マジで、「やる」つもりなら、(a)~(u)までを、絶対に、「死んでも」制覇して下さい。★
※型と型をつなげていく、リレーしていくためには、「変数の型の勉強」が必須です。
「型なんて全部Variant型でいい」という市販の初心者本が増えてきましたが、それを信用した時点で、大変残念ながら、「脱落・下の下の腕のまま」、ということが確定していってしまいます。
※注意!!
「★ (10) 挫折しないための「プロパティ」とは?」のところで後述していますが、
例えば「Worksheets.Count プロパティ」のヘルプには、
「コレクションに含まれる要素の数を表す長整数型 (Long) の値を返します。」と書かれています。
「コレクションに含まれる要素の数を表す長整数型 (Long) の値。」で終わっていません。
つまり、「プロパティ」とは、「もともとは」、「値」ではない・・・、わけです。
「関数」のような機能・命令、なわけです。
このような動きは、プロパティだけでなく、メソッドでも同じです。
市販の書籍では、「プロパティとはオブジェクトの性質や状態を表すもの」などと説明している本が多いです。
が、それだけの理解で終わってしまうと、「ヘルプとオブジェクトブラウザ」は「永遠に」「読めません。」
実際には、プロパティとは、「オブジェクトの性質や状態を表す ”値 ”を、読み込んだり書き換えたりする関数のような命令語句」です。
なのに、
「プロパティとはオブジェクトの性質や状態を表すもの」と書いてしまうと、
「プロパティ」を「原則」「値だ」ととらえていることになってしまいます。
しかし、プロパティは、「値」ではなく、「原則」「関数のような命令だ」というのが、「実態・真実」です。
オブジェクトブラウザの説明ペインにもちゃんとそう書いてあります。
(「Property ×× AS ××」 と。)
なので、
「プロパティとはオブジェクトの性質や状態を表すもの」のことは、
安易に「プロパティ」と呼ぶべきではなく、
「プロパティ値」とか、「プロパティという関数めいたものが返す値」、
と呼ぶ・訳す、区別する、のが、「正しい」と思います。
「値(データ)」と「命令語句」はしっかり区別する。
混同しない。
ということです。
プロじゃないから、多少は手抜きするとしても、
いくら素人でも、「手抜きしていいところと悪いところ」があります。
『プロパティは「原則」「値」なのか?「命令なのか?」をあいまいにする・・・』、
ということは、
「絶対に手抜きしちゃいけない悪いこと」です。
あいまにすると、オブジェクトを理解できず、結果、エラー解決も上達もできません。
これを教えてもえらえてないから、ほとんどの人が、「お金を払って習っていても」、挫折するか、エラーの自力解決ができません。
エラー解決できない=つまらない=挫折、となります。
プロパティは「あくまでも」、「命令であり、機能」、です。
しかも「関数と同じような」。
「原則」、
「オブジェクトの性質や状態を表すもの」
「オブジェクトの性質や状態を表す値」
のことではありません。
どうか騙されないようにお気を付けください。
これも「VBA業界のむかあーーしからのウソ」のひとつで、
しかも、「初心者・独学者をドロ沼にハメる」、
もっとも罪深い「ウソ」のひとつです。
僕も騙されていました。
でも「騙されてたと気づいてから」、そのあとは、進みが速かったです。
自分で言うのもなんですが、爆発的に、伸びました。
(「過去の自分」と比べれば・・・、ですが。)
AccessVBAの時に、理解し間違えていたことも色々と判明してきました。
Web上のほとんどのサンプルがウソみたいに、短期間に、理解できるようになりました。
理解に時間はかかっても、「わからない」ということがほとんどありません。
ヘルプもオブジェクトブラウザも理解の助けになってくれるので。
皆さまも、どうか、騙されないように、本当にご注意ください。
※演算子でも同じですが演算子はオブジェクトがらみではない命令のため、オブジェクトブラウザには載っていません。
ヘルプにはもちろん載っています。
==============================
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
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
----------------------------------------------------------------------