2010年11月12日金曜日

◆Wordのフィールド文字列を置換する

複数のWord文書のフィールドコードオプションをまとめて置換したいことがあった。
フィールドの置換といっても通常の文字列置換とほとんど変わりはない。
置換前に、

$word.ActiveWindow.View.ShowFieldCodes = $true

とやってフィールドコードを表示させておけば良いだけだ。
以下のコードは目次のフィールドコードの後ろにブックマーク範囲を指定するオプションを追加している。フィールドコードは通常 Alt + F9 ですべて表示できる。
(とりあえず、単一文書を置換している)
20101112234005


function Main{
    $InputPath = "D:\desktop\test.docx"

    $word = new-object -comObject "Word.Application"
    $word.Visible = $false
    [void]$word.Documents.Open($InputPath)

    #置換するためフィールドコードを表示しておく
    $word.ActiveWindow.View.ShowFieldCodes = $true

    $findText = "\z \u"
    $ReplaceText = "\z \u \b ブックマーク1"
    $n = $null
    $ReplaceAll = 2  #全部置換
    $Forward = $true

    $word.Selection.Find.Execute($FindText,$n,$n,$n,$n,
                    $n,$Forward,$n,$n,$ReplaceText,$ReplaceAll)
                   
   #全選択しフィールドを最新にする
    [void]$word.Selection.WholeStory()
    [void]$word.Selection.Fields.Update()
    $word.ActiveWindow.View.ShowFieldCodes = $false
    pause

  if($word){
    #保存して終了
    [void]$word.Application.ActiveDocument.Close()
    [void]$word.Quit()
  }

}

function Pause
{
    Write-Host "続行するには何かキーを押してください . . ." -NoNewLine
    [Console]::ReadKey($true) | Out-Null
    Write-Host
}

Main

それほど難しいところはないのだが、Find.Executeメソッドの引数は試行錯誤した結果、とりあえず上記のように最低4つ指定すればよいようだ。

また、フィールドオプションを置換した後、最新にUpdateしているのだが、環境によっては表示が更新されないこともあるようだ。

念のため、印刷前にフィールドを更新するオプションを有効にしたほうが良いと思う。
image

0 件のコメント:

コメントを投稿