★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0018:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-01。(エラー回避の基礎02)
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0018
タイトル:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-01。(エラー回避の基礎02)
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
前回、「小数計算ミスをしないようにするために」という目的で、ウォッチウィンドウの使い方を少しやりました。
今回以降は、「ついで」と言っては何ですが、「小数計算ミスをしないようにするために」という目的ではなくて、「一般的に、普通に使う使い方」を少しご紹介したいと思います。
・・・・と、その前にひとつ補足説明したいことがあります。
前号や前々号以前でのローカルウィンドウやウォッチウィンドウの話で、
『 Variant型の変数に何らかの値を入れたとき、「Excel様が勝手にテキトーなデータ型に内部変換しやがる」 』
というようなことを書きました。
(Excel側からすると「” 最適な型 ”に変換してやってるんだ!」ということらしいです)
前号や前々号以前では、
「ローカルウィンドウ」や「ウォッチウィンドウ」にて、
F8キーでのステップ実行を使って、
その勝手に内部変換されたデータの「型」を、「目で確認」したわけですが、
ただそれは、一応、「関数」でも調べられます。
「ローカルウィンドウ」や「ウォッチウィンドウ」じゃなくても。
関数で調べると、If文(Ifステートメント)での条件分岐の、その「条件基準」に、変数の「型」を「基準」とすることができます。
つまり例えば、
「もしVariant型変数の中身の値が、Long型に勝手に内部変換されていたら・・・」
とか
「もしVariant型変数の中身の値が、Double型に勝手に内部変換されていたら・・・」
と
いったような条件分岐のプログラムが作れる・・・・・ということになります。
(あまり使わないかもしれませんが)
ただ、条件分岐には使わなくても、イミディエイトで使ったり、色々な場面でチェックに使ったりできるかもしれません。
で、そのようなことができる関数ですが、「VarType 関数」という関数です。
詳しくは
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/vartype-function
や
https://excel-ubara.com/excelvba8/EXCELVBA885.html
などを読んで、サンプルコードを実行してみてください。
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/vartype-function
のほうは、
サンプルプログラムの「MyCheck = 」を「Debug.Print 」に置換してから実行するとわかりやすくなると思います。
あと別件ですが、関連する「注意事項」も、ついでにご紹介しておきます。
https://excel-ubara.com/excelvba8/EXCELVBA885.html にも書いてありますが、
セルの値が整数値のとき(例えば1とか2とか)のとき、そのセルの値をVariant型の変数に代入すると、Excelはそれを「Integer型」や「Long型」ではなく「Double型(倍精度浮動小数点型)」として勝手に内部変換します。
これはInteger型の例えば正の限界値(32,767)や、Long型の例えば正の限界値 (2,147,483,647)を超えてもDouble型のままです。
調べてみましたら、9999億9999万9999 でもDouble型のままでした。
これは例えば、
Dim MyAry2 As Variant
MyAry2 = Range("A1:B1")
みたいな感じで、
「セル範囲の値をVariant型の2次元配列に代入」しても、
各要素1つ1つは、Double型のままでした。
「セルの値はもう全部Double型で処理する」という決まりになっているのかもしれません。
良く分かりませんが。
それで問題ない(計算誤差などが出ない)場合はそれでもいいのですが、
逆にそれだとまずい場合(計算ミスなどが出る場合)や
「起こるはずのない事が起こるのがExcelなので、それはいけないので、事前に対処しておきたい」というような場合は、
・「Integer型やLong型に強制変換する」か、というよりも、
・「最初からVariantなんて使わずに、Integer型やLong型で変数宣言をする」
ということにしたほうがトラブルが少なさそうで良さようです。
そんな感じで、Variant型の安易な使用はやはり避けたほうが良さそうです。
特に「変数なんか全部Variant型でいい」という利用方法はやはり避けたほうがいいです。
前置きが長くなってしまってすみません。
補足は以上です。
これ以降、本題に入ります。
*************
*************
ここから本題です。
今号は図が無いのですみません。
また、ウォッチウィンドウの操作とは関係ない、「短いコードのひとつひとつの内容・意味」、についても並行して解説していきます。
それは、「演算子」や「オブジェクト」などについてです。
ウォッチウィンドウの操作とは関係のないことをゴチャゴチャと書きますが、でも、
「市販書籍やWebにはあまり書かれていない」、「★ 全部・重要なこと」、なので、
どうか読んでみてください。
特に初心者の方や「ヘルプとオブジェクトブラウザが読めないかた」には読んでほしいです。
ウザかったら読みたいところだけ読んで、あとから、飛ばしたところを読んでみてください。
でも、必ず、飛ばしたところはあとで読んでください。
理由は、今号に書いてあるようなことを「自分のアタマで考えずに」すっ飛ばして、「手抜き」「ラク」をしてしまうと、永遠に「ヘルプとオブジェクトブラウザが読めないバカ」に成り下がってしまう確率が上がってしまうからです・・・。
今回は、比較演算子(のほんの一部)の解説が多いので、ウォッチウィンドウの「普通な使い方」は次号かそのまた次の号になるかもしれません。
長いです。
すみませんが、よろしくお願い致します。
では早速ですが、以下のコードを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 100 * 40.2」の実行です。
イミディエイトウィンドウに「4020」と表示されます。
次に、「Debug.Print 1 < 2」です。 これは 「1 < 2」という「式」が「返してくるモノ」・・・ つまり、 「1 < 2」の「答え」を、 イミディエイトウィンドウに表示しろ・・・ という命令になります。
このとき、「 < 」 は、「比較演算子」と呼ばれるものの一つなのですが、その「答え(=戻り値)」は「TrueかFalse」のどちらかです。 「TrueやFalse」は、両方を合わせて、 「Bool値」とか、 「論理値」とか、 の呼び方をされます。 参考↓ https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/data-types/boolean-data-type https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/boolean-data-type
ここでさらにF8キーを押して
「Debug.Print 1 < 2」 を実行してみます。 イミディエイトウィンドウに True と返ってきます。
なぜ比較演算子を使ったときの答え(=戻り値)が「TrueかFalse」のどちらかになるのか?
については、マイクロソフトが勝手に決めたことです。
ですので、私たちエンドユーザーがそれを勝手に変えることはできません。
ただ、多くのプログラミング言語で、比較演算子の計算結果は、「TrueかFalse」のどちらかになっていると思います。パソコン自体がそう決めているのかもしれません。
よくわかりませんが。
たとえば「Python」という今流行り?のプログラミング言語ならこんな感じです。
(「=」の使い方などが少し異なりますが、おおむね同じです。)
↓
https://www.javadrive.jp/python/if/index4.html
で、ここで「超」重要なのは・・・・、
書籍やWebではあまり(こういうメチャクチャな)解説はされませんが、
「比較演算子」は、「プロパティやメソッド、VBA関数、ワークシート関数などと同じ」ように、
「戻り値」を
「持つ」
ということです。
「戻り値」とは、
つまり、
=「返すモノ」
=「返す値」
=「答え」
=「計算結果」
=「演算結果」
という意味です。
これはつまり、「比較演算子」の場合は、「TrueかFalseのどちらか」のことです。
巷ではそのように解説されることは「無い」のですが
(メチャクチャ過ぎるから)、
でもそう考えると(むしろそう考えたほうが)
「VBAの命令たちは」、
「その命令の種類の垣根を越えて」、
「そのほとんど」が、
「戻り値」と呼ばれるモノを持っている、
と、
「頭の中を整理」することができる、
ので、
「考え方がラクになる」
と思います。
もし「そんな考え方はダメだ!」とかたくなに言われてしまったら、そのときはじめて、考え直せばいいと思います。
言ってきた人に「どう理解したら?」と聞けばいいだけです。
「自分で考えろ!」と言われてしまったら、しばらくは無視するか、ご自分のペースでゆっくり調べればいいと思います。
その人がそう強く言うだけのデメリットは、現実にはそうそうはありません。
(むしろ、メリットのほうが多いです。)
また、「比較演算子」は、これまた「プロパティやメソッド、VBA関数、ワークシート関数などと同じ」ように、
「引数」に相当するモノ、も持ちます。
これも、このように考えることが「超」重要だと思います。
例えばここでの「1 < 2」での例なら、 「1」や「2」などの実際の生データがそれに相当します。 (これらが「何かの値が代入された変数」で表現されることもあります。)
「比較演算子」に限らず、「演算子」には、
「引数」と呼ばれるモノが「明確に」存在するわけじゃあありませんが、
でも、「それに相当するデータ」は「存在する」と考えてしまって差し支えありません。
実際そう考えると、さきほど、
「比較演算子」は、「プロパティやメソッド、VBA関数、ワークシート関数などと同じ」ように、「戻り値」を持つ
と述べたのと同じように、
「比較演算子」は、「プロパティやメソッド、VBA関数、ワークシート関数などと同じ」ように、
「引数に相当するモノも持つ」
となり、
ひいては(ちょっと飛躍しすぎかもしれませんが)、
「比較演算子」だけにとどまらず、
「各種の演算子」は、
「プロパティやメソッド、VBA関数、ワークシート関数などと同じ」ように、
「戻り値」も「引数に相当するモノも持つ!」
ということにもなります。
結果、
演算子も、
プロパティも、
メソッドも、
VBA関数も、
ワークシート関数も、
「戻り値」や、
「引数」(またはそれに相当するモノ)を
持っている・・・
という点で、
「同じような仕組みで動いている」と言える・・・
そう仮定しても大きな問題はないと言える・・・
と思います。
同時に、「演算子」は、
「1文字しかない」けれど、
「ただの記号のようにしか見えないけれど」
でもそれでも、
「やってること」は、
「動き」は、
「プロパティやメソッド、VBA関数、ワークシート関数など」と
「同じなんだ!」
とも言えると思います。
で、これをもっと短く言うと、
「演算子」は、
「記号めいた、関数のようなもの・・・・」
「記号めいた、メソッドのようなもの・・・・」
と言っても差し支えないと思います。
★ただし、スゴク重要な注意点ですが、
演算子が「どんな」「データ型」の結果(=答え)を返してくるかは、
「使った演算子」
「引数に相当するモノ」
「(Excelが勝手に決めてしまう)引数に相当するモノ、あるいは答え、のデータの型」
「引数に相当するモノに、” 値の代入された変数 ” を使ったなら、その型」
等々によって「変わってしまう!」
ので、
そこはローカルウィンドウやウォッチウィンドウなどで調べる必要性が出てくることもあります。
(特にエラーや誤作動が出たときは。)
これも、「そんな考え方はダメだ!」とかたくなに言われてしまったら、そのときはじめて、考え直せばいいと思います。
でも、ヘルプやオブジェクトブラウザを扱うには、プロパティやメソッド、VBA関数などとともに、そのようにまとめて考えてしまったほうが、あとあとラクになる場面が増えると思います。
なお、演算子場合の「引数」に相当するモノとしては、
「1つの値だけの場合」もあれば、
「その演算子の前に書かれた計算の式の場合」など、
複数のケースがあります。
例えばここでの例だと「1」や「2」のことですが、
例えばその例とは違って、つまり比較演算子ではなくて、
例えば算術演算子の「+」の場合を考えてみます。
例えば
「10+100+200」と書いたとき、
1つ目の「+」「だけ」について見てみると、その引数的なモノは、
「10」と「100」になると思いますが、
2つ目の「+」「だけ」について見てみると、その引数的なモノは、
「10+100」と「200」になると思います。
そういう意味です。
またもや脱線しました。
ごめんなさい。
では次に、「Debug.Print (1 < 2) = True」という命令の実行です。
実行するとイミディエイトウィンドウに「True」という答えが返ってきます。
早速疑問だと思うのですが、これは先ほどの
「Debug.Print 1 < 2」と何が違うのでしょうか?
結論から言いますと(少しわかりにくいかもしれませんが)
「Debug.Print 1 < 2」の場合は、
「1よりも2のほうが大きい」という計算(= ”1よりも2のほうが大きい ”という理屈・論理)が
正しいかどうかを算出して、
その結果を「TrueかFalse」で、
イミディエイトウィンドウに表示せよ!
みたいな意味になりますが、
「Debug.Print (1 < 2) = True」の場合は、
「 ”1よりも2のほうが大きい ” という計算・理屈・論理は 正しい!・あってる!OK!ピンポーン!」
「という、そのこと全体について」、
「それが本当かどうか?」を算出して、
その結果を「TrueかFalse」で、
イミディエイトウィンドウに表示せよ!
という意味になります。
わかりますでしょうか?
ちょっと意味合いが異なってきますよね?
「1 < 2」の場合は、
「1 < 2」という
「その理屈・論理」「だけ」が「そもそも正しいかどうか?」
「だけ」を聞いていますが、
「 (1 < 2) = True」の場合は、
「1 < 2」という「その理屈・論理」が、
「正しい」と「言いたい(イコールしたい)」わけなんだが、
「それ自体が正しいか?どうか?」
ということを聞いています。
もう少し違う言い方をすると、
「1 < 2」ということについて、
「その理屈・論理は正しい!間違いない!」と「言い切っちゃってること自体」について、
「それ本当に正しい?」
と聞いているのです。
この場合は、
「1よりも2は大きい!」という理屈は、「正しい」ので、
「合ってるよ!」
ということで、「True」が返ってきます。
ちなみに
「 (1 < 2) = False」
は、どうでしょうか?
これは、
「(1 < 2) は正しくない!」という理屈・論理について、それ全体が本当に正しいかどうかを述べよ!、
という意味の式になります。
でも実際には「(1 < 2) 」は「正しい(合ってる=ピンポーン!)」なので、
「(1 < 2) は正しくない!」という意味で、「 (1 < 2) = False」と書いたとすると、
その主張(理屈・論理)については、「そりゃ違うでしょ!?」となって、
「False」が返ってきます。
イミディエイトで
「? (1 = 2) = True」
「? (1 <= 2) = True」
「? (1 > 2) = True」
などもやってみるといいかもしれませんね。
とはいうものの、
最初のうちは、色々とごっちゃになってしまって、なかなか理解しずらいかもしれませんね。
こういう場合は、いろんな式を自分で作ってみて、
イミディエイトウィンドウ、ローカルウィンドウ、ウォッチウィンドウを使って、
何度も何度も実験(ドリル)を繰り返す必要があります。
反復練習あるのみです。
(思い込みで、これはこうだろう、とタカをくくっていると、Excelの勝手な振る舞いによってそうはならないことも少なくない=Excel騙される、こともあるので、必ず、イミディエイトウィンドウ、ローカルウィンドウ、ウォッチウィンドウを使って、「型」のところを目で見て確認するという、反復練習をします。)
どうでもいいような「小さな差」に思うかもしれませんが、
もし「本当に」そう思うなら、
即刻、
プログラミングをやめたほうがいい
です。
どうでもいいような「小さな差」に思うかもしれませんが、
その、どうでもいいような「小さな差」で、
「エラーになったり」、「誤作動を引き起こす」のが
「プログラム」
「Excel」
「コンピュータ」
なので、
それを受け入れる覚悟・余裕がないのなら、最初からプログラミングはやめておいたほうがいいです。
いつまでたってもWeb検索ばっかりで、エラー解決が自力でできないからです。
エラー解決が自力でできないなら「時間のムダ」です。
特に「プログラミング兼務の営業さんや事務員さん」にとっては、「時間の無駄」「本業の邪魔」に間違いなくなってしまいます。
ちなみにですが、
イミディエイトウィンドウ、ローカルウィンドウ、ウォッチウィンドウは、
そのような
「見つけにくい」
「小さな」
「差」
を
「できるだけ」
「ラクに」
「速く」
「探す」
ための機能です。
なので、「操作の習得が必須」、となってきます。
Webなんかいっくら眺めてたって、分からないときは・なーんにもわかりませんが、
・イミディエイトウィンドウ、
・ローカルウィンドウ、
・ウォッチウィンドウ、
・ヘルプ、
・オブジェクトブラウザ、
眺めていれば、
「分からないとき」であっても、「自分が今まで知らなかった」「色んな事」が見えてきます。
ぜひ、使えるようになってほしいと思います。
~~~~~~~~~~
ただ、いずれにしましても、まず、知っておいてほしいのは、
「1 < 2」という書き方と 「(1 < 2) = True」という書き方が 「できる」 ということです。
「その意味は異なります」が、
でも、
そういう風に「True」や「False」を使うことも
「できる」
ということを知っておいてほしいと思います。
そして、そのどちらについても、「さらに」「True」や「False」で、
答えを返ってこさせることも
「できる」
ということも、知っておいてほしいと思います。
特に「If文」という、「ステートメント」と呼ばれる類いの命令文を使う時に、このような表現をどちらも使えるので、便利になります。
より「プログラムの目的に沿うほう」で書けばいい、ということになります。
またもや長い脱線をしました。
すみません。
では次に「Debug.Print 1 < 2 = True」を実行してみます。
これは、
先ほどやった、「Debug.Print (1 < 2) = True」と同じ意味です。
で、ここで気を付ける点は、
ExcelVBAの解説本では「省略」が「多すぎる」という点です。
例えば、ここでも本来は
「Debug.Print (1 < 2) = True」 と、カッコを付けて書くべき(かどうが僕は初心者なのでわかりませんが)であっても、 ほとんどの本やWebでは 「Debug.Print 1 < 2 = True」 と「何の但し書きもなく」
カッコ無し
で、
「書かれてしまう」
ということです。
「書くまでもないくらい短い式」だから書かない、ということなんでしょうけど、それだとやはり初心者にはわかりづらいです。
(※比較演算子にからめてお話すること自体、間違っていると思いますが、算術演算子などの場合にも当てはまることなので、すべての命令について、想定してください。市販書籍やWeb情報の多くは、すべての命令について、「省略だらけの手抜きレッスン」です。
「手抜きレッスンされていることに気が付けないから」、独学者はいつまでたっても、中級に上がれないのです。あまりにも「 ”省略=手抜き” が多い」ので、ある意味、『 お金を出して本を買って、でも、ウソを教えられている 』、という状況に近づいてしまっています。非常に残念です。)
基本、各種演算子には、その実行に優先順位があって、「(」(かっこ)の中に書いたことは優先的に行われます。(参考→https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/operator-precedence )
ここは数学の授業と同じですね(いつもそうとは限らないのでご注意を。)
でも、
「Debug.Print 1 < 2 = True」
と
「Debug.Print (1 < 2) = True」
は、
式の内容、命令の内容が短いので「同じ意味」となりますが、
もっといろんな演算子が含まれた、「長くて複雑な式」だと、必ずしもカッコがあるなしが「同じ意味」とはなりません。
なので、そこに注意が必要です。
「しっかり」
「注意して」
「省略」
「せずに」
「書く」
「ということから始める」
「何につけても、まずは ”省略しない書き方を探す ”、そこを学びのスタート地点とする」
「ということから始める」
ということが
「超」
「重要」だ、
ということです。
特に、ExcelVBAの書籍やWeb記事は、
「ある意味騙し」とすらとれかねないくらい、
「省略」
「だらけ」
だからです。
ですのでそこは本当にご注意ください。
==============================
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
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
----------------------------------------------------------------------