Tableオブジェクトの怪(Word)
Tableオブジェクトの怪(Word)
実に気色悪い現象に出くわしたので報告。
表の余分な行を削除する
たとえば、Wordでドキュメント内の表にデータを差し込むようなとき、
このように、使用しない行が生ずることがある。
宛先によってデータの数が異なるとき、テキトーな上司なら「ま、別にええんちゃう?」で済むのだが、神経質な上司だったりすると、「空白行は消さんかい!」などということに。
そこで、マクロで空白行を削除することを企てるのである。
マクロで空白行を削除する
次のようなコードで、空白行の削除を試みる。
リスト1
Private Sub test03() Dim tbl As Table Set tbl = ActiveDocument.Tables(1) '……(1)' Dim i As Long With tbl '……(2)' For i = .Rows.Count To 2 Step -1 '……(3)' If .Cell(i, 1).Range.Text = Chr(13) & Chr(7) Then '……(4)' Call .Rows(i).Delete Else Exit For End If Next End With End Sub
まず、(1)の
Set tbl = ActiveDocument.Tables(1)
で対象の表(Table
オブジェクト)を変数tbl
にぶち込む。
(2)の
With tbl
で記述をまとめておいて、(3)の
For i = .Rows.Count To 2 Step -1 If .Cell(i, 1).Range.Text = Chr(13) & Chr(7) Then '……(4)' Call .Rows(i).Delete Else Exit For End If Next
のFor
ループ。
「削除するときはケツから!」の原則に基づいて、Table
オブジェクトのRows
コレクションのCount
プロパティの値、すなわち表の行数からスタートして、2
行目まで繰り返すことにする。
ループ内では、(4)の
If .Cell(i, 1).Range.Text = Chr(13) & Chr(7) Then
で、1列目に文字が入っているかどうかを判定。
Wordの表では、文字の入っていないセルにはChr(13)
とChr(13)
が入っている。
セル内に文字が入っていなければ
Call .Rows(i).Delete
で行ごと削除。
セル内に文字が入っていれば、(上の行から順にデータを入れている以上)これ以上削除する行はないと言うことだからElse
ブロックに進んで
Exit For
でループを抜ける。
実行
これで基本的にはうまいこと行くはずである。
しかし、ループに突入し、一つ目(つまり、5行目)を削除した途端、
工工工エエエエエエェェェェェェ(゚Д゚)ェェェェェェエエエエエエ工工工
突然表の横幅がビニョーーーーンと伸びてしもたやないか……。
[Table].Columns
コレクションからColumn
オブジェクトを取得してWidth
プロパティを調べてみる。
上が無残にも横に引き延ばされてしまったTables(1)
、下があらかじめ同じものをコピッペしておいたTables(2)
である。
このように、全然違うサイズに変わり果ててしまっていることがわかる。
おわりに
さっぱりわけがわからん。
何故、何故なんだ~?!(2回目。)