初心者のためのExcel エクセルマクロVBA入門-実践基礎:Rangeオブジェクトを掘り下げる
エクセル操作するならRangeオブジェクトは欠かせない・・・
今日はRangeオブジェクトについてですが・・・Rangeオブジェクトはエクセルマクロを扱い始めた時に、結構気軽に出てきます。単純にマクロの記録を使っただけでも、、、
Sub Macro1() Range("A1").Select End Sub
なんて普通に出てきます。しかし、意外とちゃんとわかってる人ってあんまりいない気もします。というか私がエクセルマクロがど素人だったころやっぱりこれで、ハマったのですよ。RangeRangeってなんや!オブジェクト?はぁ?
となったもんです。しかし、やっぱりRangeオブジェクトはエクセルを操作する上で欠かせないものです。今回は少しRangeオブジェクトを掘り下げてみたいと思います。
普通に記述するRangeはオブジェクトではなくてプロパティっす。
( ゚д゚)?ぽかーん
でしょうが、まぁ聞け。とりあえずRangeオブジェクトのヘルプを見てみます。
セル、行、列、1 つ以上のセル範囲を含む選択範囲、または 3-D 範囲を表します。 備考 Range オブジェクトを取得するプロパティおよびメソッドを次に示します。 ・Range プロパティ ・Cells プロパティ ・Range および Cells ・Offset プロパティ ・Union メソッド
これみるとわかりますがRangeオブジェクトを取得するにはRangeプロパティとかCellsプロパティとか使えって書いてます。つまりさっきの
Range("A1").Select
は、WorksheetオブジェクトのRangeプロパティを書いているだけなのです。これでRangeオブジェクトを取得し直している。ということになります。
( ゚д゚)ガーン・・・
実は似たような記述はたくさんあって、
Sheet1.Cells(1, 1)
これなんかもCellsプロパティを使って、Rangeオブジェクトを取得し直していることになります。つまり「参照」しているわけです。じゃあ、どうやってRangeオブジェクトを操作するのさ?ということになりますが、結果的に取得し直されているので、RangeオブジェクトのValueプロパティとかが使えるのです。その結果としての記述が・・・
Sheet1.Range("A1").Value = "こんにちは"
となるわけですね。特に認識させる必要はないと思って書いてませんでしたが、実は・・・的な感じですね。ちゃんとオブジェクトとして使いたいんだけど!!という時は・・・
Sub test() Dim objRange As Range objRange = Range("A1") With objRange .Value = "おはよう" .Interior.ColorIndex = 3 End With End Sub
というように、Rangeオブジェクトを格納する変数を作ってそこへ代入すれば、その変数はもうオブジェクトとして機能します。ですので今まで散々Rangeから書いてるマクロの記録は不完全ですぜ。ちゃんとシートオブジェクト指定しないとおかしな感じになりますよー。というのはこういう理由があるのです。
だって、Rangeプロパティを記述するなら「どのオブジェクト」プロパティかわからないとダメでしょ?
プロパティはオブジェクトを構成する1つですよね?オブジェクトはメソッドとプロパティで出来ているのですから。そのプロパティだけぽつんと書いてどうするの?ということです。
もうすげー何回も言ってますが、
オブジェクトを正しく指定するようになることがマクロマスターへの唯一無二のコツ!
ということです。Rangeオブジェクトだと思って、プログラム書いていたと思うんですよ。でもそれプロパティなんです。それだけだとどのオブジェクトの部品なのかわからないんですよ。だから、WorkSheetオブジェクトから書きましょう。と言っているのです。
いかがでしたでしょうか?
理解してもらえたかな・・・
Rangeオブジェクトは頻繁に使う癖に意外とわかりにくいです。同じRangeなのにプロパティだったりオブジェクトだったり・・・混乱することが結構ありますので、ここらでしっかりと勉強しておきましょう。
今日はここまで。
かしこ