★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0021:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-04。(エラー回避の基礎05)~変数宣言とウォッチウィンドウの関係、その他。~
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0021
タイトル:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-04。(エラー回避の基礎05)
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
今回も前回の続きです。
皆様お久しぶりでございます。
しばらくお休みしてしまってすみませんでした。
クーラーの冷気を扇風機でさらに風を送っていたモノに、長時間あたってしまい、風邪をひいてしまいました。
トラブル解決中だったのでそれに集中しすぎて気づかず、風邪をひいてしまったようです。
コロナかどうかをお医者さんに聞いたら、「大した症状もないし、味覚障害や咳もまったくないから、この漢方と風邪薬で治ればぜんぜんコロナじゃない」ということで少し安心していたのですが、その様子見の最中に我が家のワンちゃんが急に亡くなってしまいました。
亡くなるまでの5日間くらい、夜も寝ずに看病してしまったので、結局、治るのが遅くなってしまいました。
しかし、かわいがっていたワンちゃんが亡くなるというのは、哀しいことなんですね。
はじめて看病をしたのでちょっと来るものがありました。
自分はもっとクールに対応できると思っていたのですが、自分でも意外でしたが、やっぱり苦しそうにしているのを見るとかわいそうで、看病+手をかけないわけにはいかず・・・。
風邪で仕事を休んでたので面倒を見れたのですが、
ただ、日中でも夜中も、ちょっとでも苦しそうだと(ああああ~!!って人間みたいな大声をあげるので)、仮眠をとっている最中でも目が覚めてしまい・・・
あー、介護疲れってこういうの言うのかもなーと思いました。
今回は別に疲れはしてないですけど、これが永遠に続くのが介護なんだなと、少し想像ができました。
ワンちゃんは心臓が悪いので、寝てるよりもだっこしてあげるほうが姿勢的にラクらしく、できるだけだっこしてあげてたんですが、そのとき耳元で・・・
苦しいのごめんね~
ごめんね~
今までありがとうね~
ありがとうね~
ありがとうね~
おまえが一番最高だったよ~
ありがとうね~
ありがとうね~
と何百回も言って、彼女にお礼を伝えさせてもらったのですが、そうこうしてると、いのち、の大切さを久しぶりに感じてしまいました。
今まで自分はいのちを軽んじていたような気がします。
今でも結局変わってないかもしれません。
でも、ちょっとでも考えさせてくれてありがとうね、という思いです。
以前は、食事してると「くれくれストーカー」と化して、しっぽ振って目をキラキラさせてちょこまかひっついてくるワンちゃんがもう今日はいないので、静かすぎて、ちょっと寂しいです。
というわけで、風邪の話からまったく関係の無い話になってしまいましたが、気温も下がってきましたので、皆様もお風邪などめされないよう、どうがご注意くださいませ。
去年は仕事休む必要なんてなかったので風邪ひいてもそのまま薬飲みながら仕事してましたが、今年はそういうわけにもいかず、面倒なことになってしまいました。
でもおかげでワンちゃんの看病ができたから、それは神様がそうしてくれたのかもと逆に感謝しています。
結局、2日くらい前からは薬のおかげでかなりラクになり、体調はもとに戻ってきましたのでコロナではなかったようです。
(近所でPCRを、自費だけど16500円と比較的安価でやってくれるところができたので、今後は速攻でソコ行こうと思います。こんなに長いこと休まずに済みます。)
今日はプライベートのお話からですみません。
でも皆様も、ご体調には、どうかお気をつけください。
では今回も前回の続きです。
以降、本文です。
よろしくお願い致します。
*************
*************
前回のプログラムの、途中からお話させていただきます。
各種注意事項は前号と同じです。
あと、再度の繰り返しになりますが、
今号に書いてあるようなことを「自分のアタマで考えずに」すっ飛ばして、
「手抜き」「ラク」をしてしまうと、
永遠に「ヘルプとオブジェクトブラウザが読めないバカ」に成り下がってしまう確率が上がってしまう
です・・・。
なので、ご注意ください。
今回も、ウォッチウィンドウの「普通な使い方」です。
よろしくお願い致します。
では早速ですが、以下のコードを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キーを押してください。
イミディエイトに、
4020
True
True
True
False
False
False
True
True
などと表示されたと思います。
で、
今回は、
「Debug.Print (1 > 2) = False」
を実行したあとからです。
「Set ttt = ActiveWorkbook.Worksheets("Sheet1").Range("A1")」
のところからですね。
その行が「黄色」くなるようにF8キーを繰り返し押してください。
========================
では、このプログラムの右辺を調べていきます。
このプログラムは、オブジェクト変数の「ttt」に、アクティブなブックの、Sheet1の「A1」セルの値を代入する、という命令ですね。
************************
っと・・・・・・、
いきなり話が横道に逸れます。
すみません。
ちなみにですが、
今、ローカルウィンドウには「ttt」と「ggg」が表示されて、
それぞれ、「値」の列が「Nothing」「Empty」と表示されていますよね?
ttt:Nothing
ggg:Empty
変数「ttt」のほうは、変数の宣言のところで、「As Object」と宣言しましたから、結果、変数tttは「オブジェクト変数だ」ということになっています。
基本的に「オブジェクト変数」の場合、
まだカラッポの状態の場合は「Nothing」という値が入っています。
これはそういう仕様(決まり)ですので理由を考えないでください。
なので、
「ttt」の値が「Nothing」だということは、うらをかえせば、
「まだ何も代入されてませんよ!」という意味だ、、、
ということになります。
例えば、IF文の条件を作るときに、「もしオブジェクト変数にオブジェクトが代入されていたら」みたいな条件分岐を作ることがあります。
これは、「Is」演算子を使って
「もしオブジェクト変数が空じゃなかったら」という意味の条件を表現します。
その場合、
「 If Not ttt Is Nothing Then ・・・ 」、あるいは「 If Not (ttt Is Nothing) Then ・・・ 」のように書くと、そのような条件分岐のプログラムが作れます。
ちなみに、
「As Object」と変数宣言をすることを「実行時バインディング・あるいは・遅延バインディング(=レイトバインディング)」といい、この場合は、インテリセンス(入力補完機能)のドロップダウンが働きません。
なお、「Object」という型のことを「オブジェクト型のうち、総称型のこと」と言ったりします。
なので、「As Object」で宣言された変数のことを「総称型のオブジェクト変数」と呼んだりもします。
それに対して
「As Range」、「As Workobook」、「As Worksheet」、「As Chart」、・・・・
などと変数宣言することを「事前バインディング(=アーリーバインディング)」と呼びます。
この場合は、インテリセンス(入力補完機能)のドロップダウンが働きます。
なお、事前バインディングをするには、VBEの「ツール→参照設定」にて、事前バインディングしたい型を保持・保有している「ライブラリ」というものにチェックマークを入れておかねばなりません。
Excel関連、Office関連の命令で事前バインディングができたりインテリセンスが働いたりする理由は、最初からここ(「参照設定」の設定箇所)で、ExcelやOfficeの「ライブラリ」が参照設定されているからです。
(なお、「参照設定済み+事前バインディング」の場合であっても、オブジェクトを返す命令が「Object」と『 総称型のオブジェクトを返す命令 』だと、その場合はインテリセンス(入力補完機能)のドロップダウンは働きません。
インテリセンス(入力補完機能)のドロップダウンは、参照設定がなされていて、かつ、事前バインディングである・つまり「Range、Workobook、Workbooks、Worksheet、Worksheets、Font、Chart、Charts、・・・・」といったように、固有オブジェクト型で変数を宣言した場合しか働きません。
さらには、参照設定がなされていても、実行時(=遅延)バインディング(Dim 変数名 As Object と変数宣言をすること)をすると、その場合もインテリセンスは働きません。
なお、実行時バインディングは「参照設定」とはまったくの無関係です。
参照設定がしてあっても「してなくても」どちらであっても、「・・・ AS Object」と総称型の変数宣言をすることで(というかそれだけで)実行時バインディングを指定(設定、適用)できます。同時に、インテリセンスは働かなくなります。
それに対して、事前バインディングは「参照設定」と縁が深いです。
参照設定がしてあってはじめて、かつ、「・・・ AS Worksheet」などと固有オブジェクト型で変数宣言したときにだけ、事前バインディングを指定(設定、適用)できます。と同時に、「自動的に」インテリセンスが働くようにもなります。
(※ちなみにですが、オブジェクトを返す命令を大別すると、オブジェクトを総称型で返す命令と、固有型で返す命令の2つに分かれす。)
繰り返しになりますが、
「固有オブジェクト型で変数を宣言した」「総称型で宣言した」に関係なく、
また、参照設定がなされていたとしても、
各種命令単語たちが、「総称オブジェクト型のオブジェクトを返すモノである場合」は
インテリセンスは働きません。
基本、
「オブジェクト変数」に限った場合なら、「参照設定をした上で、固有オブジェクト型で宣言したモノ」「だけ」が、インテリセンスが使えます。(インテリセンスが働きます。)
一方、オブジェクト変数ではなくて、「生のオブジェクト式でのプロパティやメソッドがらみ」の場合なら、
「変数を固有オブジェクト型で変数を宣言した・総称型で宣言した」に関係なく、
参照設定がなされていて、固有型のオブジェクトを返すプロパティやメソッドなら、
これもインテリセンスが使えます。
が、参照設定がなされていても、総称型のオブジェクトを返す(=オブジェクトブラウザにて「 As Object 」と表示される)プロパティやメソッドなら、
インテリセンスが使えません。
つまり命令単語たちが「返す」、その「型」が、
総称オブジェクト型の「Object」の場合は、
どんな型で変数宣言しようが、
参照設定しようが、
インテリセンスは働きません。
Sheetsコレクションのように、例えば、Sheets.Item(1) と書いたときに、グラフシートが返ってくるのか、ワークシートが返ってくるのか、「わからない」ような、汎用的な動き(?)をする命令単語も、インテリセンスは働かないことが多いです。
Sheetsコレクションの場合、
「Sheets」の後にドットを打つとインテリセンスは働きますが、
「Sheets.Item(1) 」の後にドットを打つとインテリセンスは働きません。
「Sheets.Item(1) 」は、一番左端に表示された「グラフシートか、ワークシートか、その他のタイプのシートのどれか」という意味なので、結局「Sheets」という命令(プロパティ)は、グラフシートに決め打ち、ワークシートに決め打ち、というような「1つの型だけ」を返すような命令単語ではないからです。
「Sheets(1) 」と書いてドットを打っても、「Sheets(1) 」は「Sheets.Item(1) 」の単なる省略形でして、「Sheets(1) 」=「Sheets.Item(1) 」という意味なので、結局インテリセンスは働きません。
ちなみに、Sheets.Item プロパティが返すオブジェクトの「型」は「Object」という総称オブジェクト型です。オブジェクトブラウザで調べると分かります。
「As Object」になっています。
なので、これまでの説明通り、基本的にはインテリセンスは機能しません。
「ActiveWorkbook.Worksheets.Item(1)」とやっても、「Workbook.Worksheets プロパティが取得するのは Worksheetsコレクションではなくて、Sheetsコレクション という仕様になっている」ので、結局同じ理屈で、「グラフシートか、ワークシートか、その他のタイプのシートのどれか」という意味になってしまうため、これもインテリセンスは働きません。
ただし、そのようなプロパティやメソッドでGetした汎用的なオブジェクトを、固有型で変数宣言したオブジェクト変数に代入すると、その場合は、インテリセンスが使えるようになります。
たとえば以下のようなコードを書いた場合、オブジェクト変数に対しては、インテリセンスは働くようになります。
Sub testtest()
Dim o_Ws01 As Worksheet
Set o_Ws01 = ActiveWorkbook.Worksheets.Item(1)
Debug.Print o_Ws01.Name
End Sub
「ActiveWorkbook.Worksheets.Item(1)」だけだと、そのあとにドットを打ってもインテリセンスは働きませんが、「o_Ws01 」という、「Worksheet」型の固有オブジェクト型の変数にそれを代入してあげると(Setすると)、o_Ws01 のあとにドットを打つと、インテリセンスが働くようになります。
この意味でもWithを使わずに、オブジェクト変数にオブジェクト式(=生オブジェクト)を代入すると学びが加速します。
「なんのこっちゃ?」かもしれませんが、一応これが何らかのヒントになる方もいらっしゃるかもしれませんし、実際に、このことはデバッグ(バグつぶし、エラー解決)のときにも使う知識ですので、「さらっとお知らせ」、的にご紹介だけしておきます。
「ふーん、なんだかよくわからんけど、そういうことも学ばないといけないんだーーーー」くらいにあ、思っておいてください。
いずれ、どこかで、特に
・フォルダをすべてのサブフォルダも再帰的にチェックする(FSOなど)
・オートメーション(WordやAcces、パワポなどとの連携)の利用
・ADO、DAO、の利用
等々で必要になってくると思います。
まとめますと、オブジェクト変数の宣言をするとき、以下のように分類できる、ということになります。
総称型(=総称オブジェクト型):Object
固有型(=固有オブジェクト型):Range、Workobook、Workbooks、Worksheet、Worksheets、Font、Chart、Charts、などなど・・・・
総称型、固有型、についてはExcel2010のヘルプだと、「オブジェクト変数の作成」というヘルプページなどに少し書かれています。
Webのマイクロソフトのヘルプページでは僕は見つけられませんでした。
見つけられなかった方のために、このメルマガの巻末に、引用しておきました。
ご参考にしてみてください。
同じように、変数「ggg」は「As Variant」というかたちで変数宣言をしましたので、こちらは、「一般データでもオブジェクトでもなんでもコイ!のVariant型」ということになります。
基本的に「Variant型変数」の場合、
まだカラッポの状態の場合は「Empty」という値が入っています。
これもそういう仕様(決まり)ですので理由を考えないでください。
なのでこれも、
「ggg」の値が「Empty」だということは、うらをかえせば、
「gggにはまだ何も代入されてませんよ!」という意味だ、、、
ということになります。
で、これも、
「もし、変数の中身がEmptyだったら」という条件分岐を作成できます。
そのときは、「=」演算子を使って、
「If ggg = Empty Then ・・・・・」
と書きます。
演算子は、「Is」を使ったり、「=」を使ったり、いろいろです。
変数の型などによって変わります。
以上のように、変数には「空っぽの状態のときに格納されている値」があります。
変数によって、Emptyだったり、Nothingだったり、""だったり、0だったり、色々と異なりますが、でも、どれにも「初期値」というか、「空っぽの状態のときに格納されている値」があります。
そして、「それの値を基準に、条件分岐のプログラムを作れる」ということもあります。
(ただし、条件に使う演算子はそれぞれ異なります。)
以下のような語句で、Web検索してもヒットしますので色々検索してみてください。
ExcelVBA Empty 判定
ExcelVBA Nothing 判定
ExcelVBA "" 判定
ExcelVBA 文字列 判定
ExcelVBA 0 判定
ExcelVBA 数値 判定
・
・
・
かなり長く横道に逸れてしまいましたが、初心者の方は、バインディングの話はともかく、このことだけでも是非、覚えておいてください。
************************
では、本題に移ります。
「Set ttt = ActiveWorkbook.Worksheets("Sheet1").Range("A1")」
が黄色くなった状態のまま、「=」の右側に書いてある、
「ActiveWorkbook」
をドラッグで青色反転選択して、それをそのまま、さらにドラッグで、ウォッチウィンドウに放り込んでみてください。
次に、
「ActiveWorkbook.Worksheets("Sheet1")」
も同様に、ドラッグでウォッチウィンドウに放り込んでみてください。
次に、
ActiveWorkbook.Worksheets("Sheet1").Range("A1")
もウォッチウィンドウに放り込んでみてください。
以下の図のようになったかと思います。
では、一番下の
「ActiveWorkbook.Worksheets("Sheet1").Range("A1")」
から行ってみます。
これは、
『 アクティブなブックの、Sheet1の「A1」セル 』
を表す、
「オブジェクト式」
です。
つまり、
「ActiveWorkbook.Worksheets("Sheet1").Range("A1")」
は
『 アクティブなブックの、Sheet1の「A1」セル 』 を文字化、式化した、
いわばその「分身」だ、
ということです。
「ActiveWorkbook.Worksheets("Sheet1").Range("A1")」
の左隣に「+」のマークがついています。
これは、
「コレはオブジェクトだよ!」
「この式はオブジェクトのことを表しているよ!」
という意味です。
ちなみに(のちにもお話ししますが)付いていないものは「一般データ=文字系のデータ」です。
それを意味しています。
「一般データ=文字系のデータ」とは、
文字列、数値、日付、True/False(Boolean値)などのことです。
それらのデータの場合には、「+」マークを付きません。
※前回、前々回などのウォッチウィンドウのお話では「True/False」のお話ばっかりだったので、付いてなかったかと思います。
で、「ActiveWorkbook.Worksheets("Sheet1").Range("A1")」の左隣の「+」のマークをクリックしてみてください。
ツリー構造が展開されると思います。(下図赤枠)
この展開された中(上図赤枠の中)でも、同じように「+」マークの「ある・なし」が見て取れます。
つまり、「一般データかオブジェクトか」の違いが見て取れるということです。
例えば上図赤枠の中のツリーの一番上から見ていきますと、
AddIndent
AllowEdit
Column
ColumnWidth
Comment
などは、「+」マークがついていません。
なので、これらはオブジェクトではありません。「一般データ=文字系のデータ」です。
一方、
Application
Areas
Borders
Cells
などは、「+」マークがついています。
なので、これらは「オブジェクト」です。
ところで・・・、
ここで、ちょっと乱暴なテストですみませんが、コードが黄色くなったまま、
ツリーの「+」をもう一度押して展開をやめて閉じ、
そのあと、
Sheet1のA1セルに「あ」とか「a」と、入力してみてください。
そしてそのあとに、再度、
「ActiveWorkbook.Worksheets("Sheet1").Range("A1")」
の左隣に「+」のマークを押して、ツリーを展開してください。
たくさん色々と出てくるので、下にスクロールし、
「Text」というプロパティ名を探してみてください。
そこには、さきほど入力した「あ」とか「a」などの文字が「値」の列に表示されていると思います。
なお、このとき、
展開されたツリーの中にも、「+」マークが付いているモノと付いていないモノがあると思います。
これも、「+」マークが付いているモノは「オブジェクト」で、付いていないものは「一般データ=文字系のデータ」です。
「+」マークをクリックすると、さらに「+」マークが出てくるので、どんどんクリックしていくと、どんどん下の階層に降りていきます。
最初のうちは、どんどん深みにはまって抜けだせなくなります。(^^)
★★★★
★
★ でも「オブジェクトが」「階層構造」をなして、「つながっている」ということが、
★ 「もやもやしたイメージ」ではなく、
★ 「明確に形となったもの」として
★ 見えてきませんでしょうか?
★
★★★★
僕の説明ではそこまでに見えてこないかもしれませんが、でも、そう見えるようになるまで、ウォッチウィンドウやローカルウィンドウなどを使って、階層構造(オブジェクトモデル一覧)を学ぶ事は本当に重要です。
https://euc-access-excel-db.com/00000WPPDF/object-model01.pdf
や
https://euc-access-excel-db.com/00000WPPDF/get-object-basic01.pdf(下図左側)
https://euc-access-excel-db.com/00000WPPDF/get-object-basic02-disc-cut.pdf(上図右側)
https://euc-access-excel-db.com/00000WPhtml/Excel2000-obj-model01.png の内容(下図)も確認・比較しながら。
ところで、先程、
「ActiveWorkbook.Worksheets("Sheet1").Range("A1")」の左隣の「+」マークでツリーを展開した時、
「これらは文字列系のデータだよ」「これらはオブジェクトだよ」と軽々しく言ってしまいましたが、ちょっと訂正?補足?させてください。
つまり、ツリーの一番上の行から見てみたときに、
AddIndent
AllowEdit
Column
ColumnWidth
Comment
などの「+」マークの無いモノは、「これらは文字列系のデータだよ」と言うよりは、
★「文字列系のデータを返すプロパティだよ」 ★ とか、
★「文字列系のデータが返ってきてる」 ★
とお考えください。
「これらは文字列系のデータだよ」と考えてもいい場合もありますが、
★「文字列系データを返すプロパティだよ」 ★
★「文字列系のデータが返ってきてる」 ★
と考えられるようにならないと、VBAは絶対に上達しません。
一方、
Application
Areas
Borders
Cells
などの「+」マークの在るモノは、★「オブジェクトを返すプロパティだよ」とお考えください。
これも、
「これらはオブジェクトだよ」と考えてもいい場合もありますが、
最終的には、
★「オブジェクトを返すプロパティだよ」 ★ とか、
★「オブジェクトが返ってきてる」 ★
などと考えられるようにならないと、VBAは絶対に上達しません。
★ となると、
★
★ 「ActiveWorkbook.Worksheets("Sheet1").Range("A1")」
★
★ は、
★
★ 「オブジェクトを返す」「式」「だよ!」
★
★ ということになります。
そもそも「一般データやオブジェクトを返す関数やプロパティやメソッド」が存在するわけですから、
「それらを ”要素” に持つ」「式」にも、当然、
「一般データやオブジェクトを返す」「式」がある・・・
つまり、
「一般データやオブジェクトを返す」「式」・・・というモノが成り立ってくる・・・
ということが言えます。
★★★ これも大変重要な「考え方」「意味合い」「判別方法」ですので、必ず覚えておいてください。
また話が逸れてすみません。
では、「ActiveWorkbook.Worksheets("Sheet1").Range("A1") 」が黄色くなったまま、
次に、ウィッチウィンドウの「型」の列を見て下さい。
「Variant/Object/Range」と書いてあります。
このとき、「/」は「~であると同時に」という感じで読みます。
なので、これは
「ActiveWorkbook.Worksheets("Sheet1").Range("A1")」の「型」は、
「Variant型であると同時に、Object型であると同時に、Range型である」
ということになります
そしてさらにこれは
「変数の宣言」を、
「Variant型」、つまり、「 AS Variant 」と書いてもいいし、
「Object型」、つまり、「 AS Object 」とやってもいいし、
「Range型」、つまり、「 AS Range 」でやってもいいよ~。
という意味にもなります。
ここをまず押さえておいてください。
もう少し突っ込んで言いますと、
★ 「オブジェクト式」はもちろん、「その他の色んな式」をウォッチウィンドウに
放り込むと、
★ (「変数の宣言」のときに)、変数にどの型を使えばいいかがわかる・・・
ということを押さえておいてください。
もちろん、「何らかの ”変数” が含まれる式」については、変数に値やオブジェクトが入った時点以降でないと「式全体が返す値や型が」すぐには分かりませんが、でも、F8キーを一回押しただけで分かる倍のもありますので、そういう使い方もできます。
変数の宣言で、
「特に、固有型のオブジェクト変数を宣言したい時」に、
ウォッチウィンドウでこのように調べれば、
「どの型を使えるか?」
が、
「分かる」、
ということなのです。
なお、ウォッチウィンドウに表示されたものの中で、更に意味のわからない部分を再度、ウォッチウィンドウに追加することもできます。
今回だと、「ThisWorkbook」とか「Sheet1」などです。
これは型の名前じゃないし、なんじゃこりゃ?
と思ったら、それも、とりあえずウォッチウィンドウにブチ込んでみます。
というか、このような場合ですと、
ウォッチウィンドウ上で右クリックして、「ウォッチ式の追加」で追加します。
「ThisWorkbook」とか「Sheet1」を追加すると、以下のようになります。
これを見ると、
「ThisWorkbook」にも「Sheet1」にも「+」マークがついています。
ってことは、
「ThisWorkbook」も「Sheet1」も、「オブジェクトなんだ」とわかります。
あるいは
「オブジェクトを返す ”式” のひとつ」なんだとか、
「オブジェクトを返す何か」なんだ、と分かります。
深い話になるので申し訳ないのですが、ウォッチウィンドウの「型」のところに、「なんでオブジェクトそのものが出てくるんだ?意味不明!しかもまぎらわしい!」と思ってしまうのですが、ホント、なんでそんな風になっているのか、理由はよくわかりません。
ただまあ、ウォッチウィンドウの「型」の列を見て、
・一般データのデータ型の名前
・総称型オブジェクト型の名前
・固有型オブジェクト型の名前
の文言が見えたら、まずはそれだけを変数宣言のヒントにすればいい・・・というチェック方法がひとつある・・・とでも覚えておけばいいと思います。
今日は少ししか説明できませんでしたし、なんだかとりとめのないことばっかりで、意味不明だったかもしれませんが、
このように、ウォッチウィンドウでは、
・他人からもらったプログラム、
・Q&Aサイトでもらった回答のプログラム
・Webのサンプルプログラム
・書籍のサンプルプログラム
などなど、
それらのプログラムのなかで、
「よくわからない部分」を、
こうやってどんどん、テキトーな区切りで(大抵はドットの直前で)
ウォッチウィンドウに放り込んでやれば、
「それを何度も何度も繰り返せば」、
何が何のことを言っているか?
どの単語や式が何を言ってるいるのか?が、
なんとなく見えてくるようになります。
「それを何度も何度も繰り返して」、
「なんで?」「なんでそうなる?」ってことをやらないと、永遠に見えてきませんが・・・。
いずれにしましても、とにかく、
★「プログラムを読み解くカギ、ヒント、その学習の助け」、にすごくなると思います。
ウォッチウィンドウはそのように、VBA初心者の強い味方でもあります。
##############################
##############################
Webに総称型と固有型に関係するヘルプがみつからなかったので、2010のものを引用して載せておきます。
ご参考にしてください。
*************************
★ オブジェクト変数の作成
関連項目 アプリケーション情報
変数は、値以外にオブジェクトへの参照を格納することができます。オブジェクト変数を使うと、オブジェクトを参照するときと同じように操作することができます。たとえば、オブジェクトのプロパティの値を取得または設定したり、そのオブジェクトのメソッドを使用することができます。
オブジェクト変数を作成するには、
1:オブジェクト変数を宣言します。
2:オブジェクト変数にオブジェクトへの参照を代入します。
【 オブジェクト変数の宣言 】
オブジェクト変数は、Dim ステートメント、または他の宣言ステートメント (Public ステートメント、Private ステートメント、または Static ステートメント) を使って宣言します。オブジェクト変数は、バリアント型 (Variant)、オブジェクト型 (Object)、または固有オブジェクト型でなければなりません。有効な宣言の例を次に示します。
Dim MyObject ' MyObject をバリアント型で宣言します。
Dim MyObject As Object ' MyObject をオブジェクト型で宣言します。
Dim MyObject As Font ' MyObject を固有オブジェクト型 (Font) で宣言します。
メモ:オブジェクト変数を宣言せずに使用すると、そのオブジェクトのデータ型は、既定のバリアント型 (Variant) になります。
オブジェクト型 (Object) のオブジェクト変数は、プロシージャを実行するまでオブジェクト型 (Object) が特定できない場合に使用します。オブジェクト型 (Object) の変数は、任意のオブジェクトへの参照を格納できます。
参照するオブジェクトの種類がわかっている場合は、そのオブジェクトの種類を指定してオブジェクト変数を宣言します。たとえば、Sample オブジェクトを利用するアプリケーションで、そのオブジェクトを参照するオブジェクト変数を宣言する場合は、次のどちらのステートメントでも記述できます。
Dim MyObject As Object ' 総称オブジェクト型で宣言します。
Dim MyObject As Sample ' 固有オブジェクト型 (Sample型) で宣言します。
特定のオブジェクトを指定して、固有オブジェクト型として宣言すると、データ型のチェックが自動的に行われると共に、コードの実行速度やコードの読みやすさも向上します。
【 参照オブジェクトのオブジェクト変数への代入 】
オブジェクト変数にオブジェクトへの参照を代入するには、Set ステートメントを使用します。オブジェクト変数に代入できるのは、オブジェクト式または Nothing のいずれかです。オブジェクト変数への代入例を示します。
Set MyObject = YourObject ' 参照オブジェクトを代入します。
Set MyObject = Nothing ' 変数とオブジェクトの関係を無効にします。
Set ステートメントで、キーワード New を使用すると、オブジェクト変数の宣言と、オブジェクトへの参照の代入を同時に記述できます。たとえば、次のように指定します。
Set MyObject = New Object ' オブジェクトを作成して代入します。
オブジェクト変数に Nothing を代入すると、そのオブジェクト変数と変数が参照していたオブジェクトとの関係が無効になります。変数とオブジェクトの関係を無効にすることにより、変数の内容を変更して、参照していたオブジェクトに誤って変更を加えてしまうことを防ぐことができます。また、オブジェクトを閉じた後は、そのオブジェクトを参照しているオブジェクト変数に必ず Nothing に代入するようにすると、オブジェクト変数が有効なオブジェクトを参照しているかどうかを簡単に調べることができます。次にその例を示します。
If Not MyObject Is Nothing Then
' オブジェクト変数が有効なオブジェクトを参照している場合。
. . .
End If
このテストでは、オブジェクト変数が参照しているオブジェクトを含むアプリケーションを、ユーザーが閉じたのかどうかを確実に判断することはできません。
【 オブジェクトの現在のインスタンスへの参照 】
コードの実行中にオブジェクトの現在のインスタンスを参照するには、キーワード Me を使います。現在のオブジェクトに関連付けられたすべてのプロシージャが、キーワード Me を指定して参照されるオブジェクトへのアクセス権を持ちます。オブジェクトの現在のインスタンスに関する情報を別のモジュールのプロシージャに渡す場合に、キーワード Me を使用すると特に便利です。たとえば、モジュールに次のプロシージャがあるものとします。
Sub ChangeObjectColor(MyObjectName As Object)
MyObjectName.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)
End Sub
次のステートメントを使ってプロシージャを呼び出し、オブジェクトの現在のインスタンスを引数として渡すことができます。
ChangeObjectColor Me
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
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
----------------------------------------------------------------------