★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0020:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-03。(エラー回避の基礎04)
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0020
タイトル:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-03。(エラー回避の基礎04)
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
今回も前回の続きです。
小数の誤差の回避ではなくて、
「一般的に、普通にウォッチウィンドウを使う使い方。~式の型や値を調べる方法」
の続き3回目、となります。
よろしくお願い致します。
あと、前号で訂正があります。
【誤】
『 プログラムが1行も実行されていなくても 』、
『 ウォッチウィンドウに並べたほぼすべての式(=変数などは除く)について 』
(=「知りたいこと」について)
『 値や型が、わかります。』
↓
【正】
『 プログラムが1行も実行されていなくても 』、
『 ウォッチウィンドウに並べた多くの式(=変数などは除く)について 』
(=「知りたいこと」について)
『 値や型が、わかります。』
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01-19
※このWebページでCtrl+Fして、
「多くの式」で検索してみて下さい。
訂正した箇所に飛びます。
「ほぼすべての式」というのを、「多くの式」に直しました。
変数を含む式だと、すぐには内容が判明しないので、そのことを少し考慮しました。
ご迷惑をおかけして大変申し訳ございませんでした。
バックナンバーも訂正しました。
では、以降、本文です。
よろしくお願い致します。
*************
*************
前回のプログラムの、途中からお話させていただきます。
各種注意事項は前号と同じです。
あと、再度の繰り返しになりますが、
今号に書いてあるようなことを「自分のアタマで考えずに」すっ飛ばして、
「手抜き」「ラク」をしてしまうと、
永遠に「ヘルプとオブジェクトブラウザが読めないバカ」に成り下がってしまう確率が上がってしまう
です・・・。
なので、ご注意ください。
今回も、ウォッチウィンドウの「普通な使い方」です。
よろしくお願い致します。
では早速ですが、以下のコードを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行ずつ実行してみます。
「Debug.Print 1 > 2」の行のところまで、何回か、F8キーを押してください。
イミディエイトに、
4020
True
True
True
False
などと表示されたと思います。
で、
今回は、
「Debug.Print 1 > 2」
を実行したあとからです。
(「Debug.Print (1 > 2) = True」の行が黄色くなった状態です。)
が、その前に・・・
前回、ウォッチウィンドウに式を追加するときに、
「追加したい式や値をドラッグで青色選択して」
「そのままそれををウォッチウィンドウにドラッグしてしまえばOK!」
とお話ししましたが、そのことの続きを、先にお話ししておきます。
といいますのは、
ウォッチウィンドウに式を追加するには、ドラッグのほかに、もうひとつ、「右クリック」での追加方法があります。
今回はそのことを少しお話します。
例えば「1 > 2」をドラッグで青色選択した場合、それを右クリックして「ウォッチ式の追加」メニューをクリックします。
すると、小さなダイアログボックスが出てきます。
ここで、OKボタンを押せば、ドラッグした時と同様、特に何の設定もなくウォッチウィンドウに式が追加されます。
なお、このダイアログは、ウォッチウィンドウに追加されたあとも表示可能です。
まず、ウォッチウィンドウのなかで、ダイアログを表示したい式の行をクリックして、行全体を青くします。「型」や「対象」の列を押せば行全体を青くできます。
その後、右クリックして「ウォッチ式の編集」を押します。
で、このダイアログですが、すぐにOKボタンを押さずに、設定を変えてからOKすることもできます。
「ウォッチの種類」というところの「中断」の設定です。
その場合は以下のような動きになります。
(A)「式のウォッチ」
特に何も設定しない場合はこれです。
プログラムの中断はされません。
(B)「式がTrueのときに中断」
ウォッチウィンドウの中で、この設定をした式が「True」の場合、ブレークポイントを設定しなくても自動的に中断モードになります。
(※ブレークポイントとは、「プログラムを(バグ潰しやチェックの目的で)強制的に中断させたいとき、どの行で中断させるかのその行のこと」です。ブレーク=break=中断、の意味。)
ただしこの場合、
『 ウォッチウィンドウに追加した式の行までは実行される 』
というわけでもなく、
『 何も実行されずに、かつ、プロシージャ名が黄色くなっただけの段階でいきなり止まり 』
ます。
なので、メリットかどうかはわかりませんが、いちおう、そのままF8キーのステップイン実行ができます。
設定を(A)に戻すと、止まらなくなります。(中断されません)
また、式そのものをウォッチウィンドウから削除した場合も、止まらなくなります。(中断されません)
この(B)の設定は、ブレークポイントを設定することなく、常に、F8キーで実行したいときに使えるかもしれません。
Falseの時は止まらないので、「止まらない=おかしい」という判断はできます。
が、実際には僕にはどんなケースが有効かはちょっとわかりません。
F8キーを使いたいなら、最初からF8キーを使えばいいだけなので・・・・。
あるいは、「Stop」という1行をどこかに書くと同じ事ができますので・・・・。
※ただ、でもきっと、何か、役に立つことがあると思います。
(C)「式がTrueのときに中断」
例えば以下のようなプログラムを書いていた時に、
Dim i As Integer
Dim sss As Integer
For i = 1 To 10
sss = i
Next
「sss」をウィッチウィンドウに右クリックで追加しようとして、その際にその設定を、この「式がTrueのときに中断」にしておくと、Forのループで1回ループするごとに、プログラムが中断されます。
ただこれも、たとえばForのループの中にブレークポイントを設定するか、「Stop」という1行を書けば同じことができるので、この設定がどう役立つかは僕にはまだわかりません。
でもきっと、何か、役に立つことがあると思います。
※「プロシージャ」と「モジュール」は、同じ式や変数、生データなどが別のプロシージャにもあったとき、切替するだけで設定変更できるのでそういうときに便利です。
・・・というわけで、
今回は、特に何の設定もしませんが、いちおう
「そういうことができる」
ということだけでも覚えておいてください。
思わぬところで活きてくることもあるかもしれません。
では、前回の、
「1 > 2」
の意味の復習です。
これは、
「1は2よりも大きい」
ということを言っています。
そんなことはありえないので、これは「ブブー!(ちがうよ!)」となります。
なので
「1 > 2」が返してくれる答えは
「False」です。
「>」という演算子が計算をして、Falseを返してくれます。
では今回の「Debug.Print (1 > 2) = True」です。
F8キーを押してのステップ実行で、「Debug.Print (1 > 2) = True」の行が黄色くなったら、一時停止のままにしておいてください。
「(1 > 2) = True」
を、ドラッグして青くし、それをそのままウォッチウィンドウに放り込んでください。
以下のようになったと思います。
「式」:(1 > 2) = True
「値」:False
「型」:Boolean(=TrueとFalseの論理値の2値)
「(1 > 2) = True」は、
(「 1 > 2 = True」と同様に)、
「1は2よりも大きいっていうことは、合ってますよ!”ピンポーン”です!」
(=「1が2よりも大きい」という理屈自体が正しい)
(=「1が2よりも大きい」というのは正しいです!」)
ということを言っています。
カッコの中は先に計算(評価)されますので。
でもカッコの中の
「1は2よりも大きい」
なんてことはあるわけがないので、
「1は2よりも大きいっていうことは、合ってますよ!”ピンポーン”です!」
なんてことも当然、あるはずが、ありません。
なので、ウォッチウィンドウにも表示されている通り、
「(1 > 2) = True」は、「False」となります。
もう少し細かいこと言うと
「>」という演算子が計算をしてくれて、
(1 > 2) を→Falseと返してくれます。
となりますと
(1 > 2) = True
と書かれている場合、
その (1 > 2) の部分を「False」に置き換えてもいい・・・・、という風に見えます。
そう思いませんか?
ですので、実際にそのように置き換えてみます。
すると
False = True
ということになってしまいます。
このとき、
False = True
は、
「ブブーとピンポーン!は等しい・同じ」ということを言っています。
そんなことはありえるわけないので、当然、
False = True
全体としては「ブブー!間違ってるよ!」=「False」となります。
★ ちなみにですが(一応証拠・証明として)、実際にイミディエイトウィンドウで
? False = True
と書いてEnterしてみてください。
False
と返ってきます。
? True = True や
? False = False
なら、
True
と返ってきます。
★「=」という演算子が、計算(式を評価)をしてくれて、TrueかFalseを返してくれています。
(というか、「=」という演算子によって、Excelか何かに式が評価され、Excelか何かがTrueかFalseを返してくれている。。。ということかもしれません。詳しくはプロの人に聞いてください。)
さらにちなみに、ですが、
VBAではFalseとTrueを数値に置き換えることができます。
Falseは「0」で、
Trueは「-1」です。
イミディエイトウィンドウでテストしても以下のようになりますので、間違いないと思います。
? False = 0 → True
? True = -1 → True
? False = -1 → False
? True = 0 → False
? False = 6 → False (テキトーな数字でテスト)
? True = 8 → False (同上)
ということは・・・・、
False = False
は、
0 = 0
ということを言っているのと同じです。
これだと、「False = False」という感じで、「False」と「False」がイコールで結んであっても、それが「 0 = 0 」と数字に置き換わっているので、なんとなく分かりやすいですよね。
ゼロとゼロは 当然、「イコール」なわけですから。
結果、「False」と「False」は、「=(イコール)なんだ!」、
ということが、なんとなく理解できると思います。
逆に、
False = True
は、
0 = -1
ということを言っているのと同じです。
これも、「False = True」がイコールで結んであっても、数字に置き換わっているので、「そんなことあるわけない!」って、なんとなく分かりやすいですよね。
繰り返しになってすみませんが・・・、
「False」と「True」は、それぞれ「0」と「-1」に置き換えられるんだから、
「0」と「-1」が「=(イコール)なわけない!」、ですし、もし逆に、
「0」と「-1」を「=で結んだとしたら・それはウソ!偽!ブブー!間違い!・だ!!」、
ということも、なんとなく理解できると思います。
このようなことも是非、知っておいてください。
VBAにとって、「最重要事項」のひとつである、「 ”返す ”ということの意味」の理解に役立つと思います。
話しが少しそれました。
すみません。
(でも、重要なことなので是非覚えておいてください。)
話をもとに戻します。
で、今はまだ
「Debug.Print (1 > 2) = True」は
実行される直前ですので、これからこれをF8で実行すると、
この事前にウォッチウィンドウで判明している「False」が、
イミディエイトウィンドウに表示されます。
では、F8キーで、「Debug.Print (1 > 2) = True」を実行してみてください。
False
と出てきたと思います。
で、次は
「Debug.Print 1 > 2 = True」
です。
これは意味的にはさきほどやった、
「(1 > 2) = True」
と同じです。
「1 > 2 = True」をドラッグしてウォッチウィンドウに放り込むと、そこには「False」と出ています。
実行すると、そのウォッチウィンドウの「False」が、イミディエイトウィンドウに表示されます。
ご確認してみてください。
では、次は
「Debug.Print 1 > 2 = False」
です。
「1 > 2 = False」をドラッグして青くして、それをウォッチウィンドウに放り込んでみてください。
これは
「1 > 2 = False」
ですから、
「1は2よりも大きいというのは間違いです!」ということを言っています。
これは正しいので
ウォッチウィンドウの「値」の列にも、「True(ピンポーン!)」と出ています。
で、
「Debug.Print 1 > 2 = False」
を実行すると、すでにウォッチウィンドウに表示されている「True」が、
イミディエイトウィンドウに表示されます。
************
ところで、
「1 > 2 = False」
の
「1 > 2」にはカッコが付いていないのですが、
これは実は、
「1 > 2」が
「= False」よりも、先に計算(評価)されています。
カッコがついていないのに、なぜ「1 > 2」が先に計算(=評価)されたのか不思議に思いませんでしたでしょうか?
Debug.Print (1 < 2) = True
Debug.Print 1 < 2 = True
や、
Debug.Print (1 > 2) = True
Debug.Print 1 > 2 = True
についても同じですよね。
ただ、これについては、小学校などでも、
「カッコの中は先にやる」みたいに習ったので、
なんとなくわかりますよね?
ではもう少し詳しく(?)説明したいと思いますので、
Debug.Print (1 < 2) = True
Debug.Print 1 < 2 = True
で見てみましょう。(「詳しく」とおもったのが、かえってわかりにくくなってしまったらごめんなさい!)
まず
(1 < 2) = True
は、
カッコがあるのでわかりやすいですね。
カッコの中の「(1 < 2)」を先に計算します。
で、その結果に「 = True 」を付けて、再度計算(評価)します。
「(1 < 2)」という式が返してくれる結果は「True」ですから、
「True=True」ということですね。
では
1 < 2 = True
は?
この場合は、
「比較演算子(「>」や「<」や「=」など)は、比較演算子の中では優先順位無し。=全部同じ優先順位!」というルールがあらかじめ決まっています。
これは、「先に書かれたものから順番に計算(=評価)されていきます。」という意味です。
つまり、左から右へ、順番に評価されていきます。
たとえば
1 < 2 = True
という式では、
「<」の次に「=」が書かれていますので、
(「=」の先に「<」が書かれていますので、)
「<」のほうが先に計算(評価)されます。
つまり、
1 < 2
が先に計算され、
その結果と、「 = True 」が、再度計算(評価)されます。
「1 < 2」という式が返してくれる結果は「True」ですから、
これも「True=True」となりますよね。
結局、この場合は式が短いので、
たまたまですが、
カッコが無くても
(1 < 2) = True
と同じ計算順序(優先順位)になりました。
だから、結果、
(1 < 2) = True も
1 < 2 = True も、
「同じ」、
ということで「OK」となります。
ただこの場合は、短い式なので「たまたま」、「カッコをつけてもとっても同じ結果」でしたが、
長い式や、別のケースだと「カッコがある・なし」、で色々と「意味が変わってしまう」可能性がありますので、注意が必要です。
ここで、遅くなってすみませんでしたが、「演算子」の「優先順位」というものをご紹介します。
ここには、
「最初に算術演算子が評価され、次に比較演算子が評価され、論理演算子が最後に評価されます。」
と書いてあります。
なので、各グループごととしてはその順番で計算されるととらえて良いと思います。
で、算術演算子のグループと、論理演算子のグループでは、上から順番に優先的に計算されます。
つまり、例えば算術演算子のグループなら、
「+や-」が、
「*や/」よりも
先に(左側に)書いてあっても、
後に(右側に)書いてあっても、
優先順位を確認すると、「*や/」のほうが上に書いてあるので、
実際の計算は「*や/」が「先に行われる」・・・、
ということになります。
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/operator-precedence
には、色々と書いてありますので、一応、すべてチェックしておいたほうがいいと思います。
解説しなければならないほど、難しいルールではないと思いますが、初心者の方には以下の2つが意味不明かもしれませんね。(Like とIs)
Like 演算子は、優先順位がすべての比較演算子と同じですが、実際にはパターン マッチング演算子です。
Is 演算子はオブジェクト参照比較演算子です。 この演算子は、オブジェクトやその値を比較するわけではなく、2 つのオブジェクト参照が同じオブジェクトを指しているかどうかを調べるだけです。
これはわかる方に何回でも聞いてみてください。
「文字列連結 (&)」と「Is」と「Like」は、それぞれ、
「1つだけで、1つの演算子グループ」のようです。
グループ分けして書くのがめんどくさかったのか
それとも、
ただ単に書面の幅が足らなかったのかわかりませんが、
「1個だけなので」、
「優先順位の位置的に問題ない場所に書いてしまいました!」
的な感じで書かれているだけのようです。
(というか、優先順位的に言うと、そこに書くしかなかった、ということだと思います。)
では最後に、
「Debug.Print (1 > 2) = False」
の実行ですね。
これはもう説明は要らないかと思います。
これも
「 1は2よりも大きいというのは間違いです!」ということを言っています。
それは正しいので
ウォッチウィンドウの「値」の列にも、「True(ピンポーン!)」と出ています。
で、
「Debug.Print (1 > 2) = False」
を実行すると、すでにウォッチウィンドウに表示されている「True」が、
イミディエイトウィンドウに表示されます。
==============================
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
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
----------------------------------------------------------------------