★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0025:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-08。(エラー回避の基礎09)★超重要!!!! オブジェクト式の書き方・・・どれとどれがホントに「一緒・同じ」なの?を「明確に」「判断する」「肌で実感する」「ハラ落ちさせる」。そのヒント・入り口。
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0025
タイトル:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-08。(エラー回避の基礎09)
★超重要!!!! オブジェクト式の書き方・・・どれとどれがホントに「一緒・同じ」なの?を「明確に」「判断する」「肌で実感する」「ハラ落ちさせる」。そのヒント・入り口。
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
今回も前回の続きです。
途中になってしまっていてすみませんが、
以下のプログラムの続きでした。
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 ' ' |
で、まずは、
で、以下の4つをドラッグしてウォッチウィンドウに放り込んでください。
ActiveWorkbook
ActiveWorkbook.Worksheets
ActiveWorkbook.Worksheets("Sheet1")
ActiveWorkbook.Worksheets("Sheet1").Range("A1")
で、それに加えて、
ActiveWorkbook.Worksheets.Item("Sheet1")
も追加してください。
右クリックして「ウォッチ式の追加」から、この式をコピペして追加すればOKです。
じゃあ、ついでに、右クリックして「ウォッチ式の追加」から、以下の式も追加してみてください。
Range("A1")
Worksheets("Sheet1")
Activesheet
ttt
最後の「ttt」は、オブジェクト変数です。
ここに何が代入されるのかを見てみます。
なお、「ttt」はウォッチウィンドウではなくて、ローカルウィンドウで確認してもOKです。
ケースバイケースで使い分けます。
今回は、ウォッチウィンドウを幅を広く表示したいので、「ttt」もついでにウォッチウィンドウで確認することにしました。
そして、最後に、Sheet1のA1セルに「aaa」と入力しておきます。
できましたら、
必ず「Sheet1」をアクティブにしてから、F8キーの連打にて、ステップ実行をおこないます。
「Set ttt = ActiveWorkbook.Worksheets("Sheet1").Range("A1")」
の行が「黄色」くなるようにF8キーを繰り返し押してください。
今回はここで、何と何が同じになるのか?などをさらっと大雑把なところを眺めてみたいと思います。
主に「オブジェクト式」についてですが、どういう書き方が「意味が同じ」になるのかなどを確認してみたいと思います。
(01)シートがらみのことについて:「型」の列で「Object/Sheet1」と表示されているものは皆、「同じモノ」。
まずは、ウォッチウィンドウで「型」の列を見てみます。
すると、「Object/Sheet1」と表示された行が数行あることに気が付かれると思います。(下図参照)
いきなりですが、(すでにご存じの方もいらしゃるかもしれませんが)実はこれ、全部、
「Sheet1」のことを表しているオブジェクト式なのです。
で、今現在、「Object/Sheet1」と表示されているモノは以下の4つのオブジェクト式です。
(以下、その4つを、上から順番に書きます。)
Activesheet
ActiveWorkbook.Worksheets("Sheet1")
ActiveWorkbook.Worksheets.Item("Sheet1")
Worksheets("Sheet1")
ウォッチウィンドウの「値」の列には何も表示されませんが、一応、「型」の列のところですべて、「Object/Sheet1」と表示されているわけなので、
まずはその文字列の中の、
前半部分の「Object」という部分や、左端の「+」マークから、
「あ、こいつらはみんなオブジェクトなんだ!」
と明確に分かります。
また、後半の「Sheet1」という部分から、
「あ、こいつらは全部、 その”オブジェクト”の中でも ”Sheet1”だけの事を言ってんだ」
ということも明確に分かります。
結果、だから、「同じものだ」といえます。
もっともっと明確に「4つは同じものだ」と理由付けをしたければ、
この4つの式の左端の「+」マークを押してツリーを展開してみます。
そして、下へスクロールし、それぞれの「Name」プロパティの「値」の列を見てみます。
4つのうち、すべての「Name」プロパティが、「Sheet1」という値になっていることが分かると思います。
これで、完全に、「4つは同じものだ」と言っても大丈夫になれると思います。
ちなみにですが、このように「Nameプロパティ」をチェックするのは、オブジェクトのことを調査する場合はよくやります。
というのは、今回たまたま「型」の列に「Object/Sheet1」と(4つとも)表示されていましたので、なんとなく「そこだけ」で、「あ、Sheet1のことかな?」と想像がつきますが、そのようなケースは実は少なく、「Object」のあとに色々ゴチャゴチャくっついていて「ワケ分からん」いうケースも結構あるので、その場合は、ツリーを展開して「Nameプロパティ」をチェックするほうが速くて分かりやすいです。
※↓『 ActiveWorkbook.Worksheets.Item("Sheet1") 』の「+」マークを押した例
というわけで、この4つを長い順に書きますと以下のようになります。
そしてこれらは全部、「同じモノ」、「同じ意味」。
ActiveWorkbook.Worksheets.Item("Sheet1")
ActiveWorkbook.Worksheets("Sheet1")
Worksheets("Sheet1")
Activesheet
よくWebや市販書籍などで、
「Activesheetは現在アクティブなシートのこと」と言われますが、
今回のこの事例で今まさにアクティブなのは、現実にExcelの画面を見るとまごうことなき「Sheet1」なので、
そのことと、
ウォッチウィンドウの「Activesheet」の行の「型」の列が「Object/Sheet1」となっていること(=特に・後半が「Sheet1」となっていること)・・・
・・・という2つの事柄から、
「ああ、アクティブなシートが、ちゃんとActivesheetと同じだな!そうなってるな!」
と分かります。
「Activesheet」の「+」マークを押してツリーを展開し、「Nameプロパティ」の値を見てもOKだと思います。そこが「Sheet1」となっているはずですので。
また、実際にこうやってウォッチウィンドウで見てみると、
アクティブなシートが「Sheet1」である現時点では、
ActiveWorkbook.Worksheets.Item("Sheet1") と書いても
ActiveWorkbook.Worksheets("Sheet1") と書いても
Worksheets("Sheet1") と書いても、
Activesheet と書いても、
「全部同じなんだ」ということも分かると思います。
し、また、それが「本当だ」「本やWebに書いてある通りだ」ということも、なんとなく、「肌でも」感じて頂けるのではないかと思います。
「Activesheet」 は、
「ActiveWorkbook.Worksheets("Sheet1") 」や
「Workbooks(×××).Worksheets("Sheet1") 」の、
「省略形なんだ」、
ということも「あ!ホントだった・・・!」とか、なんとなくでも感じて頂けると思います。
この4つは全部、「Sheet1のことを指している」ということが、ツリーなどを展開して、「確定」している、「間違いないと分かった」わけですから。
また、
ActiveWorkbook.Worksheets.Item("Sheet1") と書いても
ActiveWorkbook.Worksheets("Sheet1") と書いても同じで、
むしろ、
ActiveWorkbook.Worksheets("Sheet1") は
ActiveWorkbook.Worksheets.Item("Sheet1") の
「省略形だった」
ということも、同じように「体で理解できる」「肌で感じれる」「ハラに落ちてくる」のではないかと思います。
「あ、ホントだ・・・」と。(「Item」プロパティのことを先に学んでおかないといけないかもしれませんが)
この「肌で感じる」というのは、「体で覚える」という感覚に近いと思いますので、非常に重要な感覚だと思います。
「ハラに落ちてくる」「ハラ落ちする」、という非常に重要なことにも結び付きますし。
是非今後も、どんどんと、
ウォッチウィンドウで「本に書いてあったあのこと、ホントだった!」と実感・体感する回数
を増やしてみてください。
※重要な補足
ここではシートについてお話をしましたが、「複数のブックを同時に開いたとき」についても、
同じように、
「いろんな省略形の書き方、逆に省略しない書き方」があったとしても、
「戻ってくる型と値が同じ」
「すなわち、全部、同じモノ」
ということが、
明確に見えてくると思います。
さらに、ブック以外にも、セルやグラフなどでも同じことです。
オブジェクト以外にも、一般データの場合でも、関数の動きなどを調べる際には、そういう調べ方が役に立つことがあります。
ほんとう、是非今後も、どんどんと、
ウォッチウィンドウで色々と調べて、「あ!本に書いてあったこと、ホントだったんだ!」と
実感・体感・ハラ落ちする回数を増やしてみてください。
★「本を読んでるだけ」の学習の「数倍から、十数倍は、覚えが速くなる」と思います。
特にオブジェクト関連のことは、オブジェクトモデルの階層一覧図といっしょにツリーの展開を繰り返していけば、「徐々に」でも、「体系づいて」覚えることができるようになっていく、
「応用が利く素地ができてく」と思います。
ほんとうウォッチウィンドウは、「4流以下の著者や編集者たちが作った腐った本やサイト」の、数十倍の価値があります。
是非、そのようにウォッチウィンドウを使ってみて下さい。
(02)セルがらみのことについて:「型」の列で「Object/Range」と表示されているものは皆、「同じモノ」(というか同じ型)。
同様に「型」の列で、「Object/Range」と表示されているモノを見てみます。
この場合、
以下の2つのオブジェクト式があてはまります。(下図も参照)
Range("A1")
ActiveWorkbook.Worksheets("Sheet1").Range("A1")
で、ここではツリーを展開しなくても、より、明確に「両者は同じものだ」とわかります。
そう、「値」の列でA1セルの入力値の「aaa」がうっすらと表示されているからです。
(「.Value」を省略せずにちゃんと付けると、明確な黒い色の文字に変わります。ただ、その場合は返ってくるものがオブジェクトではなくなってしまいますが・・・。)
両方とも「オブジェクト」で、「値が同じ」なら、基本、「同じモノ」と考えてOKです。
「aaa」が同じ・・・となれば・・・、
『 Range("A1") っていうやたら短い式と、
ActiveWorkbook.Worksheets("Sheet1").Range("A1") っていう
やたら長い式とがあるんだけど、よくわからんけど、
どっちも「値」が「aaa」なんだからどうみてもこりゃ
多分「イコールなモノ」?なんだよね?
正直、ActiveWorkbook.Worksheets("Sheet1").Range("A1") なんて
長ったらしいの、意味良く分からんけど・・・。』
と、割と早く想像もつく・・・、ということになろうかと思います。
ただ、
ActiveWorkbook.Worksheets("Sheet1").Range("A1")
のほうは
「型」の列に、「Variant/」という単語がひとつ余分に付いています。
これが初心者の方にとっては少し迷うところですよね。
これは、
「基本、「Variant型として」で値(ここでの場合ではオブジェクト)が返ってくるけど、
内部的には ”Object/Range ”型に内部変換されているよ!
だから結局は ”Object/Range ”とだけ表示されているモノと同じだよ!」
という感じの意味になります。
なので、基本、先頭に「Variant/」と表示されているモノは、便宜的にいったんは、それを無視してもOKです。
そのあとの単語を比べてみてください。
この事例の場合なら、「Object/Range」だけを見比べる、ということです。
※ただし、理解が少しずつ深まってきたら、「Variant/」が「付く/付かない」は「エラーが出る・出ない」にも関連してくるので、どこかの地点で必ずその意味の詳細を理解する必要があります。
ここでも、
Range("A1") という書き方は、
例えば ActiveWorkbook.Worksheets("Sheet1").Range("A1") という書き方の
「省略形なんだ」
ということが、
「あ!ほんとだったんだ!」
と分かります。
Workbooks(××).Worksheets("Sheet1").Range("A1") といった式なども更にウォッチウィンドウに追加すれば、
Range("A1") という書き方は
Workbooks(××).Worksheets("Sheet1").Range("A1") といった書き方の、
「省略形でもあるんだ」
とも分かります。
繰り返しになりますが、「aaa」と、A1セルの入力値がうっすら表示されている(かつ、Object/Range と型も一緒なので。)
あと、「Rangeが返ってくるってことは、セルやセル範囲はやっぱり ”Rangeオブジェクト ”なんだな~」ということも、明確に、分かります。
※超重要注意!!
以前の号でも注意喚起をしましたが、セルを操作する場合は、
「Range("A1") とだけしか書かない書き方」・・・、
つまり、
「Workbooks(××××).Worksheets(××××).」、あるいは、
「Workbooks(××××).Worksheets.Item(××××).」、あるいは、
「ActiveWorkbook.Worksheets(××××).」といった、「階層の記述」を省略してしまった、
「いきなりRangeから書き始める書き方」は、
ExcelVBAでもっともエラーの出やすい「ダメな書き方」なので、本番では絶対にしないようにしてください。
ここでは「事例」として分かりやすいように挙げただけです。
絶対に本番では、「いきなりRangeから書き始める書き方」を使わないようにしてください。
(03)「ActiveWorkbook.Worksheets」は「Worksheetsコレクションオブジェクト」のことではなくて
「Sheetsコレクションオブジェクト」のことを言っている・・・と明確にわかる。
これはちょっと難しくなるので詳しい説明を割愛します。
でも、このように「思ってたのと違ってた!」ということもウォッチウィンドウでわかりますし、明確にもなります。
少しご説明しますと、
「Workbook.Worksheetsプロパティ」のヘルプを読んだりオブジェクトブラウザの説明ペインを見ると理由がわかります。
そこには、
「Workbook.Worksheetsプロパティの戻り値は、WorksheetsコレクションオブジェクトではなくてSheetsコレクションオブジェクトだ」
と明確に書いてあります。
つまり、
「仕様」として決まってしまっているので、
仕方ないというか、
そうなるしかないというか、
「マイクロソフトが勝手にそう決めたのでどうしようもないこと」
ということになります。
ただ、その、「ヘルプやオブジェクトブラウザの説明ペインに書いてあること」が、
「あ!ホントだった!」と「明確に」「分かる」ので、「スッキリ」することは間違いありません。
この事に関しては、市販書籍やWebでも、「Sheetsコレクションの中にWorksheetsコレクションが内包されている」みたいな誤解を与える誤った苦し紛れの説明がなされていることもちょいちょいあるので、初心者の方には少し難しいかもしれませんが、でも、とりあえず、そういったレベルの低い腐った本はともかく、
「ヘルプやオブジェクトブラウザの説明ペインに書いてあること」は、
「あ!ホントだった!」とと「明確に」「分かる」ので、「スッキリ」することは間違いありません。
(04)「ActiveWorkbook」は「ThisWorkbook単一オブジェクトのことを言っている」と惑わされるけど、Nameプロパティを調べると、本当のところが分かる。
ここでは「ActiveWorkbook」の「列」の表示内容が、「Object/ThisWorkbook」となっていますが、これは少し難しいです。
惑わされます。
正直僕もまだよくわかっていません。
基本的には、
「ThisWorkBook」=現在実行中の(=F8実行中の)VBAコードが記述されているブック
「ActiveWorkBook」=現在表示している(アクティブになっている)ワークブック
ということですから、ここは、
単に「Object」とか、「Object/Workbook」などと表示されるのかな~?と思いきや、
「Object/ThisWorkbook」と表示されます。
なぜ「Object/ThisWorkbook」と表示されるのかはまだ僕にはわかりません。
ただ、実際に、2つのブックを開いてツリーを展開するなどして色々と調べると、F8キーでの実行をしていても、
最初のルール通り、
「ThisWorkBook」=現在実行中の(=F8実行中の)VBAコードが記述されているブック
「ActiveWorkBook」=現在表示している(アクティブになっている)ワークブック
という形に沿った調査結果が出てきます。
この調査をするには、2つのブックを開いたのち、「ActiveWorkbook」の「+」マークを展開して、「Nameプロパティ」などを調べると明確になります。
また、イミディエイトで調べることもすると、さらに明確になります。
例えば、2つのブックを開いたのちに、イミディエイトウィンドウにて、
? Thisworkbook.Name
とか
? ActiveWorkBook.Name
などとやることでも、色々とわかると思います。
ウォッチウィンドウに表示される内容は、コードが再実行されないと表示内容が変わらないので。(=状況が変わってもそれに伴ってリアルタイムには表示内容が変化しないので。コードをいったん最後まで終えて再実行しないと。)
ご自分でも2つのブックを開いて、「ThisWorkBook」と「ActiveWorkBook」の違いを、
ウォッチウィンドウでのツリー展開や
イミディエイトなどで、
「Nameプロパティ」の「値」で調べてみて下さい。
ひとまず、今回のサンプルではここで一区切りですが、ただこれは、
「これが全部」じゃあ、もちろん「ありません」。
ウォッチウィンドウに追加した式によって、どんどん、どれとどれが同じモノなのかとか、逆に「違ってた!うそ!?決めつけてたわ~・・・。」とか、そのほかに分かること、が増えていきます。
また、Nameプロパティなどを見て、「これが ×××××× なことは確実なんだから、なら、逆にそのことを起点として逆方向から考えると、 ×××××× ってことにもなるのかもしれない・・・」といった、「想定」ができたり、想像したことがより明確になったり、確実性が増したり、ということも増えてきます。
そのようにご理解ください。
じゃあここで、
「Set ttt = ActiveWorkbook.Worksheets("Sheet1").Range("A1")」を
実行してみましょう。
あ、その前に、もし、実験用の2つ以上のExcelファイルが開いていたら、最初のExcelファイルだけにしてください。他のExcelファイルは全部閉じてください。
で、
F8キーを1回、押してください。
「ttt」の「型」の列と「値」の列は、どうなりましたでしょうか?
「ttt」の行の、「値」の列が「aaa」、「型」の列が「Object/Range」となっているので、
「オブジェクト変数の ttt 」は、
ActiveWorkbook.Worksheets("Sheet1").Range("A1") という書き方や
Range("A1") という書き方と
「同じ」
あるいは、
「同じ意味である」
ということがわかります。
となると、、まず「ttt」に代入されたモノ、
つまり、
ActiveWorkbook.Worksheets("Sheet1").Range("A1")
は、
Range("A1")
と
「イコールである」
ということになります。
もちろん、「何かが代入されたあとの」「ttt 自体も」、
「オブジェクト変数の ttt そのものも」、
「イコールである」、
ということになります。
ウォッチウィンドウで「おぼろげに」「そういうことなんだろうなあああ、多分・・・」ということがどんどん無くなって、明確になっていく・・・・。
それが実感して頂けるのではないかと思います。
==============================
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
----------------------------------------------------------------------
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
発行システム:『まぐまぐ!』 http://www.mag2.com/
配信中止はこちら https://www.mag2.com/m/0001691660.html
----------------------------------------------------------------------