★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0031:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-14。(エラー回避の基礎15)★ ウォッチウィンドウで「ActiveSheet.UsedRange」のセル範囲やオブジェクト変数「rrr」のセル範囲、マウスで選択したセル範囲を調べる方法と、それによって「何がわかるか?」「わかること」~その3。
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0031
タイトル:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-14。(エラー回避の基礎15)
★ ウォッチウィンドウで「ActiveSheet.UsedRange」のセル範囲やオブジェクト変数「rrr」のセル範囲、マウスで選択したセル範囲を調べる方法と、それによって「何がわかるか?」「わかること」。~その3。
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
長い事間をあけてしまってすみません。
色々と試していたり、確定申告などしていたりで、つい、間が空いてしまいました。
今回も前回の続きです。
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01-26
における、
の図の状態にしておいてください。
「Let ggg = ActiveSheet.UsedRange」と、
「Set rrr = ActiveSheet.UsedRange」の2行が
追記された状態となります。
もちろん、
「Sheet1」には、AとBの列に、
下図のようにセルに値が入っているようにしておいてください。
そして、F5キーを押して、
Stop
の行が黄色くなった状態にしておいてください。
今回は、「Range.Formula プロパティ」とウォッチウィンドウだけで、セル範囲を調査してみたいと思います。
今回も、
(02)「Activesheet.UsedRange」を、ウォッチウィンドウにて、
「その ”実際の入力値 ”を確認する(=表示させる)」・・・、
ということによって、
「Activesheet.UsedRange」のセル範囲が
・実際に(=現実には)どのような範囲になっているのか?
・ちゃんと巷で言われているとおりに(=ヘルプや市販書籍やWeb情報通りに)なっているか?
などなど・・・
ということを「間接的に」「推定する」、「調べる」・・・、
・・・・ということの続きです。
でも前回は「Value2」プロパティで調べる方法を主にご説明しましたので、
今回は「Formula」プロパティでセル範囲を調べる方法について書きたいと思います。
「Range.Formula プロパティ」
「Range.FormulaLocal プロパティ」
「Range.FormulaR1C1 プロパティ」
「Range.FormulaR1C1Local プロパティ」
などを見てみたいと思います。
※参考
今回も、以下の図も参考にしてみてください。
例えば Rangeオブジェクトの取得の場合、どういったプロパティなどが使われるか、の「イメージ」の図です。
あくまでも「イメージ」ですが、下図の「正規ルート」と「ワープルート」の違いなどを良く見てみてください。
「正規ルート」では普通の原則的なセル範囲(A1形式のセル範囲)が取得でき、
「ワープルート」では、「少し便利なかたち(性格が異なったかたち。R1C1形式や使用された部分のみ、数個ずらした、等々)でのセル範囲が取得できます。
(※「ワープルート」=下の図で言うと、オレンジの点線矢印でのRangeオブジェクトのゲット=アクセスのルートのことです。)
※各コレクションオブジェクトの「Item」という名前のプロパティやメソッドは基本、省略されることがほとんどです。(後述)
ただ、「VBAは省略しない方が上達します」。
あと、一口に、例えば「Cells」プロパティと言っても、Application.Cellsもあれば、Worksheet.CellsやRange.Cellsもあって、「それぞれに「微妙に動きが異なる」ので、「親となるオブジェクトとセットで」、「どのCells」オブジェクトなのか、を明確に指定する必要があります。それは「Cells」に限らず、他のプロパティでも同じことが言えます。
(例えば上図だと「Application.Selection」や「Window.Selection」、各種「Item」がそれにあたります。)
なので上図では、その意味で、「親となるオブジェクト」の名前もくっつけた状態で説明してあります。
「ヘルプ(特に2007以降)」や「オブジェクトブラウザ」もこの形式を守っていますので、逆に、このことを知らないと、「ヘルプ」や「オブジェクトブラウザ」が読めません。
ご注意ください。
では早速ウォッチウィンドウを見ていきましょう。
まず前号で
『 あれ?・・・・? するとこれ・・・・ どっかで見た感じと同じですね・・・・。』
と書いたことを思い出してください。
そうです。
『 「Value2」と「ggg」が違うだけで、「型の列」は「Variant/Variant(1 to 4, 1 to 2)」と、同じ内容だ・・・・ 』
というお話でした。
繰り返しになりますが、「Value2」と「ggg」が違うだけで、実際の値の列については
値の列にも「a」や「b」など、列名の部分の入力値 が並んでいました。
では、今回は、
「Variant/Variant(1 to 4, 1 to 2)」
から探してみましょう。
まずはウォッチウィンドウの「Activesheet.UsedRange」の「+」マークをクリックして、ツリーを展開します。下図のようになります。
で、その展開したツリーの中で、「型」の列の中で、
「Variant/Variant(1 to 4, 1 to 2)」
となっているところを探します。
すると・・・
ありますね~~~!
下図のように、「Formula」系のプロパティのところに密集してますね~。
ここが怪しいですね~。
「Range.Formula プロパティ」
「Range.FormulaLocal プロパティ」
「Range.FormulaR1C1 プロパティ」
「Range.FormulaR1C1Local プロパティ」
のところです。
では、このプロパティたちの「+」アイコンを全部展開してみましょう。
下図のようになります。
一目瞭然ですね。
全部同じです。
ということは、
「Range.Value2 プロパティ」
も、
「Range.Formula プロパティ」
「Range.FormulaLocal プロパティ」
「Range.FormulaR1C1 プロパティ」
「Range.FormulaR1C1Local プロパティ」
たちも、
「全部」
「同じ」
ということと、
「Range.Value2 プロパティ」だけでなく、
それらのFormula系のプロパティでも、セル範囲が確認できる、
ということがわかりました。
ただ、このFormula系のプロパティの場合、
「生データ」ではなく、「数式」が入力されていると、
「値」の列に数式が表示されます。(下図参照)
ですので、その場合は少し「値」の確認がしづらくなります。
ただ、
「何行あって・何列あるか?」の部分、
つまり、
「Variant/Variant(1 to 4, 1 to 2)」
の部分は変わりませんので、
セル範囲を知ることはできます。
なお、
「Range.Formula プロパティ」
「Range.FormulaLocal プロパティ」
「Range.FormulaR1C1 プロパティ」
「Range.FormulaR1C1Local プロパティ」
たちの、
それぞれの「働き」については、今回はここでは割愛します。
というか、僕自身、ちゃんとわかっていません(^^)。
なのでご自分でも、それぞれの違いを是非、調べてみてください。
ちなみにですが、
これらのプロパティは全部配列として成立していますので、
例えば
Dim hhh As Variant
Let hhh = ActiveSheet.UsedRange.FormulaR1C1
(※ .FormulaR1C1 の部分は .Formula などでも可)
と書くと、配列変数の「hhh」の中に、セル範囲の値を放り込むことができます。
Dim ggg As Variant
Let ggg = ActiveSheet.UsedRange
(あるいは、Let ggg = ActiveSheet.UsedRange.Value)
を実行したのと同じようなことができます。
(セルに数式が入っていなくて、生データが入っていれば。)
Formula系のプロパティでのセル範囲の確認については以上です。
===============
では今度は「Selection」プロパティを使ってセル範囲を調べてみましょう。
「Selection」プロパティは、WordVBAなどにも存在しますが(AccessVBAには無い)、
ExcelVBAの場合に限って言うと、そのなかには、
「Application.Selection」プロパティと
「Window.Selection」プロパティ
の2つしかありません。
(※これは、オブジェクトブラウザで調べることができます。「Selection」という語句で、Excelライブラリのみを完全一致検索すると、その2つしか出てきません。)
その2つは、
「Selection オブジェクト」という単一のオブジェクトを返す(=ゲットする)、
という働きをするプロパティです。
そして、
「Selection オブジェクト」とは、
「今まさに、ワークシートやグラフシート上で選択されているモノ」
という意味のオブジェクトです。
なので、これを使うと、
「セルをドラッグで選択したモノ」や
「グラフの線や棒などを選択したモノ」、あるいは
「オートシェイプや挿入画像などを選択したモノ」等々が、
「Selection オブジェクト」とみなされて、
「色々と動かすことが可能」になります。
少し整理しますと、
シート上で何かを選択すると
→「Selection オブジェクト」とみなされるのだけれど、
→それをゲットするには、「Application.Selection」プロパティか「Window.Selection」プロパティのいずれかを使う・・・・、
というかたちになります。
ちなみにですが、「Selection」とだけ記述すると、「Application.Selection 」と同じ意味です。
そして、
「Application.Selection 」は、「アクティブ ウィンドウで現在選択されているオブジェクト」
という意味になります。
「Application.Selection = ActiveWindow.Selection」というイメージですね。
(あくまでイメージです。完全にイコールかもしれないし、そうじゃないかもしれません。未調査です。ウォッチウィンドウなどで調べて、中身がまったく同じならそう理解してよいのかもです))
また、Selection」プロパティには
「Application.Selection」プロパティと
「Window.Selection」プロパティの
2つしかないため、
つまり、親に位置するオブジェクトは
「Application」(つまりExcelのこと)か、
「Window」(アクティブなウィンドウや指定したウィンドウ)などにしかなりえません。
つまり、「WorksheetやWorkbook」などは、Selectionの親の位置には書けない決まりになっています。
なので、
「Activesheet.Selection」とか「ActiveWorkbook.Selection」などと書くと、エラーになります。
で、今回は、
「セルをドラッグで選択したモノ」
を
「Selection オブジェクト」としてゲットし、
それによって、セル範囲を調べましょう・・・ということをやりたいと思います。
なお、セル範囲を「Selection オブジェクト」としてゲットすると、
そのゲットしたものをオブジェクト変数やVariant型の配列に代入できるようになります。
つまり、これまで
Dim rrr As Variant
Set rrr = ActiveSheet.UsedRange
とやっていたものを・・・、
ActiveSheet.UsedRange と同じセル範囲を、
事前にドラッグで選択しておけば、
Dim rrr As Variant
Set rrr = Selection
(※ Selection の部分は、Application.Selection や ActiveWindow.Selection などでも可)
と書いても、同じものを変数に代入できる、ということになります。
今回は、ついでに、その辺のことも少し見ていければと思います。
では、進めましょう。
いったんプログラムをF5で最後まで実行し、終わらせます。
そうしましたら、まずは、シートの方で、値の入力された範囲をドラッグ選択します。(下図)
できましたら、ウォッチウィンドウに行き、先ほどまで使っていた、「ActiveSheet.UsedRange」の行を消します。
(「ggg」と「rrr」は残します。)
そのあと、以下の7つの「式」を新たにウォッチウィンドウに追加してください。
やりかたは・・・・
ActiveSheet.Range.Selection
ActiveSheet.Selection
ActiveWindow.Selection
ActiveWorkbook.Selection
Application.ActiveWindow.Selection
Application.Selection
Selection
↑この7つの式をまずはイミディエイトに丸っとコピペします。
で、行の先頭文字の前の白い部分(少し狭いですが)をクリックすると、
1行分がすべて選択されますので、そうなった状態のまま、
その行をウォッチウィンドウにドラッグします。
7つ全部やり終わると、下図のようになります。
その状態で、
再度、プログラムをF5キーで実行します。
変数の「ggg」と「rrr」にも値が代入され、以下のようになります。
長くなりそうですので、詳しい説明は次回にしたいと思います。
==============================
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
----------------------------------------------------------------------
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
発行システム:『まぐまぐ!』 http://www.mag2.com/
配信中止はこちら https://www.mag2.com/m/0001691660.html
----------------------------------------------------------------------