Word VBA で表を作る
業務でWordVBAの小物を作ることを迫られ,試行錯誤したことのメモ
やりたいことは,あるデータ構造をwordファイルに起こすだけ.
WordVBAの開発もExcelと同様にマクロの記録で大概はなんとかなる(ことが多い).
今回,なんとかならなかったのが表(Table)の作成である.
表は列数,行数共に不定でレイアウトも様々であり,
列幅もマチマチ(こんな風につくれ っていう見本がある),
いたることろでセルの結合を行う必要まであった.
[方針]
今回の表作成の方針は,1行M列の表作成し,直前の表に結合する.
表の結合は表と表の間の改行を削除すれば自動的に行われる.
この繰り返しでN行M列(Mは行毎に異なっても良い)が完成する.
(この他に行の挿入なども試したが不都合が多かった)
[設計]
・1セル単位の構造体CellProperty
・CellPropertyの配列を引数に1行M列の表を作成するメソッドaddTable
・セルを垂直方向に結合するメソッドmergeCell
□CellProperty
・文字列
・列幅(%)
・背景色
□addTable
引数1.CellPropertyの配列
引数2.直前の表と結合するかフラグ
1.カーソルを最下へ移動
改行1回(表の直下に新たな表を作成できないため)
2.配列の要素数を取得
3.2の取得値をMとして1行M列の表を作成
4.配列の要素から列幅を3で作成した表に設定
表の幅をウィンドウサイズに合わせて,
列幅を固定する ←レイアウト上,超重要
5.配列の要素から文字列と背景色を3で作成した表に設定
6.表の結合フラグが有効の場合は1の改行を削除
□mergeCell
引数1.結合対象の列番号
1.表の行を外側ループとして,その行の対象列のセルを基点に
その下セル以下を内側ループとして文字列を比較する
2.1の結果が真であれば,結合数カウンタをインクリメント
また,被結合セルの文字列を空にする
1の結果が偽であれば3へ
3.結合数カウンタが0より大きければ,
1の基点から結合数カウンタ数だけ選択してして結合
また,外側ループのカウンタに結合数カウンタの値を加える
(被結合セルは存在しなくなるため)
addTableとmergeCellを呼ぶサブメソッドを作り,
そのサブメソッドを統括するメインメソッドを作れば完成となる
[感想]
WordVBAの操作単位はカーソルであり,セル単位のExcelとは勝手が違うことに苦戦した.
また,Office共通のお節介昨日にも手をやいた.
表に特別な設定を施さない場合,単語長が列幅を超えると勝手に拡張してしまうのだ.
tiwtterでなんでなん?とつぶやいたら親切な方が教えてくださった.ありがとう(´;ω;`)
ついでにcolorIndexと色の対応関係を確認するメソッドも作ってみた.
何故かExcelと比べてだいぶ少ない.なんでなん?
―追記 20120509―
垂直セル結合の際に,行がページを跨ぐと結合セルの選択範囲がおかしくなるもよう
列幅固定(対象テーブル.AllowAutoFit = False)の直後くらいに,
行のページ跨ぎ禁止(対象テーブル.Rows.AllowBreakAcrossPages = False)を行うと
垂直セル結合で隣のセルまで巻き込んで結合することはなくなる
―追記 20120523―
word2007以降は新たなプロパティが追加されているもよう
2003でエラーが出る場合はその行をコメントアウトしてください(表の追加部分かな)
あと,動作も2003では不安定かもしれない.特にセルの結合.
■不安定な動作
基点セル.Select
Selection.move方向 Extend:=wdExtend
Selection.Cells.Merge
どうやら2003はセルの拡張選択が不自由らしい.
セルでもないところ掴んでマージできないとエラーを出しやがる
■安定かもしれないコード
基点セル.Merge(末端の非結合セル)
普通はこのように書くべき.マクロ記録を頼りすぎてはいけない(すみません
デバッグの必要もなければ描画もやめてしまえば安定感も増すかも
Application.ScreenUpdating = False
...処理
Application.ScreenUpdating = True