★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0024:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-07。(エラー回避の基礎08)★超重要!!!! オブジェクトブラウザやヘルプで、『 メソッドの戻り値(返ってくるモノ)を調べる 』ときの注意事項
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0024
タイトル:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-07。(エラー回避の基礎08)
★超重要!!!! オブジェクトブラウザやヘルプで、『 メソッドの戻り値(返ってくるモノ)を調べる 』ときの注意事項
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
今回も前回の続きです。
が・・・・
またまたやってしまいました!
ごめんなさい!
今回も訂正です!
今回も重要箇所なので、1回分にしてしまいました。
どうかお読みになってください。
前回の分で、以下のように書いた部分があります。
*************
※注
オブジェクトブラウザの「説明ペイン(一番下の区画)」において、その中に書かれたモノについて、「カッコの外側」に「AS ×××」と表示されていない場合は、プロパティであろうがメソッドであろうが、「戻り値は無い」、と判断するのが、いちおう、原則になっています。
実際に、オブジェクトブラウザで確認するとわかりますが、メソッドは基本的には、説明ペインにて、カッコの外側に「AS ×××」と表示されている場合も決して少なくはないですが、でも、『 表示されない場合 のほうが多い 』です。(これは、プロパティであろうがメソッドであろうが、です。)
メソッドの場合、半分以上は「AS ×××」と表示されない場合だと思います。
つまり、「値やオブジェクトを返さないものが多い」、ということです。
*************
これが「半分」「間違いだ」と判明しましたので、また、すごく重要な部分だ、ということもわかりましたので、訂正させていただきます。
で、新しい訂正分は以降からです。
(上記リンクのhttps://euc-access-excel-db.com/00000WPIMG/2020-10-05---15-53-56.jpgの図も、内容を描き換えました。正しくは以下です。)
どうか、ご自分でもウォッチウィンドウで色々と確認しながら、読んでみてください。
ただし、重要なファイルで確認しないでください。
特に、今回は「メソッド」の話ですが、メソッドを安易にウィッチウィンドウに追加すると、ファイルの中身をグッチャグチャにしてしまう恐れがあります。
必ず、何もない、空っぽのファイルでお試しください。
===============
★超重要!!!! オブジェクトブラウザやヘルプで、『 メソッドの戻り値(返ってくるモノ)を調べる 』ときの注意事項
オブジェクトブラウザの「説明ペイン(一番下の区画)」において、その中に書かれたモノについて、「カッコの外側」に「AS ×××」と表示されていない場合は、プロパティであろうがメソッドであろうが、「戻り値は無い」、と判断するのが、いちおう、「原則・基本」になっています。
(逆に、「カッコの外側」に「AS ×××」と表示されている場合は、「戻り値が在る」と判断するのが、これまた、いちおうの「原則・基本」になっています。)
実際に、オブジェクトブラウザで確認するとわかりますが、メソッドの場合は基本的には、説明ペインにて、『 「AS ×××」と表示されない場合 のほうが多い 』です。
カッコの外側に「AS ×××」と表示されている場合も決して少なくはないですが、でも、どちらかというと『 表示されない場合 のほうが多い 』です。
メソッドの場合、半分以上は「AS ×××」と表示されないと思います。
ただし、これはあくまでも「原則」でして、実際には、「AS ×××」と表示されていないにも関わらず、戻り値が「ある」モノが「意外と存在します」。
逆に言うと、説明ペインに「As ×××」が表示されないからと言って、「メソッドは値やオブジェクトを返さないものが多い」「ということには必ずしもならない・そうは言い切れない・・・・、ということです。
例えば・・・、(メソッドに限らず・基本的に、ですが)・・・
「Variant型の値が返ってくるモノ」
「配列で返ってくるモノ」
「引数次第・引数の型が変わったら返ってくる値の型も変化する…という感じのモノ」
など、
「何かしらの理由で1つの型に特定できないモノ」
は、
戻り値が「ある」のに、「説明ペインには表示されない」ようです。
また、そういうのとは別に、無条件に戻り値があったり、キャンセルしたときや成功/失敗などをしたときに「TrueやFalse」という値が戻ってくる・変化する・・・ということも少なくないようです。(もちろん、オブジェクトブラウザの説明ペインに「As ×××」と表示されないのに、です。)
※ただし、「オブジェクトを返すメソッドやプロパティ」の場合に限っては、固有のオブジェクト型(WorksheetとかChartとか)に明確に固定できない場合は、「表示されない」のではなくて、「As Object」という表示がなされます。「何も表示されない」ということは多分少ないように思いますし、「オブジェクト」が「複数返ってくる」とか「配列で返ってくる」とかは、恐らくですが、無いように思います。(でも未確認なので安易には信用しないでください。)ただ、GetObject関数やCreateObject関数のように、メソッドやプロパティではない場合は、「何も表示されない」「けどオブジェクトが返ってくる」ということがあります。
しかし、この「実は・戻り値がある」ということ自体が、オブジェクトブラウザの説明ペインだけではなく、「ヘルプにすらも書かれていないメソッド」が意外と少なくないです。(実際にウォッチウィンドウで調べてみると「多い」と感じる方もいらっしゃるかもしれません。)
なので、「本当に戻り値があるのか無いのか?」はウォッチウィンドウで、でしか、分かりません。
(これを教えてくれる本やサイトが本当に無いです。(あるのかもしれませんが・・・僕は検索にヒットしたことがありません。)
少しまとめますと・・・、オブジェクトブラウザの説明ペインで「As ×××」と明確に表示されるのは、
「何かしらの一般データやオブジェクトが返ってくるモノのうち、
その中でも、返ってくる一般データやオブジェクトの型が、
「1つに、明確に、固定されている場合」のみ。
特定できない場合は、何かが返ってはくるけれども、
でも、「As ×××」とは表示されない。
(ただし、オブジェクトの場合は、特定できない場合は、
「As Object」と表示されることも多い)」
ということが言えると思います。
(このことは、「インテリセンス機能(入力候補機能)」が使える/使えない、にも関係してくると思います。多分・・・。)
結果、やはり、ウォッチウィンドウが操作できて、「意味が読める」ことは、「とても」「重要」です。
一例として・・・例えば、
Worksheet.Move
Worksheet.Unprotect
Worksheet.Protect
Worksheet.PrintPreview
などのメソッドを考えてみます。
これらのメソッドは、オブジェクトブラウザの説明ペインには「AS ×××」と書かれて出てきません。
ヘルプにも「戻り値」の説明がありません。
でも、実際には「True」や「False」という値が返ってきます。
なので、例えばこの中の、Worksheet.Moveの場合を考えてみます。
普通、Worksheet.Moveメソッドは 「変数宣言なんかせずに」・・・・
Worksheets("sheet1").Move after:=Worksheets("sheet2")
・・・・みたいな感じで書いて、そう書いたように動かすことがほとんどだと思いますが、
「実は戻り値が在る」
ため、 ・・・・(※「絶対に・一切・無い」と誤解されている)
「関数・メソッド・プロパティでは、戻り値を受け取る場合は引数の部分をカッコで囲む」
という
「VBAの決まり」
を適用して、
以下のように書くこともできます。
Dim Answ01 As Variant
Answ01 = Worksheets("sheet1").Move(after:=Worksheets("sheet2"))
(※この場合、事前に、戻り値を受け取るための変数の宣言が必要になります。ここではAnsw01がその役目をする変数となります。)
この場合、このコードを実行すると、
Excelの通常画面の側では、「Sheet1」が「Sheet2」の後ろに移動しつつ、
同時に、
変数「Answ01」の中に、「アンタの命令通りやったよ~」みたいな意味合い?かどうかはわかりませんが、とにかくそんな感じで、「True」が格納されます。
つまり、Worksheet.Moveメソッドの本来の動作をさせながら、同時に、返ってきた「True」を変数に受け取ることで・・・、
「ホントにMoveがちゃんと実行されたかを、” 明確に” 把握する」とか、
「どの時点でMoveが実行されたかを、” 明確に” 把握する」とか、
「そのように 明確に把握して、プログラムのなかの条件分岐のブロックの条件式に使う」
ということも、できないでもない・・・
・・・ということになります。
で、このときなんですが・・・・・、
戻り値を受け取らないコードを書いて・・・・、つまり、変数宣言をせずに、
Worksheets("sheet1").Move after:=Worksheets("sheet2")
とだけを書いて、これをそっくりそのまま、ウォッチウィンドウにドラッグすると
「ウォッチ式が不正です」
とエラーが出て、式の追加自体すらができません。
なので、そこで、早合点して、
「あ!Worksheet.Moveメソッドは戻り値は無いんだ!」と誤解してしまいがち(=騙されてしまいがち)です。(何を隠そう、僕自身が「昨日まで」そうでした。)
なんですが、
実は、
それは「間違い」で、
戻り値を受け取るコードを書いて・・・・、つまり、変数宣言もして、引数にカッコもつけて、
Dim Answ01 As Variant
Answ01 = Worksheets("sheet1").Move(after:=Worksheets("sheet2"))
と書いて、これの右辺の
Worksheets("sheet1").Move(after:=Worksheets("sheet2"))
をウォッチウィンドウにドラッグすると、
その場合は、
「エラーにならずにウォッチウィンドウに式を追加できます」。
(その際「対象範囲外」と出ます。)
ただ、F8キーを最初に押した時点で、いきなりそれが実行されてしまいますが・・・。
もちろん、True も返ります。
(もちろんですが、ウォッチウィンドウに式を追加しなければ、
そのメソッドを含む行に たどり着くまでは、何も実行されません。)
・・・というわけで、
、「メソッドは戻り値が無いモノが多い」と錯覚してしまいがちですが、あるいは、そう「決めつけ」てしまいがちですが、
「実はそうじゃない」
ということなので、これも是非、覚えておいてほしいです。
というか、僕自身、今回自分で調べてみるまで、分かってませんでした。(恥)(^^)
ウソ情報ばっかりで、大変、申し訳ございませんでした。m( _ _ )m m( _ _ )m m( _ _ )m
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★
★「自分はもちろん、市販書籍やWebも疑って」、
★
★「地道にウォッチウィンドウで調べることが大切」
★
★ ということがよく分かります。
★
★ ある程度名の通った市販書籍やWebサイトであっても、
★
★ もしそこに「このメソッドは戻り値はありません」と書かれていたとしても、
★
★ 実はそれは「ウソ」で(たまたま記述ミスを直してなくて)、
★
★ 実際にウォッチウィンドウで調べると、戻り値がある、場合もある・・・、
★
★ ということです。
★
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
なお、このWorksheet.Moveメソッドの結果を変数に受け取るコードが実用できるかどうかわかりません。
が、でも、Move以外の、他のメソッドにおいてもそうなんですが、このように「戻り値を何かの条件分岐に使えるケース」もあるかもしれませんので、「無意味ではない」と思います。
今回のようなことは、
・「人間にとっては」「微々たる差」であっても、
・逆にコンピュータにとっては「致命的な」「大きな差」ですので、
・つまり、「エラーの温床になりえます」から、
それを減らすことにも少なからず貢献すると思います。
そういう風に、何かに使えるかも?と考えることも、とても大切なことだと思います。
少なくとも、エラーの解決(デバッグなど)をするときには、知っておいて良い事・知ってなきゃいけないこと、だと思います。
何も知らなければ解決に3日かかってしまうエラーが、5分で解決できるかもしれません。
最後に、
式をウォッチウィンドウにドラッグした時点に
「このメソッドは戻り値(返ってくるモノ)があるのか/無いのか?」
あるいは、
「この式は戻り値(返ってくるモノ)があるのか/無いのか?」
「この式をここで短く区切って調べた場合、戻り値があるのか/無いのか?」
「この式をここまで長く付け足して調べた場合、戻り値があるのか/無いのか?」
をさっと判断(予測)するには、以下のように判断(予測)します。
・ウォッチウィンドウにドラッグしたとき(かつ、まだ、F8キーが全く押されていない時点・状態で)、
・「ウォッチ式が不正です」とエラーが出て追加すらできないか、
・追加はできたけど、「値」の列に「ウォッチ式が不正です」と表示されたメソッドについては、
・「何も戻り値が無い」と考えて良いようです。
それに対して、
・エラーが出ずにちゃんとウォッチウィンドウに追加でき、
・「値」の列に「対象範囲外」と出るメソッドについては、
・「何らかの戻り値があるかも?」と考えて良いようです。
(ただ、絶対、ではないかも?例外あるかも?です。未検証です。)
そのように判断・予測します。
なお、メソッドの場合、返ってくるモノで多いのはTrueやFalseです。
Falseはメソッドの動作をキャンセルしたときや失敗したとき、Trueは実行できたとき、などに返ってくるようです。
あとEmpty値が返ってくるメソッドもあります。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★
★ ただし、「メソッド」や「メソッドが含まれた式」をウォッチウィンドウに
★ ドラッグする際は、本当に注意が必要です。
★
★ 必ずファイルのバックアップを取ってから、行なってください。
★ (あるいは、別の新しいブックで試してください。)
★
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
理由は、
『 そのメソッドとまったく関係無いコードであっても、とにかくコードを1行実行する度に、ウォッチウィンドウに追加したメソッドが何度も実行されてしまうから 』、
です。
削除系や移動系などのメソッドをウォッチウィンドウに入れると、実際にそれが書かれたコードにたどり着く前に、その削除系や移動系のメソッドが、「F8キーを押す度に・毎回」実行されてしまいます。
例えば「引数無しでも動くメソッド」の調査などで、それをウォッチウィンドウに追加していると、データやグラフなどがグッチャグッチャになって、ファイルがぶっ壊れる(開けはするけど、内容が破壊される)ことがあります。
充分にご注意ください。
メソッドをウォッチウィンドウに追加する場合は、必ず事前にバックアップを取ってから、してください。
「オブジェクトを返すだけで何も動かない」、そういうタイプのメソッドの場合は、大丈夫ですけど・・・
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
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
----------------------------------------------------------------------