2009年03月02日

テーブルのVBA操作

この場合の「テーブル」は、当然データテーブル(RangeオブジェクトのTableメソッド)ではなく、Excel 2007の「テーブル」、すなわちListObjectオブジェクトのことです。

最近、仕事で作った作例で、いろいろな用途にListObjectを利用してみたのですが、「これは結構怖いな」と思ったことが何度かありました。

その一例。
そのときの処理を簡単に説明しておくと、1つのシートに一時的なデータを表示し、残しておきたいデータだけをボタンのクリックで別シートにコピーし、表に蓄積していく、というもの。
そのコピー先の表に、ListObjectオブジェクトを利用してみたわけです。

データを記録する表のクリア(初期化)もVBAを使って行うのですが、これは、まずテーブルのデータ範囲全体をClearContentsし、ListObjectをResizeして見出し行とデータ行1行のみにする、という手順にしました。

で、データを転記する際には、ListRows.Countが1でその先頭セルが空白であればその行に、それ以外は1行追加してその行に、という処理を行います。

……ところが、上記の手順で初期化を行ったListObjectでは、ListRowsが1つも存在しない、という状態になってしまうんですね。
(少なくとも1行はあると思うんですが)

まあ、必ず0行と見なされるのであれば、それはそれで書きようもあるのですが、一度保存して開きなおしたら1行になってしまったりと、結構不安定。
結局、何とかチェックする方法を見つけ、必要なときだけ行を追加するようにはできましたが。

こうなってしまう原因は……ひょっとして、2007になって表示されなくなった挿入行と関係があるのかな?(確証なし)。

挿入行の問題もそうですが、2003のも同じListObjectだからと思って油断していると、結構大変な目に遭いそうです。

……ていうか、遭いました。
先に2007で作例を作って、それを2003に移行したら……いやぁ、もう動かない動かない。(^^;)
両方のバージョンで使用したい場合は、まず2003ベースで作るのが正解だと思います。

そんなことも含めて、VBAでListObjectを操作する場合は、いろいろと注意が必要ですよ、ということで。
posted by 土屋和人 at 14:27| Comment(0) | TrackBack(0) | Excel
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/27317504
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック