シートオブジェクトにPropertyを生やそう!
シートモジュールにPropertyを生やそう!
シートモジュールにProperty
を設置すると便利、というだけの話。
準備
たとえば、ワークシート(オブジェクト名は「Sheet1
」)上に、次のようなリストがあるとする。
とりあえず超シンプルな表にした。
Propertyを設定する
このリスト部分を、Sheet1
オブジェクトのProperty
にしてしまおう、という試み。
後々の拡張性も考えて、次のような仕様にした。
仕様
- 列数は定数で指定
- 行数は伸び縮みすることを見越して指定列の最終セルをその都度取得
以上。
コーディング
Sheet1
モジュールに次のようにコードを書く。
リスト1 Sheet1モジュール
Option Explicit 'Constants' 'リスト領域の列数' Private Const LIST_AREA_WIDTH As Long = 4 'リスト左上端のセルアドレス' Private Const LEFTTOP_ADDRESS As String = "A1" Public Property Get ListAreaRange( _ Optional ByVal targetColumn As Long) As Range '引数省略時は「1」にする。' If targetColumn = 0 Then targetColumn = 1 '一旦基準セルを変数に格納。' Dim rng As Range Set rng = Me.Range(LEFTTOP_ADDRESS) 'リストのタテ方向のサイズを取得。' Dim verticalSize As Long verticalSize = Me.Cells(Me.Rows.Count, targetColumn).End(xlUp).Row verticalSize = verticalSize - Me.Range(LEFTTOP_ADDRESS).Row + 1 '変数rngをリサイズする。' Set rng = rng.Resize(verticalSize, LIST_AREA_WIDTH) Set ListAreaRange = rng End Property
リストの列数と、左上端セルのアドレスは、定数で指定している。変更があった場合は書き換えればよい。
Property Get
プロシージャ内での処理はコメントのとおり。なるべく変更に強い書き方を試みた。
リスト最終行の取得は、おなじみのEnd
プロパティを用いるやり方にしたが、気に入らなければ他のやり方にしたら良いと思う。
今回のようなリストなら、
Set ListAreaRange = Me.Range(LEFTTOP_ADDRESS).CurrentRegion
でも良いのだが、たとえば
このようなリストで、「会員番号」の欄にあらかじめ値が入っていて、2列目以降にデータを抽出してきて表を完成させるような場合、CurrentRegion
プロパティを使うやり方では不要な部分まで全部取得してしまうので、今回のようなやり方にした。
実験
イミディエイト・ウインドウに
?Sheet1.ListAreaRange.Address
と打ち込んで[Enter]!
バッチリ!
おわりに
シートのよく使う部分については、こんなふうにProperty
を生やしておくと便利だし、命名次第では非常にreadableになるのでオススメです。
処理の手順をコーディングするのではなく、シートオブジェクトの機能としてオブジェクトに封印してしまい、それを利用するだけ、というのはオブジェクト指向的なアプローチでもあると思う。