★★★★★★★★★★★★★★★★Access2000VBA・Excel2000VBA独学~★超重要!!オブジェクトブラウザの使用目的・使用意義~
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
目次
(01)どのオブジェクトにどんなプロパティやメソッド、イベントなどが含まれているかを一覧し、その一覧から、ヘルプをすぐに呼び出す。
(02)あるオブジェクトの「下位のオブジェクトには何があるか」を調べることができます。また、「値やオブジェクトが返ってくるのかこないのか?」「返ってくるならどんな型の何が返ってくるのか?」を調べることができます。
(03)イミディエイトウィンドウでのTypeName関数+Parentプロパティ・あるいはローカルウィンドウとともに、「上位のオブジェクトそのメンバーには何があるか」を調べることで、階層構造やその他の事の理解をより深めることができる。
(04)同名のプロパティやメソッドの親オブジェクトに別のものがないか?間違ってないか?を調べることができます。
(05)プロパティやメソッドが何を返してくれるのかを調べる。
(06)「コレクション」には何があるかを一覧表示させる。
(07)TypeName関数+Parentプロパティや、TypeName関数オンリーでオブジェクトの型を調べながらオブジェクトブラウザ併用すると、階層構造がより明確になったり、その他のことがわかったり、「気付き」をくれる。
(08)何に「参照設定」がONにしてあるかがわやりやすい。し、その本体ファイルもわかる。(DLLやOCX、EXEなど)どのファイルに格納されているオブジェクトやプロパティ・メソッド・イベントかもわかる。
(09)Excel固有のオブジェクトか、Office共通のオブジェクトか、ADOのものなのか、DAOのものなのか、などがヘルプよりも明確にわかりやすい。
(10)階層構造一覧図と併用することで、より、オブジェクトへの理解が深まる
※Shift+TABキー、もしくは、Homeキー、Homeキー+TAB数回、を押すと、目次付近に戻れます。
★ オブジェクトブラウザの使用目的・使用意義
(01)どのオブジェクトにどんなプロパティやメソッド、イベントなどが含まれているかを一覧し、その一覧から、ヘルプをすぐに呼び出す。
階層構造のイメージ補助などに役立ちます。
(02)あるオブジェクトの「下位のオブジェクトには何があるか」を調べることができます。また、「値やオブジェクトが返ってくるのかこないのか?」「返ってくるならどんな型の何が返ってくるのか?」を調べることができます。
右側の「メンバー」のペインで、↓↑キーで行き来すると、「AS ×××」と出るプロパティやメソッドのうち、「×××」のところがグリーンの下線リンクになっているものは、そのほとんどが、「1階層下位のオブジェクトを取得できるプロパティやメソッド」か「列挙(Enum)」などだとわかります。(中には上位のものを取得できたり、上位下位とは関係のないもの・・・でもオブジェクトを取得できるものもあります。)
そこから、「下位のオブジェクトには何があるか」が、完全ではないものの、おおむね、わかります。(グリーンの太文字リンクには列挙などもあるので)
「AS ×××」と出ないものに関してはそれが「メソッド」の場合は、ヘルプを読まないとわからないときがあるので、F1キーを押してヘルプをくまなく読み、「返ってくる値やオブジェクトがあるのかどうか?」や「もし返ってくるならどんな型が何なのか?」などを調べます。(例えば後述の「Inputbox」など。また、「値」には「列挙(定数の集まり)」も含まれます。)
ヘルプのオブジェクトメンバーの一覧でもなんとなくわかりますが、こちらで↓↑キーで行き来すると、明確で結構わかりやすいです。ヘルプの「オブジェクトメンバー」の一覧と併用するのがいいと思います。
ヘルプの「オブジェクトメンバー」の一覧と併用すると、「何ができるか」もわかり、より、色んな理解が深まります。
基本、「メンバー」のペインを、↓↑キーで行き来すると、
「値やオブジェクトが返ってくるのかこないのか?」と
「返ってくるならどんな型の何が返ってくるのか?」も、
「まず最初に調べる・知る」ことができます。
それをする・それができることが、VBA上達はもちろん、「エラー回避」の早道です。
というか、基本です。
「AS ×××」が説明ペインに無かったら、F1でヘルプを見て、返ってくるモノがあるかないかや、あるならどんな型かを調べます。
たとえば「Inputbox」なら、「AS ×××」が説明ペインに出ないので、F1でヘルプを読むと、「Type : バリアント型 (Variant) : 返されるデータの型を指定します。この引数を省略すると、ダイアログ ボックスは文字列 (テキスト) を返します。 」と出てきます。
これは、もし返る値のデータ型を何も指定しなければ、例えば数字が返ってきてもそれは「文字列型」の数字で、「計算のできない」もの、です。
「数値」ではなく「数字」です。
なのでこのとき、その「単なる数字」を「計算のできる」「数値だ」と「勘違い・思い込み・決めつけ」をしていると、エラーを起こすことがあります。Variant型に代入しても「文字列」に内部変換されますし。(VBAは文字列型のデータでも、場合によっては計算ができてしまうことがあるのでタチが悪いです。Variant型という型が「隠れみの」になってしまうので。その場合、エラーの原因がさらに掴みづらいからタチが悪いです。)
そういうことを、オブジェクトブラウザやヘルプを使うことで、「返る値の型」を調べられるので、回避できる、場合もある、というわけです。
「Msgbox」なら、「As VbMsgBoxResult」と、グリーンの太文字で出るので、そこを押してリンク先に飛ぶと説明ペインに「Enum ×××」と出るので、「ああ、オブジェクトじゃなくて列挙が返ってくるんだな」とわかります。
そしてそのリンク先のメンバのペインで「vbAbort」をクリックすると、説明ペインに「Const vbAbort = 3」と出るので、「ああ、一般データのうちの数値側のデータが定数として返ってくるんだな」ということがわかります。
「vbAbort は 3 という数値 なんだ」ということもわかります。
「vbAbort」で完全一致で検索すれば、出てきますので。
また、返ってくるモノが(下位か上位かはたまた別のものかはすぐにはヘルプを読まないとわかりませんが、)「とにかくオブジェクトだ」ということが分かれば、それを「オブジェクト変数に代入できる」ということも確実となります。
「返ってくるモノが」、「オブジェクトかどうかだけをまずはチェックしたい」という時にもスピーディに検索してチェックできます。
また、そもそも「返ってくるものがある・ない」がわからないと、プログラムを書いても「エラー」になることが多いです。
そしてさらにそもそもですが、「返ってくる」とか、「返り値(=戻り値)」、の意味・感覚が分からなかったら、本当に良くない言い方ですみませんが、「もう本当に目もあてられません」みたいなことになってしまいます。
「今現状以上は」「何ひとつとして・理解できない・・・・」という状況に陥ってしまいます。
なので、プロパティやメソッド、各種関数、誰かの作った関数、(ひいては演算子なども)、といった「言わば命令たち」を扱うときは、まず最初に「そもそも返ってくるモノがあるのかないのか?」「で、もし、返ってくるとするなら、それは値(一般文字系データ)なのかそれともオブジェクトなのか?」をチェックする必要があります。
特に「メソッドと各種の関数」、あと、もしかしたら「演算子」も??。
(思いもよらないものが返ってくることがあるので。=エラーの原因・誘発剤が返ってくることがあるので。)
もちろん、「プロパティも」、ですが・・・。
その後、「返ってくるなら何が返ってくるのか?」をチェックしておきます。(これも、思いもよらないものが返ってくることがあるので。=エラーの原因・誘発剤が返ってくることがあるので。)
そして、VBAだけではないと思うんですが、プログラミングはどんな言語であっても、『 変数や生オブジェクトの「型」と「型」をつないでいく・・・ リレーしていく・・・・間違えないように・・・』、という場面・作業が多いです。
言い換えると、「各種の命令から返ってくるモノ」の「型」が明確にわかっていないと、「正しく間違わずに横道に逸れずに ” 型 ” をつないでいく・リレーしていく」ということが「できなくなる」ため、これまたエラーの原因になります。
これも「メソッドメソッドと組み込み関数、プロパティも」、「同様」です。
それらを最初に教えてくれない講師や市販書籍が多すぎるので、「エラーが出てからでいいよ」みたいな、超いい加減な教え方ばっかりになってしまい、結果、私たち初心者・独学者は、逆に、エラーが出てから右往左往することになってしまいます。
さらには、エラーの解決方法がわかりません。
「型がおかしいからエラーになっている」ということにすら気づけなかったり、気づけても・どう対処したらいいかの「あたりすらつけられない」という状況に追い込まれてしまいます。
また、Webのサンプルコードも当然、「チンプンカンプン」で「読めません」。
Q&Aサイトで回答してもらったVBAコードも、同様です。
聞いたはいいけど、「チンプンカンプン」で「読めません」。
繰り返しますが、VBAに限らず、どんなプログラム言語でも、変数の「型」と「型」を常に同じにして「繋いでいく=リレーしていく」という側面があります。
そこから逸脱すれば当然エラーになります。
そして、『 変数の「型」と「型」を常に同じにして「繋いでいく=リレーしていく」という作業 』から、「もし」「逃げた」とすれば、「それはもはやプログラミングではない」、とも言えるとも思います。
正直言いますと、こんな低レベルなことを書かないといけないのは、数あるプログラミング言語の中で、ExcelVBA教育業界だけだと思います。(「変数の型宣言なんか全部Variantでいい」というメチャクチャな講師・書籍が、他のプログラミング言語の講師さんや書籍よりも多すぎるので。)
真剣に考えてくださいよ?
変数の型の使い分け「すら」をする意欲「すら」ない人=そんなレベルのことすら拒否する人=文章の読めない人・文章を読みたくない人が、
のちのち、中級になど上がれると思いますか?
のちのち、自分の思うプログラムが書けると思いますか?
のちのち、エラーが自力で解決できるようになると思いますか?
甘やかすのもいいかげんにしたほうが初心者のためではないですか?
避けて通れないものは避けて通れないんですよ?
なら、初心者にもすぐにわかるように、講師や著者ががんばる・準備を怠らない・「以外」、ないんじゃないですか?
講師や著者が「初心者の方がたにちゃんと寄り添う」「以外」ないんじゃないですか?
もちろん、初心者本を書いたとしても、そこで、「本書の中だけです。ややこしくなるから変数を全部Variant型にしてしまったり、Rangeから書き始めたりしますが、これはサンプル用限定の書き方ですから、本番では絶対にやらないでください。また、本書を学習後は、必ず、オブジェクト変数の学習と値やオブジェクトを返す自作関数の学習はかならずおこなってください。」と但し書きを絶対に書くべきです。
そういうことを、是非、今一度、考え直してほしいと思います。
教える側も習う側も。
(03)イミディエイトウィンドウでのTypeName関数+Parentプロパティ・あるいはローカルウィンドウとともに、「上位のオブジェクトそのメンバーには何があるか」を調べることで、階層構造やその他の事の理解をより深めることができる。
(04)同名のプロパティやメソッドの親オブジェクトに別のものがないか?間違ってないか?を調べることができます。
例えばですが、ExcelVBAには、同名のプロパティやメソッドがあります。
特に、同名のプロパティが多いでしょうか?
でも、同名のプロパティやメソッド等は、「親オブジェクト」が変わると、まったく意味の違うものになることがあります。
例えば
「Worksheet.Range プロパティ」
「Shapes.Range プロパティ」
「Range.Range プロパティ」
などです。
同じ「Range プロパティ」でも、それぞれ、まったく意味合いが異なります。
また、意味合い的に似ていたとしても、「似ているだけでまったく同じではない」ので、「名前が同じなんだから・使い方もまったく同じだろう」と勝手に「決めつけている」と、エラーに見舞われます。
そして、「決めつけている」がゆえに、ヘルプを読もうともしないため、エラーが解決できません。
結果、本来は『 ヘルプやオブジェクトブラウザが読めれば数分で解決するエラー 』なのに、3日も4日も悩む羽目になってしまいます。
また、ヘルプを検索した時に、プロパティ名やメソッド名で検索すると、親オブジェクトが自分の目的と違うモノが、検索結果の先頭にヒットしてしまうことがあります。
そのようなとき、先に、オブジェクトブラウザで親オブジェクトを(自分の目的と合致するかどうか)確認しておいてから、F1キーでヘルプを表示すると、スムーズに調べられることが多いです。
というわけで、
「同名のプロパティやメソッドの親オブジェクトに別のものがないか?」を調べことができると、たとえば・・・、
▼ 今操作しているプロパティ等が本当に今の自分の目的に合っているものか?
▼ 「同じ名前だから使い方も同じ」と勝手に決めつけてしまい、
使い方が間違っていないか?
▼ 「省略された書き方の場合」に落とし穴(エラーが誤動作の原因)がないか?
(オブジェクト式その他)
・・・等々を調べることできます。
(05)プロパティやメソッドが何を返してくれるのかを調べる。
返ってくるものがオブジェクトならオブジェクト変数に代入できます。
「返ってくるものがオブジェクトかどうか?」は、説明ペインで「AS ×××」を見ればわかります。
「×××」の部分がグリーンの下線リンクになっていれば、「オブジェクトか列挙(定数の集まり)などが返ってくる」と判断できます。
それがオブジェクトか列挙か?を判断するには、その下線リンクをクリックして、クリックした直後の説明ペインを見ます。
「Class ×××・・・・」で始まっていれば「オブジェクト」で、
「Enum ×××・・・・」で始まっていれば「列挙(定数の集まり)」です。
また、「AS ×××」にて、「×××」の部分がリンクの下線がない普通の文字なら、「文字ベースのデータ(数値、文字列、日付など)が返ってくる」と判断できます。
※列挙(Enum)に含まれる「定数」は、数値や「vb××××」の形で返ってきます。「文字ベースのデータの仲間」と思って頂いてOKです。
基本、「返ってくるものがどんなタイプ(型)のデータか?」がわかれば、エラーの原因調査にも使えることが多いです。
ヘルプもF1キーですぐに連動起動できるので、詳細調査にもいいです。(特に2010以前のヘルプ)
なので、エラーが出たら、オブジェクトブラウザやヘルプで「かえってくる値やオブジェクトがあるのかどうか?」「もしあるなら、それがどんな型の何なのか?」をまず最初にチェックします。(「値」には「列挙(定数の集まり)」も含まれます。)
それからでないと、エラーの原因をひとつひとつ潰していけません。
ひどいと、
オブジェクトブラウザやヘルプで調べれば3分で解決するエラーを、
「Webなんかで調べる必要なんてまるでないのに」いちいちWeb検索・・・。
検索にヒットした内容も基本がわかってなければ意味が分からないのにWeb検索・・・。
そしてさらに迷い、さらにドツボにはまってしまい、
挙句の果てに、3分で解決できるエラーなのに、最悪、3日も、4日も、時にはQ&Aで聞く羽目になってしまう・・・
という「ムダ」をおかして、悩む羽目になってしまいます。
(もちろん、僕自身も経験してきたことです。本当に書籍著者の教え方がいい加減なので苦労しました。)
(06)「コレクション」には何があるかを一覧表示させる。
「Item」で「完全に一致する単語だけを検索」すると、コレクションがずらずらっと出てきます。「Item」にはプロパティとメソッドがあります。
「Item」がプロパティなのかメソッドなのかを知りたいときがもしあれば、便利です。
あと、プロパティだとばかり思っていたものが、実はメソッドだった、というのも、たまに、オブジェクトブラウザで気づくこともあります。例えば「Worksheet.PivotTables メソッド」。
てっきりプロパティかと思ってたら、実はメソッドだった・・・みたいな。
こういうことも、エラーに関係することが「無いではない」ので注意が必要です。
もちろんヘルプにも書いてあるわけなんですが、「プロパティ」と「思い込んでしまっている」ため「ヘルプを探そうともせず」、結果、ヘルプからは気づきにくいです。
(07)TypeName関数+Parentプロパティや、TypeName関数オンリーでオブジェクトの型を調べながらオブジェクトブラウザ併用すると、階層構造がより明確になったり、その他のことがわかったり、「気付き」をくれる。
これは「イミディエイトウィンドウ」でのことです。
しかも、
「それが意外と」
「小さくない」。
です。
ひいてはその結果、色んな知識・学びとが合わされば、例えば、雑誌記事やWeb記事、市販書籍、が「いいかげんなことを書いている」とか、「この講師いい加減すぎる」「お前みたいないい加減なヤツがそうやってテキトーなこと書くから、僕ら学習者が本来せんでもいいミスをさせられるんだろ?いいかげんにしろ!」ということも、だんだんと判断が付くようになります。
(09)Excel固有のオブジェクトか、Office共通のオブジェクトか、ADOのものなのか、DAOのものなのか、などがヘルプよりも明確にわかりやすい。
(10)階層構造一覧図と併用することで、より、オブジェクトへの理解が深まる