2010年03月11日

ListObjectについて


ListObjectどころかリスト機能も知らない人が多いかなーと思ったので、
もう少し基本的なところを書いてみます。
そもそもリスト機能って何ぞ?という方はAllAboutあたりを見てみると分かるかと。

Excel2003でリストを作成すると、VBAではListObjectとして取得することができます。
ListObjectを使用すると、わざわざ表の位置をセル座標で指定したりする手間がなくなり、
保守性が上がります。

以下、ListObjectを使った、表のコントロールいろいろ例。




■表そのもの
 <シート名>.ListObjects.Item(<リストの名前もしくはインデックス>)
 例:Sheet1.ListObjects.Item(1)
   Sheet1.ListObjects.Item("リスト1")

 リストの名前を文字列で指定しても取得できます。
 が、その名前は普通の操作で確認・変更できるメニューが無いようです。orz
 どうやらVBAでプロパティをいじるマクロでも組まないと変更できなさそう。
 インデックスは、1個目のリストは1と付くので、リストの数が増えるのでなければ数を指定してしまってもよいかも。

■表全体の範囲
 .Range
 例:Sheet1.ListObjects.Item(1).Range

 これなら表の範囲やレイアウトが変更されてもマクロを変えなくて済みますね。( ´∀`)

■データ部分の範囲
 .DataBodyRange
 例:Sheet1.ListObjects.Item(1).DataBodyRange

 データそのものだけの範囲を取得します。
 1件もデータが存在しない場合はこのプロパティはエラーとなってしまうので、
 事前にデータが存在するかどうかを確認しましょう。
 データが0件でマクロがエラー吐いた、ってバグはよくありそうです。

■データの件数を取得
 .ListRows.Count
 例:Sheet1.ListObjects.Item(1).ListRows.Count

 このプロパティで件数が確認できます。
 これが0なら、データは0件。

■データの1行を取得
 .ListRows.Item(インデックス)
 例:Sheet1.ListObjects.Item(1).ListRows.Item(1)

 Sheet1.ListObjects.Item(1).ListRows.Item(10).Range.Select
 と書くと、リストの中の10行目のデータを1行、選択してくれます。
 だんだんプロパティが長くなってきます(;´∀`)

■データの1列を取得
 .ListColumns.Item(インデックスまたは項目名)
 例:Sheet1.ListObjects.Item(1).ListColumns.Item("金額")

 インデックスの数値を入力しても選択できますが、
 レイアウトが変更されても柔軟に対応するためには、項目名を指定したほうがよいでしょう。
 (項目名が変わったら同じことですが・・・)
 余談ですが、一つのリスト中には同一の名称を持つ項目は作成できません。
 作成しようとすると、自動的に2以降の番号が付加されます。


長くなってきたので今回はここまで。
次回は操作関連の事か、飽きたら別の話題に(´・ω・)

 ========================================
2010.05.21追記:
 この記事ではItem(1)とか書いてますが、
 このプロパティは省略できます。
 例えば、
   ListObjects.Item(1) という文は
   ListObjects(1) と同じ意味です。
 これならもう少し文を短くできますね。



lig at 18:50│Comments(0)TrackBack(0)Excel | VBA

トラックバックURL

コメントする

名前
URL
 
  絵文字