2010年05月24日

ListObjectについて(追加・削除)

お久しぶりです。今回はListObjectの行・列の追加・削除について書いてみたいと思います。

ListObject自体はすごく便利なんですが、動きにクセがあるというか
変な使い方をするとレイアウトが崩れたりするので、
分かって使わないと使いにくい機能ですねぇ。




■行を追加する
.ListRows.Add([インデックス])
例:Sheet1.ListObjects(1).ListRows.Add

リストに行を追加します。
インデックスを指定すれば指定位置に挿入、
指定しなければ最後尾に追加します。


■行を削除する
.ListRows(インデックス).Delete
例:Sheet1.ListObjects(1).ListRows(1).Delete

指定した行を削除します。
データが0行の状態で呼ぶとエラーを吐くので注意。


■列を追加する
.ListColumns.Add([インデックス])
例:Sheet1.ListObjects(1).ListColumns.Add

列を追加します。
インデックスを指定すれば指定位置に挿入、
指定しなければ最後尾に追加します。


■列を削除する
.ListColumns(インデックス).Delete
例:Sheet1.ListObjects(1).ListColumns(1).Delete

指定した列を削除します。
データが1列の状態でこれを呼ぶとリストそのものが消えてしまいます。注意。


全体的にわかりやすいメソッドですが・・・

■注意すること
・現在の行・列の数を気にしたプログラミングをしないと、思わぬエラーを起こします。
 (0行で行削除、1列を削除してリストがそもそも消える、等)

・行のAddについては以前の記事にも書いたように、
 1行目を挿入しようとするとヘッダの書式をコピーするクソ仕様なので気を付けましょう。

・周囲に別のリストがある場合、行や列の追加・削除ができないケースがあります。
 この場合、Add・Deleteメソッドがエラーを吐きます。
 具体的には、「行(列)を追加・削除しようとしているリスト自身の下(右)に、
 リスト自身の列範囲を超えるリストが存在する場合」のようです。

List1



 例えばこんな場合。

 どうやらAdd・Deleteメソッドはセルの挿入や削除と同じ処理をしているようで、
 その挿入・削除処理によって下のリストの一部をシフトしようとしてしまう場合に、
 エラーとするようです。
 (同じ環境下では手動でもエラーとなります。)
 逆に下のリストが自分自身の列範囲以内の場合、
 行挿入してもリストがまるごと下にシフトしてくれます。

 この辺りはどうにも仕様が微妙・・・(;´ω`)

 手入力でリストに入力する場合は下のリストにくっつくまで入力が可能だったり、
 でもその間に何かデータがあったらそこには行が伸びてくれなかったり、
 リストではなくただの表だった場合はリストの列範囲の部分だけセル挿入されて表が断裂したり。

 使ってみると、うん、まぁそうかorz、という納得感はあるんですが、VBAアプリを組むと考えた場合、
 この部分は考慮すべきことが多くてちょっと危険です。
 デザインの時点で
  ・1シートにリストを何個も置かない
  ・リストの下に(列が変わりうるなら右も)データを置かない 
 ように気を配っておいた方が良さそうです。



lig at 13:20│Comments(1)TrackBack(0)Excel | VBA

トラックバックURL

この記事へのコメント

1. Posted by lig   2010年05月25日 13:56
テストコメントしてみる。

コメントする

名前
URL
 
  絵文字