★独学者が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を爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):~バックナンバー~

----------------------------------------------------------------------
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
発行システム:『まぐまぐ!』 http://www.mag2.com/
配信中止はこちら https://www.mag2.com/m/0001691660.html
----------------------------------------------------------------------