★★★★★★Access2000VBA・Excel2000VBA独学~用語:「ExcelVBAプログラミング」とは?~
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
※関連記事
★★★★★★★★★★★★★★★★Access2000VBA・Excel2000VBA独学~★超重要!!「なかなかVBAが上達しない・応用ができない・応用が利かない・思いどおりのものが作れない理由」。5個以上。~ExcelVBA独学のコツ?ポイント?~とりあえず20個くらい~
★ はじめに(ExcelVBAプログラミングでできること)
ExcelVBAプログラミングを使うと、例えば、以下のようなことができます。
(01)ワークシート上(数式)で使える、「自作の」「関数」(「ユーザー定義関数」といいます)が作成できます。
(02)ユーザーフォームを作って、シートへの入力や入力値のチェックなどをより簡単に行えるようにできます。それらの各種自動化も「いちおうは」できます。「全く」「お勧めはしません」けど・・・。(理由は後述。)
(03)写真のファイルを読み込んで写真入り一覧表の作成、など。こちらもそれらの各種自動化も「いちおうは」できます。こちらもお勧めはしませんけど・・・。(理由は後述。)
(04)セルに入力した値を、思い通りに加工して、別のセルに転記する、など。その他各種自動化。フィルタ、その他のExcelの基本操作の自動化
(05)リボンや右クリックメニュー、クイックツールバーに、自動化プログラムを「マクロ」として登録し、ボタン呼び出しができるようにする。
(06)「マクロの記録」機能を有効活用できる。(プログラムのことが一切わからなくても、そこそこ自動化できる。)
(07)ループ処理などを使って、複数の別々のデータを1つに統合する、など。その他各種自動化。(すべてのサブフォルダの中身のExcelファイルたちも一括で統合する、なども。ただしこのような処理は、「1度やったら2度とやっていけない」、というくらい、(「Excelの基礎」目線ではなく)「データ管理の基礎目線」からすると「最低・かつ・ダメ」な自動化の例とも言えます。ご注意下さい。)
(08)「SQL」を併用して、複雑な条件でのデータ抽出や計算を、ループ処理などをできるだけ使わずに、より簡単なプログラムでおこなう、など。その他関連する各種自動化。
(09)ピボットテーブルやMicrosoft Queryなども自動化して、前項の(04)をさらにパワーアップする。
(10)ADOやDAOという外部機能をさらに併用して、(08)と(09)をパワーアップする。
(11)それに連動した、グラフの各種書式やレイアウトを自動設定。グラフを動かす、など。
(12)図や図形を操作して、シュミレーションをしやすくする。など。ガントチャートの作成などにも役立つと思います。
(13)「自作のオブジェクト」を作成して、より効率化する、など。
(14)シートをフォームに見立てて、色々な作業をしやすくする・自動化する、など。
▼注意事項
(01)について
『ワークシートから使える、「自作の」「関数」(「ユーザー定義関数」といいます)が作成できます。』
既存の「Excelワークシート関数」では条件分岐・その他の処理が難しい場合などに自作します。(これができることがVBAの短期間の上達に大いに関係があります。フォームの勉強なんかよりも10倍、重要です。)
関数を入れ子で段階的にするよりも意味が分かりやすくなり、修正や機能追加がラクになる場合もあります。
※そのかわり、処理速度が遅くなる場合もあるのでケースバイケースで利用することが必要かもしれませんが。
(02)(03)について
『ユーザーフォームを作って、シートへの入力や入力値のチェックなどをより簡単に行えるようにできます。各種自動化もできます。』
『写真のファイルを読み込んで写真入り一覧表の作成』
ただし、このような処理はAccessでやったほうが50倍は効率がいいもんですから、Excelでやるのはバカみたいに効率が悪いので、あまりお勧めはできません。Accessランタイムを使って、Accessの入ってないマシンでも使えるようにすることを検討しても良いかもしれません。
あるいは、ブラウザをユーザーインターフェイスにするほうがマシかもしれません。
これをやるまえに、できれば、Accessも勉強するほうがいいと思います。効率が全然違いますので。
(04)について
このような処理が多いと思います。
(05)(06)について
併用すると、大変、便利になります。
マクロがわからない人でも自動化(あるいは「半」自動化)ができ、少しでも省力化をすることができます。特に、レイアウト変更やセル書式変更するようなプログラムに有効です。
マクロの記録機能を「実務に使えない」と馬鹿にする人いますが、おそらくですが「活用方法をご存知ない」のと「現場の ”コスト” というものについて・まったくなにも考えたことがない」、そういう方だと思いますので、無視してください。
彼らは「汎用的なプログラムを書きさえすれば効率化できる」と盲目的に信じすぎていて、「作ったプログラムがどれだけ使われないか」「作ったはいいけど使われずゴミと化した汎用プログラムの腐るほどの例」「タイムイズマネーを標ぼうする人にとっては、お金と同様に大切な、独学するための ” 時間 ” というコストのこと」などは、まるで考えていません。
「ExcelやAccessのたった数万をケチること」や、「自分がVBAができることを自慢すること」しか考えていない気がします。
「なぜそう書くか?がわかるようになる」とか「10分で書けるようになる」には、「超反復」が必要ですから、「時間」をドブに捨てる覚悟が無いとできませんし、実際、独学するとなると「エラーに足止めをくらうことばっかり」ですから、「ヒマ人」しかできませんが、そういうことを「全部」「隠して」いるのです。
習いに行っても「自分の思い通りのプログラムがすぐに書ける」ようになる人は「基本的には、ほとんどいません。」。たまたま、講習内容が合っていれば別ですが。
プログラミングは、もともと「おそろしく時間がかかるもの」なのです。
が、彼らはそれを「ひた隠し」に「隠し」、「いいことばっかり」「いい面ばっかり」しか言いません。まるで詐欺のセールスマンのようです。
(07)について
VBAを使うのに、特にデータ抽出や計算処理でループばかり使うのは、大変失礼な言い方で申し訳ございませんが、「愚か」で、コスパが悪いです。(08)~(10)を学び・使って、「ループ処理が必要のない場面ではループ処理を使わない」、という風にすることが大切かと思います。
なお、『ループ処理などを使って、複数の別々のデータを1つに統合する』という処理は「データ管理の基礎をまるで知らない」人がやることなので、1回やったら2度とやってはいけない、というくらい「ダメな」「自動化」の例です。
(もちろん、それを分かっていて、でも、そうするしかない場合もありますので、その場合はよいのですが・・・)
まずは「Excelの基礎」なんかよりも「データ管理の基礎」と「SQL」を学ぶ方が先決だと思います。
Googleスプレッドシートやその他の表計算ソフトやデータベースソフトにも使えますので。
(11)~(13)について
本来のVBAを使う目的はこれだと思います。「見える化」や「シュミレーション」や「分析」の等々の「自動化」だと思います。
そのために、「まずは、そのモトとなる " 作表 " の自動化をする・・・」みたいな感じです。
でもそれは、できるだけ、VBAではなくて、SQL、Microsoft Query、ADO・DAO、ピボットテーブル、を利用し、ExcelVBAはあまり利用しないほうが、効率化がしやすくなる、と思います。
作ったものを高機能化したいたいときに(システム化などをしたいときに)外注に出す場合も、予算が少しでも少なくなります。
★ そもそも「プログラミング」とは?
ExcelVBAのことをお話しする前に、まずは「プログラミングとは?」ということから・・・・。
「プログラミング」とは、『 どんなプログラミングでも、「変数」と呼ばれるものを動かして・操作して、「自動化を図る」作業のこと。』です。
「操作・自動化」の「対象」は、「変数だ」、とイメージしていただいてOKです。
特にExcelVBAでは、そう思って頂いて結構です。
そのほうが初心者のうちは全体が理解・俯瞰しやすいので。
(特に、後述の「オブジェクト操作」というものががからんできたときに。)
=============
補足
実は、本当ことを言うと・・・・、
「変数」に代入した「生データ」が「本当の操作対象」なんですが、でもそこまで言ってしまうと、話が細かくなりすぎてしまい、初心者の方には理解がしづらいと思いますので、最初のうちは、「プログラミング=変数と呼ばれるモノを動かす作業だ」とイメージしていただいて良いと思います。
※逆に、「変数=目的・操作対象」ということにしておかないと、「オブジェクト変数」のことを勉強しなくなってしまいます。
その結果、ExcelVBAの上達が。「もうその時点で」「100%、不可能」になります。
さらにその結果、「そこまでにかけた独学時間や換算自給・あるいは教習などに使った金額を全部ドブに捨てる」ことになります。
そうなることが、「100%、目に見えて」いるのです。
※なぜ「100%、目に見えて」いるのかというと、「オブジェクト変数(後述)」のことが理解できなければ、「オブジェクトを返す自作関数(どこかで後述)」が作れず、それが作れねば、結局、プロパティもメソッドもその他のオブジェクトを返す関数の意味や扱い方法もわからないままになってしまうためです。(これもどこかで後述)
ExcelVBAではオブジェクトの色々なことと「自作関数」のことが分からないうちは、「永久に」「初心者の下の下を脱することができない」のです。
=============
これには「例外」は「ありません」。(冒頭の定義も、補足も。)
そして、「ExcelVBA」では「特に」「この傾向が顕著」です。(冒頭の定義も、補足も。)
ですので、それであえて、プログラミング初心者の方には「変数が操作対象だ」と、お話をさせていただいています。
どんなプログラミング言語でもこれは同じです。
で、基本的に、「変数」の中には、「生データ」を「代入」して「操作・動かし」ます。
「変数」は、小学生か中学生に習った、「 x + y = z 」の、「x」とか「y」、「z」といったものと同じようなものです。
その時の「変数」は、「生の数字(生データ)」を「代入」するための「仮の箱、あるいはお皿」というイメージだったかと思うんですが、それと基本的には同じ考え方です。
(※プログラミングの場合は「数値」だけじゃなくて文字列や日付データも代入できてしまいますが)
料理に例えていうと、
「生データ」が肉や魚、野菜などの「素材」で、
「変数」が「仮置き用の小皿、ボウル」といったイメージです。
「まな板は?」と聞かれると返答に困ってしまいますが、「まな板・包丁・ナベ・コンロ・おたま」などは、「素材を加工するための道具」、とイメージして頂ければよいと思います。
それらは実際のプログラミングにおいては、『 「関数」や「演算子」、「ステートメント」「プロパティ」「メソッド」「列挙」、その他諸々、と呼ばれるモノたち・・・・』とイメージして頂ければよいのではないかと思います。
いずれにしても、プログラミングは、「変数」(小皿やボウル)に、「生データ」(肉や魚、野菜など)を「代入」(仮置き)した上で、それらを「関数等々」(調理道具)を使って動かす・・・という作業です。
そのような操作をして、「自動化を図る」、という作業です。
ある意味、プログラミングにおける「プログラム」とは「レシピ」のことで、「プログラミング」とは「レシピを書く」という作業に似ていると思います。
繰り返しになりますが、これは、どんなプログラミング言語でも同じです。
★ ExcelVBAプログラミングとは?
で、実際にExecelVBAでは、どうなのか?ということなんですが・・・・
前項までに書いてきたような中で、まず、ExcelVBAは、「オブジェクト指向(もどき。ちゃんとしてないやつ。)」と呼ばれるプログラミング言語に属するそうです。
そして、ExcelVBAに限って言えば、冒頭でお話ししました「変数」には2種類があります。
(他の「(ちゃんとした)オブジェクト指向」も似たような感じだと思います。)
それは、
「一般的な変数(以下「一般変数」。)」と、
「オブジェクト変数」、
の2つです。
といいますか、「2つしかありません」と言ったほうがわかりやすいかもしれません。
一般変数では「文字ベースのデータ」を操作(加工・計算など)をし、
オブジェクト変数では、Excelの持つさまざま「機能」を操作(セル操作、ワークシート操作、コピー、貼付け、印刷、等々その他色々な操作。)します。
一般変数の操作では、「生データ」を「一般変数」に仮に格納して、その「一般変数」の中でさまざまな値に加工や計算等を行います。
例えば、
・数値データを使った四則演算(+、-、×、÷)や、平均、最大最小値、標準偏差、などの割り出し。
・日付データを使った日付の割り出しや期間の割り出しその他、
・文字列データを使った、文字列の加工(部分削除、部分取り出し=トリミング、部分置換、その他諸々)
・論理値(True/False)などを使った条件指定、
等々を行います。
これらを全部、自動的に行えるようにします。
そのためのプログラム(レシピ)を書きます。
オブジェクト変数の操作では、
これらを全部、自動的に行えるようにします。
そのためのプログラム(レシピ)を書きます。
以上が、「ExcelVBAプログラミング」と呼ばれるモノの「概要」です。
===================================
※以下、細かい補足をつけた箇条書きと、無くした箇条書きの両方を掲示する。
(01)
まずは雑誌やWeb、市販書籍などを読んでいて、自分が気になるオブジェクトが、
「コレクションオブジェクト(コレクション)」なのか、
それとも「単一(単体)のオブジェクト」なのか?を調べます。
→オブジェクトブラウザにて、
・「完全に一致する単語だけを検索」
・「グループメンバー」
・プラス、一応、「非表示のメンバーを表示」
の3つにチェックを入れてから、検索します。
特に、検索時には、単語は正確に入力します。理由は例えば何らかのコレクションオブジェクト検索したい場合、検索語句の最後に「s」が必要なのにもかかわらず、それを忘れると、出てくる結果のオブジェクトは単一のオブジェクトになってしまい、結果、まったく意味が違うオブジェクトが出てくることになってしまうからです。
(02)
検索でヒットしたオブジェクトが、「Item」という名前のプロパティ・またはメソッド持っているかいないか?を調べます。
→持っていたら「コレクションオブジェクト(通称コレクション)」と分かります。そういう判断ができます。逆に、「そういう判断をします。」
持っていなかったら「単一オブジェクト」と分かります。そういう判断ができます。逆に、「そういう判断をします。」
※『 Item」という名前のプロパティ・またはメソッド持っているかいないか?』は、ヒットしたオブジェクト(クラス名)の右側に出ているメンバーの一覧を見ると、アルファベット順に並んでいるので、上から順に「I」の頭文字を探し、無ければ「ない=持ってない」ですし、有れば「ある=持っている」ということになります。
※ヘルプにて、コレクションオブジェクトの「オブジェクトメンバー」の一覧表を見ると、必ず「Itemプロパティ」か「Itemメソッド」のいずれかが存在します。(逆に単一のオブジェクトは、ItemプロパティもItemメソッドも「持っていません。」)
そして、「Itemプロパティ」であっても、「Itemメソッド」であっても「コレクションから単一のオブジェクトを返します」みたいな説明が載っています。
また、1つのコレクションオブジェクトには、「Itemプロパティ」と「Itemメソッド」の2つが存在することはありません。「Item」という名前で、「プロパティかメソッドのいずれか」しか存在しません。
そして、その働きが・・・・、
「コレクションから単一のオブジェクトを返します。」
「=コレクションから単一のオブジェクトを取得してくれます。」
「=コレクションから、引数に指定した単一のオブジェクトを選択して(取ってきてくれて)ユーザーに投げ返してくれます。」
・・・・ということです。
なお、「Item」はプロパティでもメソッドでも「省略してもOK」というルールになっているので、ほとんどの市販書籍、Web記事で、「省略されっぱなしで」「説明すらされない」ケースも多いです。
でも、知っておいたほうが、確実に、ExcelVBAや他のソフトのVBAの上達が早まります。
(03)
コレクションオブジェクトなら、「階層構造の大雑把ルール図」のこの位置に位置するモノ。と判断します。
→そして、複数の単一オブジェクトたちを個別選択・一括管理(個別選択・一括操作)できる。と判断します。また、「下位のオブジェクトを取得できないが、”Item”で、単一のオブジェクトを取得=選択できる。」とも判断します。
単一オブジェクトなら「階層構造の大雑把ルール図」のこの位置。と判断します。
→そして、「単一オブジェクトの内包する各種の細かい機能を使える。」と判断します。また、「下位のオブジェクトを取得できるプロパティやメソッドもあるはず。」とも判断します。
※結局「オブジェクトの操作」とは、基本的には・・・・、
「コレクションオブジェクト=通称コレクション」と呼ばれるものが保持・保有・内包している「ItemプロパティあるいはItemメソッド」を使用(経由)して、
そのコレクションに属する「単一オブジェクト」を、「まずは選択だけ」をし(=1つだけ選択をし)、
で、選択したら、単一オブジェクトの側が保持・保有・内包している「各種のプロパティやメソッドやイベントなど」で細かい動作をさせる・・・、
というイメージです。
(コレクションオブジェクト=単一オブジェクトの個別選択+一括管理用のミニミニロボット、というイメージです。)
なお、「単一オブジェクトの選択・決定」をするには、基本、
・コレクションオブジェクトのItemプロパティかItemメソッドしか使えない・・・、
・その他のプロパティやメソッドではオブジェクトの選択はできない・・・、
くらいのイメージで思っておいていいと思います。
ただ、コレクションオブジェクトの「Itemプロパティ」や「Itemメソッド」は「省略」が可能なので、一般の書籍やWeb情報にはほとんど、「出てきません」が・・・。
でも、「省略されているだけで」「必ずそのいずれかを経由して」「単一オブジェクトが1つだけに選択される=取得できる」と考えると良いと思います。
なお、コレクションオブジェクトと単一オブジェクトは「上位・下位」とか「親・子」の関係ではない、とも、そう考えるほうがいいです。あえて関係性を持たせて考えるなら、「兄弟」みたいな「ヨコの関係」の感じです。
理由は、そもそも「ItemメソッドやItemプロパティ」は「上位・下位」のオブジェクトを取得するためのものではないですし、また、コレクションオブジェクトの親(1つ上位)も、単一オブジェクトの親(1つ上位)も、「まったく同じオブジェクト」だからです。
※なお、『コレクションオブジェクトの親も、単一オブジェクトの親も、まったく同じオブジェクトだ』ということを確認するには、親(1つ上位)のオブジェクトを取得できる「Parentプロパティ」と、「TypeName関数」を一緒に使うと、イミディエイトウィンドウなどでそれを確認することができます。
以下、例。
? Typename(Worksheets.Parent)
Workbook
? Typename(Worksheets("sheet1").Parent)
Workbook
? Typename(Worksheets.Item("sheet1").Parent)
Workbook
なので、
「コレクションオブジェクト」は単一オブジェクトを選択するとこまで「だけ」しかできない、というイメージ・・・とか、あるいは、「単一オブジェクト選択と、一括印刷や一括削除・一括移動・一括コピーなどができるだけで実際の細かいことはできない。」というイメージ。・・・・、と思って頂ければよいと思います。
「コレクション」を使って(=コレクションのItemプロパティやItemメソッドを経由して)、
まずは
「どの単一オブジェクトを選択するか?」
「=単一オブジェクトの選択」
をやって、
で、そのあとで、実際の・・・、
例えば、
・名前の変更、
・入力値の保持や編集、
・サイズ変更、
・色変更、 などなど、
その他の実際の細かい機能は、
「単一オブジェクト(単一のミニミニロボット)」たちが個々に行う・・・・、
というイメージ。・・・です。
(※コレクション=単一オブジェクトの個別選択&一括管理用のミニミニロボット、というイメージです。)
単一オブジェクトなら、Parentプロパティで上位の単一オブジェクトを取得(=選択・操作)できます。
下位のオブジェクトは、その他のプロパティやメソッド(=オブジェクトを取得できるタイプのプロパティやメソッド)で取得(=選択・操作)できます。
「単一オブジェクト」が保持・保有・内包しているプロパティやメソッドには、オブジェクトが取得できないタイプ(オブジェクトの各種設定値を取得・変更するだけ、とか、オブジェクトを何らかの形で動かすとか、だけしかできないタイプ)のモノと、逆に、「オブジェクトの取得ができるタイプ」の2種類があります。(3種類目もあるケースもあるかも?)
で、その「オブジェクトの取得ができるタイプ」のプロパティやメソッドのうち、「Parentプロパティ」以外は、多分、基本的には全部「下位の単一オブジェクトを取得する」プロパティやメソッドだ・・・というイメージで思っておいていいと思います。(例外もあるかもですので、100%ではないかもしれません。)
同様に、「コレクションオブジェクト」が保持・保有・内包しているプロパティやメソッドには、恐らくですが、オブジェクトを取得できるのは「Parentプロパティ」「Itemプロパティ」「Itemメソッド」の3つしかないケースがほとんどで、かつ、「基本・下位のオブジェクトを取得はできない」というケースがほとんど・・・、というイメージで思っておいていいと思います。(これも、例外もあるかもですので、100%ではないかもしれません。)
「下位のオブジェクトを取得できるプロパティやメソッド」を保持・保有・内包しているのは「単一オブジェクト」であって、「コレクションオブジェクト」ではない、という感じで思っていてもいいと思います。
コレクションオブジェクトについては、「上位の単一オブジェクトから下位の単一オブジェクトを取得したい場合」に、
下位の単一オブジェクトとおなじフロアに居る「コレクションオブジェクト」の「ItemプロパティやItemメソッドを経由するだけ」、とか、
下位の単一オブジェクトとおなじフロアに居る「コレクションオブジェクト」が、「ItemプロパティやItemメソッドを使って自動的に1つの単一オブジェクトを選択=取得してくれるだけ」、
というイメージです。
=============
コレクションでも、Parentプロパティで上位の単一オブジェクトを取得(=選択・操作)できる。
が、下位のオブジェクトは、直接は取得(=選択・操作)できない。コレクションは「直接下位のオブジェクトを取得できるプロパティやメソッドを持っていない」ため。コレクションは、決められた種類の単一のオブジェクトを「Item」という名前のプロパティかメソッドで取得することしかできない。
コレクションからは下位のオブジェクトを直接取得できないので、コレクションオブジェクトから、「Item」を使って「単一オブジェクトを経由する」ような感じで、単一のオブジェクト経由で下位のオブジェクトを取得する。
=============
値を加工して、その値を返すだけの関数
=ワークシート関数の多く
に似ています。
値の読み取りと設定だけをする関数
=値の読み取りと設定だけができてオブジェクトは返さないプロパティ
ににています
引数をもとにオブジェクトを返すだけの関数
引数をもとにオブジェクトを返すだけのプロパティやメソッド(コレクションが内包する、itemプロパティやitemメソッドや、WorkSheet.RangeやRange.Rangeといったのプロパティ、などなど。)
何らかの動作をしながら、同時にオブジェクトも返す関数
(あえて動きだけさせて、返してもらったオブジェクトをあえて引き取らない・もらわない、ということも可能。)
=なんらかの動きをしながら、かつ、オブジェクトも返すメソッド(AddやOpenなどのメソッド)
マクロ
リボン
クイックツールバー
イベントプロシージャのsubとpublic
VBAが上達するかしないかの最低条件
ExcelVBAは、「最低限」以下の(01)と(02)の2つのことができないと、100%、上達しません。
理由は、「プロパティもメソッドも(01)(02)のようなものと似た動きをするから」です。
なので、基本、(01)(02)ができない人は、自力でのエラー解決、なんて夢のまた夢だし、Q&Aサイトで質問したところで、回答者のくれた回答の意味すら理解できません。
そういう人達は、間違いなく、例外なく、100%、以降の(01)、(02)ができず、それ以降の(03)以降のことも当然、理解できていません。
逆に(01)(02)ができて(03)以降もできる・わかる・素直に学ぼうとする人は、ある地点から爆発的に伸びます。
結果、Web記事なども多くがスラスラわかるようになり、自作のオブジェクト(クラスモジュールのプロシージャその他)などの作成も割とすんなりと入って行けると思います。
これも理由は、「プロパティもメソッドも(01)(02)のようなものと似た動きをするから」です。
ですのでどうか、以下のことを学んでみてください。
わからなければ先輩や先生に「何百回でも、「わかるまで」聞いてください。
(01)オブジェクトを返す自作関数が作れること。
(02)以下のような色々なタイプの自作関数の違いが分かり・作れる。
・何らかの値の設定だけをして何も返さない自作関数(オブジェクトのに対する何らかの値の設定やプログラムに関する何らかの値の設定)
・何らかの値の設定をすると同時に、何らかの値を返す自作関数(設定された値と返された値に関連性があるケース・無いケースともに)
・値の設定をせずに、値の加工だけをして、それをする自作関数
()プロパティもメソッドも前述の自作関数と同じような動きをする、ということの理解
名前付き引数などが扱える
「何らかの動作をしながら・同時に・オブジェクトをも返す関数」を扱う上でカッコをつけるつけないの意味の違いが分かる
Callのとき、
動くだけ、と、オブジェクトも同時に返す。
プロパティ・メソッド・関数などが「オブジェクトを返す」ということと、「オブジェクトの取得」とはとても深い関係があり、結局『 プロパティ・メソッド・関数などが「オブジェクトを返す」ということが分からないと』、「オブジェクトの取得」のことも理解できないかもしれません。
オブジェクトを返す=ユーザーになりかわって、オブジェクト(ミニミニロボット)を1個取ってきてくれて、ユーザーに投げ返してくれる
オブジェクトの取得。=投げ返してもらったオブジェクトを受け取る=オブジェクト変数に代入したり、そのまま使ったりする。オブジェクト変数に代入することを覚えるほうがその後の上達が早くなる。(オブジェクト変数に代入しないプログラムよりも、さらに汎用化されたプログラムを作れるようになるので)
以上を実行するために、以下のことを理解することが必要です。(優先順位順)
(03)プログラミングとは、どんな言語であっても『「変数」と呼ばれるものを動かして(操作して)自動化をする作業のこと』、で、それはVBAでも変わらない、ということを理解する
なので「変数」の理解を「テキトー」にしてしまうととハマる。(例えば「変数の型なんて全部バリアント型でいい」とか。)
これは、SEになるわけじゃなくても、ビジネスパーソンがちょっとしたプログラムを組むのでも、ハマります。
初心者のうちは何時間も、何日も解決できずにハマってしまいます。笑えるくらい・・・。
あとから思うと、あるいは、VBAに対する理解が深まると、「しょーもないくだらないこと」と思えるようなことで・・・です。
(04)「配列」の仕組みを必ず理解する。
「コレクションオブジェクト」の仕組みを学ぶときに「配列」の仕組みが似ているので理解しやすいです。
「配列」と「Variant型」の変数を組み合わせて使うことで、表データなどを、高速にシート上に転記したり・操作したり、、一括でシート上に転記したり・操作したりができるため。
(05)VBAプログラミングの操作には、大きく分けて「値=一般データ=文字ベースのデータ」の操作と、「オブジェクト(Excelという工場で働くミニミニロボットたち)」の操作の2種類しかない。
※他の、例えば「オブジェクト指向の言語」と呼ばれるプログラミング言語も大抵そんな感じみたいです。
ただ、VBA自体は「オブジェクト指向もどき」であって、ちゃんとした「オブジェクト指向のプログラミング言語ではないそうです。
(06)値(一般データ)の操作の場合は、「一般変数」に生データを代入して操作します。オブジェクト操作の場合は、「オブジェクト変数」に生データを代入して操作します。
(07)「値(一般データ)の操作」の場合、生データは「文字ベース」のデータ。
「値」
=一般データ
=文字ベースのデータ
の「生データ」には、文字列、数値、日付データ、trueとfalseの2値=論理値、などがあります。
(08)「オブジェクト操作」の場合の「生データ」に相当するものは、「オブジェクト式」の、しかも「階層構造を省略してないヤツ」。
「オブジェクト」の場合は、一般データのような生データは無いが、「生データ」に相当するものがある。
それは「オブジェクト式」と呼ばれるもので、しかも「階層構造を省略してないヤツ」のことをさします。
(09)「階層構造を省略していないヤツ」、の意味とその「重要性」が分からないうちは、VBAのことを、100%、例外なく、理解できません。
逆にオブジェクトの階層構造のことを学ぶ気が無いなら、嫌味じゃなくてマジで、悪いことは言いませんので、VBAの勉強なんか今すぐにやめてください。
どこかの先生に有料レッスンを受けていたとしも、それでも100%、「上達しません」。
断言します。絶対に「応用がききません」。
エラーも全然・自力で解決できません。
ぜひ学生さんなどの安い外注先を見つけてください。
絶対にそのほうがコスパアップできます。「システム構築」で無ければ、安い学生さんでも十分やれます。
自分でやろうとしたところで、「あっちゅうま」に挫折して、レッスン料のみならず「大切な」「時間」を「ドブに捨てる」だけです。
さらに逆に、「絶対に中級以上になって習った分・独学した分のお金と時間を回収したる!」という意気込みのある方は、絶対にオブジェクトの階層構造の勉強をしてください。
以上は、(03)以降に書かれていることに対しては、「全て同じ」と理解してください。
(10)「オブジェクト=単一オブジェクト」、「コレクション=コレクションオブジェクト」という風に「敢えて意識して」分けて考える。特に、「オブジェクト=単一オブジェクト」という風に「単一」という言葉を付けて考えることが重要。Excelヘルプもそう書いているので。
なお、「オブジェクト=単一オブジェクト」も、「コレクション=コレクションオブジェクト」も、「同じフロアに居る同居人」というイメージで「親子関係は無い」と「あえて考えてしまう」ほうが、色々と都合がいい。(実際にはそうじゃなかったり、例外があったとしても、初心者のうちは、「ほとんどはそうだ、とあえて考えてしまう」、という意味です。より上達したら、もっと深く学んでいけばOKかと思います。そういう基礎を深く追求すると、思った以上に短期間にVBAが上達し、Web記事のほとんどがすらすら分かるようになります。)
(11)オブジェクトモデルの一覧図の重要性を理解している。意味がわかっていてオブジェクト式を書く時やヘルプを読む時に利用できる
(12)オブジェクトには「単一オブジェクト」と「コレクションオブジェクト」があるということを理解している。
(13)
(14)プロパティもメソッドもイベントも「特定のオブジェクト」に保持・所有・内包される、かつ、そのオブジェクトだけに紐ついている(=他のオブジェクトには使えない)「機能」あるいは「命令の一種」という理解ができていること。
(15)ヘルプが自力で読める
(16)オブジェクトブラウザの利用意義が分かる
ついでに、イミディエイトウィンドウ、ローカルウィンドウ、ウィッチ式、「TypeName関数+Parentプロパティ」、などの利用意義も。
(17)上位の単一オブジェクトを捕まえたり(取得・ゲットしたり)、下位のオブジェクトを捕まえたりができる。ヘルプやオブジェクトブラウザを使ってその方法を自力で調べられる
(18)Excel自身がおこなっている「マクロ」の定義と、その呼び出し方法(呼び出せる場面)を理解する
===============