2010年11月3日水曜日

◆Wordで見出し1スタイルに「第1章」の形式で段落番号を振る

苦労したぁー。

$word = new-object -comObject "Word.Application"
$word.Visible = $true
$word.Documents.Open("d:\desktop\ああああ.docx") | Out-Null
$word.ListGalleries.Item(2).ListTemplates.Item(1).ListLevels.Item(1).NumberFormat = "第%1章"

foreach($para in $word.Application.ActiveDocument.Sections.Item(1).Range.Paragraphs){
    if($para.Style.NameLocal -eq "見出し 1"){
        $para.Range.ListFormat.ApplyListTemplate($word.ListGalleries.Item(2).ListTemplates.Item(1),$true)
    }
}

特定のセクションにだけ振りたかったのでSection指定が入っているが、通常はActiveDocument.Paragraphsで良いと思う。

WordやExcelをVBAで扱うにはマクロ記録したものをカスタマイズするのが簡単。
とはいえ、マクロ記録だけではできない処理もある。
マクロ記録のコーディングは冗長でわかりづらいという欠点もある。
なので、ある程度の前提知識が必要となってくるのだが、小生あまり知識がないので結構戸惑った。

今回、章ごとに作ったWord文書を1つにまとめて先頭に目次を付けるという作業を自動化したのだが、その際に段落番号を振る必要があった。
Wordのオブジェクトは、ドキュメント・セクション・段落といった階層になっているので上からたどって段落コレクションを取得し、そのスタイルが「見出し1」だったら段落番号を振るという処理を行っている。(これだけでも結構調べるのに時間がかかった)
ここで嵌ったのが、通常コレクションのItemプロパティはデフォルトプロパティなので、その記述を省略できる。実際マクロ記録でも省略されている。
しかしPowershellで扱うときにはこれが省略できないようだ。
エラーになり、あれ添え字の括弧は[1] だっけ?などと右往左往してしまった・・・・。
同様にスタイル名もマクロ記録ではParagraph.StyleなのだがPowershellではNameLocalを指定する必要がある。

また、$word.ListGalleries.Item(2).ListTemplates.Item(1)といった感じで、どのギャラリーのどのテンプレートを段落番号に使うかという指定をしなければいけない。
ここでギャラリーとはこの部分。
20101103115814 
左から1,2,3となっているようだ。
今回は階層を持たない単純な章番号を振りたかったので真ん中の2を指定。
その中の以下がテンプレート。
image
赤枠で囲った部分がコレクションとして1から順番にINDEXが振られている。
しかし、な、なんとしたことか私が使いたい章番号にはINDEXが振られていない。コレクションを一つずつ調べてみてもやっぱり無いのである。自前で「第1章、第2章」といったリストを追加してみてもやはりそれにはINDEXが振られない(コレクションに追加されない)
しばし途方に暮れた後、マクロ記録をもう一度見直してやっと判った。
どうやら、先頭の「章」付きのリストは「1.2.3.」といいうテンプレートにNumberFormatプロパティを追加することによって実現しているようなのだ。NumberFormatの指定はこんな感じ。
NumberFormat = "第%1章"
判ってしまえばなんてことはないのだが・・・。
自前で追加したリストだけがコレクションに追加されないだけならすぐに気付いたかもしれないが標準で組み込まれている章番号もこの仕掛けだったためにだいぶ戸惑ってしまった。

<追記>----------
違った、章番号付きのやつは以前自分で追加したやつでした。
追加するといきなりグローバルに登録されちゃうのね・・・。
---------------------

いちばん最後の$trueは前のリストから連番で番号を振る指定。
「見出し1」スタイルをすべて選択してから章番号を振れば一発なのだが、離れた場所にある段落を同時に選択する方法が判らなかった。
マクロ記録では段落の選択にマウスが使えなのでマクロ記録にも頼れない。
それらしいオブジェクト(RangeとかSelectionとか)のメソッドを眺めてみたがそれらしいのが見当たらず。
まぁ今回の方法でも問題はないので良しとした。

0 件のコメント:

コメントを投稿