エクセルVBAでよく使うコードの備忘録。VBAでワードファイルを操作して、ドキュメントのヘッダー内で特定の文字列を置換するするコード。
事前準備
VBAでワードファイルを操作するには、参照設定が必要です。VBAのコードエディタから「ツール > 参照設定」と進み、「Microsoft Word XX.X Object Library」にチェックを入れておきます。
ヘッダー内の指定文字列を置換する
ヘッダー内での置換を行うには、まずヘッダーの情報がどのように格納されているかを知らなければなりません。「Word.Document」オブジェクト「Sections」内の「Headers」がこれに該当します。ここで気を付けないといけないのは、ワードではセクションを区切ることによりそれぞれのセクションごとに別のヘッダーを付けることが可能になっている点です。これに対応して、Sectionsはオブジェクトの配列として与えられており、その下にあるHeadersも配列となっています。そのため、すべてのセクションのすべてのヘッダー内をすべて置換の対象にするには、これらの配列をすべて検索する必要があります。
なお、サンプルコードを使用する際はカッコに囲まれた部分([***])を自分のプログラムに合わせて変更してください。
ちなみに、フッターを置換する場合はHeadersをすべてFootersにすればOKです(詳細はこちら)。
サンプルコード
Public Sub ReplaceInHeaders()
'--- Wordのアプリケーションオブジェクト ---'
Dim objWord As Word.Application
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
'--- ドキュメントオブジェクト ---'
Dim objDoc As Word.Document
Set objDoc = objWord.Documents.Open("[ワードファイルのパス]")
'--- 置換前の文字列 ---'
Dim strTarget As String
strTarget = "[置換前の文字列]"
'--- 置換後の文字列 ---'
Dim strReplaced As String
strReplaced = "[置換後の文字列]"
'--- セクション・ヘッダー数を格納する変数 ---'
Dim i_n As Long
Dim j_n As Long
'--- 全てのセクション・ヘッダーでループ ---'
Dim objFind As Word.Find
Dim i As Long
Dim j As Long
i_n = objDoc.Sections.Count
For i = 1 To i_n
j_n = objDoc.Sections(i).Headers.Count
For j = 1 To j_n
'--- 各セクション・ヘッダーで置換を実行 ---'
Set objFind = objDoc.Sections(i).Headers(j).Range.Find
objFind.ClearFormatting
objFind.Text = strTarget
objFind.Replacement.ClearFormatting
objFind.Replacement.Text = strReplaced
Call objFind.Execute(Replace:=Word.wdReplaceAll)
Next j
Next i
'--- ドキュメントを閉じる ---'
objDoc.Close
'--- ワードを閉じる ---'
objWord.Quit
End Sub