★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0022:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-05。(エラー回避の基礎06)★★★超重要!!!! 「命令単語」だけでなく、コードの95%以上を占める「式」も、「返す・返る値やオブジェクトの内容・型」の3つでできている。
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0021
タイトル:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-05。(エラー回避の基礎06)
★★★超重要!!!! 「命令単語」だけでなく、コードの95%以上を占める「式」も、「返す・返る値やオブジェクトの内容・型」の3つでできている。
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
今回も前回の続きです。
前回のプログラムの、途中からお話させていただきます。
各種注意事項は前号と同じです。
あと、再度の繰り返しになりますが、
今号に書いてあるようなことを「自分のアタマで考えずに」すっ飛ばして、
「手抜き」「ラク」をしてしまうと、
永遠に「ヘルプとオブジェクトブラウザが読めないバカ」に成り下がってしまう確率が上がってしまう
です・・・。
なので、ご注意ください。
今回も、ウォッチウィンドウの「普通な使い方」です。
よろしくお願い致します。
では早速ですが、以下のコードをVBEの適当な標準モジュールにコピペしてみてください。
(プログラムを消してしまったかた、など。残してあるかたは不要です。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
' ' Sub test0002() Dim ttt As Object Dim ggg As Variant Debug.Print 100 * 40.2 Debug.Print 1 < 2 Debug.Print (1 < 2) = True Debug.Print 1 < 2 = True Debug.Print 1 > 2 Debug.Print (1 > 2) = True Debug.Print 1 > 2 = True Debug.Print 1 > 2 = False Debug.Print (1 > 2) = False Set ttt = ActiveWorkbook.Worksheets("Sheet1").Range("A1") ggg = ActiveSheet.UsedRange Stop End Sub ' ' |
で、イミディエイトウィンドウ、ローカルウィンドウ、ウォッチウィンドウを表示しておいてください。
では、今回も F8キーのステップ実行で1行ずつ実行してみます。
何回か、F8キーを押してください。
イミディエイトに、
1 2 3 4 5 6 7 8 9 10 11 12 13 |
' ' 4020 True True True False False False True True ' ' |
などと表示されたと思います。
で、
今回も、
「Set ttt = ActiveWorkbook.Worksheets("Sheet1").Range("A1")」
のところからですね。
その行が「黄色」くなるようにF8キーを繰り返し押してください。
========================
前回は、
(01)
ウォッチウィンドウを使うと、例えば「代入として」の「=」の右辺や左辺、特に、「右辺」・・・
つまり、
「変数に入れる側のモノ・代入する側のモノ」の、
「型や値が分かる」・・・、
ということをやりました。
「変数 = ××××× 」とか、
「Set オブジェクト変数 = ××××××××× など。
(02)
そして、だからこそ、変数の「型」を宣言するときには、
先に、ウォッチウィンドウに右辺の式全体を放りんでおけば、指定すべき「型」がわかる・・・、
(=その右辺の式全体の「型」と同じ型の変数を用意してあげればいい・・・、)
・・・ということも多い・・・・ということもやりました。
(03)
もちろん、「代入として」の「=」じゃなくても、「比較として」の「=」の場合でも、
その「右辺の式全体」が「返す」、「値や型」が分かることもやりました。
「If A = B Then ・・・・」の「B」の部分など。
もちろん、「A」 の部分も。
(04)
以上の事から、
「わからないこと」があれば、
「なんでもウォッチウィンドウに放り込む」「クセ」にすれば、
(すべてがすぐに分かるわけではないですが、でも、それでも)、
かなり色んな事が判明・判別できる・・・・ということが分かります。
(少なくとも、「4流以下の著者や編集者や教える気のないレジェンド」等々がテキトーに書いた「レベルの低い初心者向け市販書籍」の数十倍は確実で・明確で・迷いが減り・役に立ちます。)
更には、「ウォッチウィンドウに表示された答えの中でももし分からないことがあれば」、
「それもさらに、ウォッチウィンドウに追加」していい。
だからこそ、Q&Aサイトでの質問の答えのプログラムコード、Webや雑誌の記事のプログラムコード、書籍のサンプルのコード、などで、「わからないこと」が出たら、どんどんウォッチウィンドウに放り込んで調べればいい。
ということをやりました。
このとき、
オブジェクト式はもちろん、
「変数を含む」「式」
「関数やプロパティ、メソッドなどを含む」「式」
「リテラル値を含む」「式」
「演算子を含む」「式」
「どんな式」でも、ウォッチウィンドウに放り込みます。
(※ただし、メソッドを放り込みたいときは要注意!ファイルのバックアップを取ってから。詳しくは次号の終わりのほうで。)
区切りをどこにしていいかわからなかったら、
「区切りを変えたモノも放り込んで比較すれば」、
答えが分かる場合もあります。
とにかく、(すべての答えが出るわけではありませんが、でも、それでも)、
なんでもウォッチウィンドウに放り込めば、
いろいろと分かって、
「そのへんのレベルの低い著者や編集者が作った騙しまがい本
(あろうことか市販書籍に少なくないので質が悪いです)」よりも、
・よっぽどか学習効果が高いですし、
・何より「答えがはっきりしてる=明確です」し、
・だからこそ、当然、学習のコスパも上がります。良くなります。
▼ ちなみに、イミディエイトウィンドウに書かれた式も、青色選択してからドラッグするとウォッチウィンドウに放り込めます。
結局、ウィッチウィンドウで「分かること」とは、
・演算子(演算子を含む短い式)
・関数、
・プロパティ、
・メソッド
・リテラル値
・オブジェクト式
・変数
などが「返す、値やオブジェクトや、その型」
です。
そして、それらが複合的に含まれた・組み合わされた、「長い」・「式」においても、
同じことがわかります。
(関数などの各種命令単語やリテラル値だけでも「式」と認識されますし。)
・・・・ということは、
★ 「VBAとは」、
★ 「短い”命令単語”」だろうが「長い”式”」だろうが、
★ それらを合わせての「全体」として、
★ その「9.5割以上」が、
★ ・「返す」という動きをすることと、
★ ・「返ってくる値またはオブジェクトが何か?その内容」ということと、
★ ・「その返ってきたモノ」の「型」
★ の、
★ 「3つ」だけ、
★ で
★ 「できている」、
と考えても、「おおむね間違いではない」・・・・
と言えます。
もう少し言うと、
▼ 「VBAとは」、
▼ ・演算子(演算子を含む短い式)
▼ ・関数、
▼ ・プロパティ、
▼ ・メソッド
▼ ・リテラル値
▼ ・オブジェクト式
▼ ・変数
▼ といった 短い”命令単語”「だけ」が、「値またはオブジェクトを返す」わけじゃない!
▼ と考えてもおおむねOK!(特に初心者のうちは)ということです。
さらにもっと言うと・・・・、
◆ 「VBAとは」、
◆ 「”式”」も、「値またはオブジェクトを返す」。「短い命令語句と同じように。」です。
◆ そして、「値またはオブジェクトを返さない ”式 ”は」、
「100%」、「1っつも無い!!!」。です。
◆ 例えば「短い”命令単語”」はメソッド等の中で値やオブジェクトを返さないモノがあるけれど、
◆ 「”式”」の場合は、「値やオブジェクトを返さないモノ」は、「100%」、
「1っつも無い!!!」です。
◆ 何も「返ってこない」式や、「エラーや ”不正です ”のようになる」式は、
そもそも「式」の体をなしていません。
そもそも「式」として「成り立っていない」し、「間違っている」ので、何も返ってきません。
「式」として間違っていなければ、必ず、F8キーのステップ実行を最後までやることで、
「何かが ”返る ”」という動きになります。
◆ だから、VBAのコードのうち、その「9.5割以上」が、「返すという動きをする」と考えていい。
◆ 「ウィッチウィンドウ」は、その動きや返ってくる値やオブジェクトの内容や型のことが
(大体のところが)すぐにわかるので、だからこそ、
程度の低い著者や編集者たちが書いたテキトー・かつ・お茶を濁した説明の腐った市販書籍や
サイトよりも、よっぽどか「明確」で、「信頼性も高」く、「学習のコスパをアップ」します。
◆ なので、もし「F8キー実行」をひととおり最後までやっても何も返ってこなかった「式」や
エラーが出たり、「不正です」のように表示された式は、
「式ですらない」、「間違っている」、「間違った式」、なので、
「ああ、俺は(私は)いま、間違った式を書いているんだな・他に正解の式があるんだな」
「間違った文字列をドラッグしてウォッチウィンドウに放り込んでしまったんだな」と、
すぐに判断が付きます。
◆ と考えてもおおむねOK!(特に初心者のうちは)ということです。
※注01
演算子、VBA関数、WorksheetFunctionがらみの関数、プロパティ、(ある意味「列挙」に含まれる「定数」も?)、オブジェクト式、は、全部で1000を超える個数の命令たちですが、「もれなく」、「その1000個以上」、「全部」、が、何かを「返す」(=答えや加工値を出してくれる、オブジェクトをよこしてくれる)という動きをします。
ただ、「メソッド」だけは、「何も返さずに・他の何らかの動きをするだけ(メッセージを出すとか並べ替えをするとか、)」のモノも多いです。
メソッドは「オブジェクトごとに決められた、オブジェクト固有の動作」的な「命令」なので。
※注02
しかしながら先程、「9.5割以上が・・云々・・・」と書かせていただいたのは、ここでのウォッチウィンドウでのお話では、
「短い”命令単語”」だけじゃなくて、「長い”式”」も含めているからです。
確かに「短い”命令単語”」だけ、なら、メソッドのことがあるので、9割も無く、「7、8割」という表現になります。
ですが、そうではなくて、それに加えて「式」という部分まで含めてしまうと、それが理由で「無限大に近くなる」ので、それで「9.5割以上」と表現させていただきました。
そして、実際に「自分が現実に書くプログラムコード」の量としては、「メソッド単独」よりも「式」や関数やプロパティのほうが「圧倒的に書く量が多い」です。
ですので、その意味でも(=「現実の実際の記述量」に即してという意味でも)、本当に、「式も含めて」「9.5割以上」が、「返す」・「返ってくる値やオブジェクトが何か?」・「その型」の「3つのこと」、で「成り立っている」ということが、「非常ぉ~~~に!」「大きな意味を持ってくる!!!」と思います。
だからこそ、その「3つのこと」が「非常に重要」です。
そして、「実際に」「常に問われ」ます。
で、少し補足しますと(次号でこれからやることを先に書いてしまってすみませんが)、
◆ F8キー実行をして、「オブジェクト」を返す式の場合は、「+」マークを展開しても
「メソッド」は見ることができなくて、「一部のプロパティ」しか、
見ることができないけれども、
◆ でも、式としてのメソッド、あるいは、メソッドを含んだ式をウォッチウィンドウに
放り込むと
◆ その放り込んだ中に「値またはオブジェクトを返すメソッド」が含まれていれば、
ちゃんと、「値またはオブジェクトを返す」という動きをするので、
そして、返ってきたモノの「その内容(=答え)」や「型」がちゃんと分かるので、
◆ 「+」マークを展開した中にメソッドが見えなくても、何の心配も要らない。
です。
※「メソッド」の場合で、かつ、オブジェクトではなくて「値(文字系の一般データ)」が返るモノの場合、「Boolean型(TrueやFalse)」の値や「Double型」の値などが返ってくることが多いです。
Boolean(TrueやFalse)の場合は「成功/失敗」的な意味かもしれません。
よくわかりませんが・・・。
いずれにしても、それぞれのメソッドによって意味が違うと思うので、ご自分でも色々と調べてみてください。
オブジェクトブラウザで「a」で部分一致で検索をかけると たくさんのメソッドが出てきますので、「検索結果」のペインにて、メソッドのアイコンのところだけ「↑↓」の上下キーで、上下し、その、「説明ペイン」のところを見てみて、「AS ×××」となっているものを探します。
そして、その時に例えば
「AS Double」
「AS Boolean」
「AS String」
などになっているモノを見つけたら、その都度、F1キーでヘルプを見てみると色々とわかります。
ちなみに、オブジェクトが返ってくるモノは、
「AS Object」か、
「AS 固有オブジェクト型の名前(緑のHTMLリンク)」
と表示されます。
「AS Object」は、「複数のタイプのオブジェクトのうちのどれか1つの型が返るのだけど・特定はできない」、という意味です。
一方、
「AS 固有オブジェクト型の名前(緑のHTMLリンク)」は、
「この型のオブジェクトが必ず返る」と明確になっています。
で、さらに言うと、
▼ ・演算子(演算子を含む短い式)
▼ ・各種関数、
▼ ・プロパティ、
▼ ・メソッド
▼ は、
▼ 「値(文字系の一般データ)を返すだけの動きしかしない自作関数」と同じような動きのモノ
▼ 「値を返しつつ、同時に、何らかの動きや設定をもする自作関数」 〃
▼ 「オブジェクトを返すだけの動きしかしない自作関数 」 〃
▼ 「オブジェクトを返しつつ、同時に、何らかの動きや設定をもする自作関数」 〃
▼ 「何も返さず何らかの動きをするだけの自作関数(一部のメソッド/ステートメントのみ)」 〃
▼ の「どれか」にあてはまります。
▼ (※さらには「引数を持つ/持たない」という区分もありますが、それはここでは割愛して。)
▼ (「一部のステートメント」とは、
オブジェクトブラウザに掲載されたりするモノや(されなかったりもですが)、
「 ” 関数のような動きをするステートメント ” のうち、何も返さないモノ」、
のことです。
https://www.vba-ie.net/statement/index2.php#a1 も参照ください。
ステートメントには、このWebページの区分けとは別に、
「関数のような動き」をする、
「関数的」なステートメントと、
「制御フローやその他の制御的な動き」をする、
「非関数的」なステートメント
・・・・という区分けもできます。
なのでちょっとややこしいのですが・・・
前者は、Mid、Sendkeys、Put、Get、ChDir、MkDir、Kill、FileCopy、などで、
後者は、Sub、Function、Set、Do、Loop、If~Then~Else、With、などです。
ちなみに、VBA関数にはオブジェクトブラウザには載ってない関数もあります。
Tab関数やDate関数など。)
▼ なので逆に言うと、その5つのタイプ関数が「思い通りに」自作できるようになると、
▼ ・演算子(演算子を含む短い式)
▼ ・各種関数、
▼ ・プロパティ、
▼ ・メソッド
▼ と
▼ ・「式」
▼ ・オブジェクトの階層構造
▼ ・ウォッチ/イミディエイト/ローカルウィンドウ
▼ ・オブジェクトブラウザやヘルプなど
▼ の理解が、ある地点(学習して1年後くらい)から「爆発的に進み」、
▼ それに伴って、「VBAの爆発的な上達」を実現する確率が上がります。
★ そして、その理解の助けの「スタート地点・原点」、が、
★ 「VBAの命令語句や式を合わせたその95%以上」は、
★ ・「返す」という動きをすることと、
★ ・「返ってくる値またはオブジェクトが何か?その内容」ということと、
★ ・「その返ってきたモノ」の「型」
★ の、
★ 「3つ」、
★ で
★ 「できている」・・・・、
★ ということです。
※より細かい自作関数の分類については、Vol0003のバックナンバーもご参照ください。
・・・・ということは、
「VBAとは」、
「値や各種命令や式」が「返す」、
その「値やオブジェクトや、その型」さえ分かれば、
また、それを間違えずに「リレーできさえすれば」
「なんとかなる」
ということでもあります。
人によっては(繰り返しになりますが)
「ある地点から(学び始めて1年後、などの)」
「突然」
「爆発的に」
「成長する」
その「きっかけ」
になったりもします。
逆に、
「返す・返さない」の意味や、
「値やオブジェクトや、その型」の意味が
「分からなければ」、
「リレーできる能力が無ければ」
「リレーできるように学習を進めなければ」、
「リレーの状態が常に頭の中に描かれていなければ」、
「どんだけお金を払って習っても」、
「★ なんともならん」、
「★ やるだけムダ」、
「★ 時間のムダ」、
です。
なので、
例えば「型なんて覚えなくてもいい」などという
「腐ったたわごとを平気で書く」ような、
「4流以下のVBA講師どもや編集者どもにいいようにカモられるだけ」
か
「すごく近い将来」
「100%挫折する」
か、
あるいは、
「初心者本を終えた後の次の目標を見失って」
「次の段階が”急に超難しく”感じ」
「挫折する」
か、
もしくは、
「初心者本を終えただけの自分」
には
「結局何も、”自力で組み立てられない”」
「Q&Aサイトでどれだけ質問しても回答が理解できない」
と気づき、
「呆然と立ちつくすだけ」
になります。
そうなるのが
「火を見るよりも」
「あきらか」
ということになります。
そんなことなら・・・
つまり、
「3つのことを」を掘り下げるつもりも、物理的な時間も、やる気もないなら、
「ただなんとなくで目的も持たずにやるなら」、
最初から「ExcelVBAなんてやらずに」・・・・、
「★ 安い外注先に外注するほうが」、
「エラーと戦わずに済むので」
「そのぶん」
「よっぽど現実的」
です。
特に、「色んな ”コスパ”を考えたら」。
「Excelがあればタダで作れる、なんて、全部応ウソ!」です。
「Accessや他のシステム関連のソフト買う数万が消えるだけで、つくる時間の人件費、エラー解決の人件費、はメッチャかかります。数十万、百万越え!!それって本当にタダと言える?」
「それらを全部、営業時間外にサービス残業でやらせるブラック職場なら確かにタダですけど。」
「そもそもExcelは例えばデータベース的なシステムのような”みんなが使うプログラム”を作るのには、 ”クソ” みたいに、無駄コストがメッチャかかる。データべースソフトなら数分か数秒でできることが数時間も数日もかかるし、コードの量も数倍から数十倍。無駄だらけ。」
「Excelは、”自分が使うだけのプログラム”以外は、”コスパが異常に悪くなる ”」。
「Excelがあればなんでもタダで作れるだなんて、”コスパ意識ゼロ”の、”無責任なバカ”が言うこと」、
です。
結局、
「そもそも返すのか返さないのか?」
「返すなら何が返ってくるのか?」
「その返ってきたモノ」の「型」
の
「3つのこと」
を深く掘り下げねば、
「つくる時間の人件費、エラー解決の人件費、はメッチャかかります。数十万、百万越え!!」
という部分のお金が、さらに、
「無駄に」、
「多く」、
「かかる」、
「垂れ流す」、
ようになります。
ウォッチウィンドウでは、主に以下のようなことが分かります。
(01)「そもそも返すのか返さないのか?」
→「何かを返す/返さない、の2つしかなく、
「ほとんど」の、
「1000個を超える、短い”命令単語”」と
「それらを組み合わせた、ちょっと長めの”式”」が
「返す!!!」という
動きをします。
つまり、「命令文の9.5割以上のほとん」が「何かを」「返します」。
「返さないモノはメソッドのなかの2/3くらい」です。
「返さない(=返す以外の他の別の動きしかしない)」ほうが、プログラムコードの中ではめずらしい・・・と言ってもあながち間違いではないというくらい、
「ほとんどの命令単語や式が」、
「何かを返します」。
(02)「もし返すなら何が返ってくるのか?」
→「大別すると値(文字ベースの一般データ)かオブジェクトか」の「2つしか」ありません。
(03)「その返ってきたモノ」の「型」
→「大別すると、値(文字ベースの一般データ)用の型か、オブジェクト用の型の2つしか」ありません。
少し具体的に説明すると、
値用(文字データ用)の型には、文字列型、数値型、日付型、論理型?(Boolean型)などがあり、
オブジェクト用の型には、
・総称オブジェクト型(Object型 ひとつだけ)と、
・固有オブジェクト型(Workbook型、Workboosk型、Worksheet型、Worksheets型、Chart型、Charts型、Range型、Interior型、Font型、などなど、超たくさん。Excelだけでも250個くらい。)
があります。
そして値系とオブジェクト系の両方の「全部」に対応できる「超汎用型」ともいうべき、
「Variant型(要注意)」というものもあります。
この3つは本当に重要です。
もう一つの武器、「オブジェクトブラウザ」や
さらにも一つの武器「、「ヘルプ」でも、
この3つをまず最初に調べます。
すると、後の作業もラクになりますし、何より、エラーがかなり減ります。
※もちろん、この3つ以外にも、オブジェクトの階層や、一部のプロパティ項目の現在値なども分かります。
このことを指摘しないのは、
「Excelが出た20年前」
から
「ずっと」
「変わっておらず」、
で、
「改善もされていない」
「講師たちは教えてこなかった、今も教えようともしない」
(カモりたいだけとしか思えない)
です。
また話がそれてしまいました 。
すみません。
でも、そうならないように、
「そのヘンの腐った市販書籍やサイト」よりも、
ぜひ、
「ウォッチウィンドウ」の活用法、
を学んでください。
ぜひ、ウィッチウィンドウを、
「色々なことを調べるため」の「秘密兵器」として、使ってみてください。
また、前置きがが長くなってしまいまいした。
前置きと言うよりか、「横道逸れ」ですね。
でも重要な横道なので、何度も同じことを言ってしまってウザくてすみませんが、それも読んで、不明点は先生やご同僚にお聞きください。
で、
「Set ttt = ActiveWorkbook.Worksheets("Sheet1").Range("A1")」
ですが、
今、この式が黄色になっていて、「実行直前」の状態になっていますでしょうか?
すでに間違って実行してしまったら、また最初からF8キーでの実行で、そこまで進んでください。
で、以下の4つをドラッグしてウォッチウィンドウに放り込んでください。
ActiveWorkbook
ActiveWorkbook.Worksheets
ActiveWorkbook.Worksheets("Sheet1")
ActiveWorkbook.Worksheets("Sheet1").Range("A1")
で、それに加えて、
ActiveWorkbook.Worksheets.Item("Sheet1")
という式も加えてみて下さい。
これは
ActiveWorkbook.Worksheets("Sheet1")
と同じ意味・・・・
というよりも、実は、
ActiveWorkbook.Worksheets("Sheet1")
は
ActiveWorkbook.Worksheets.Item("Sheet1")
の省略形で
本来は
ActiveWorkbook.Worksheets.Item("Sheet1")
と書くほうが正しいのですが、
なのですが、両者が内容的に本当に同じなのかどうかをどこかで見て確認してみたいと思います。
今回は前置き(話逸れ)が長くなってしまいましたので、ここまでとさせてください。
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
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
----------------------------------------------------------------------