複数フォルダ内のWord文書で文字列を一括置換するVBAマクロの使い方

Visual Basic

業務で大量のWord文書を扱う際、複数のフォルダに保存された文書内の特定の文字列を一括で置換したい場合があります。手作業では非常に時間がかかるため、VBAマクロを活用することで効率的に作業できます。

ここでは、複数のフォルダ内のWord文書に対して文字列を一括置換する方法を、具体的なコード例とともに解説します。

必要な準備

まず、VBAマクロを実行するにはWordで「開発」タブを表示し、マクロの作成が可能な状態にしておく必要があります。また、対象となるフォルダのパスを確認しておきます。

複数フォルダを扱う場合は、親フォルダのパスを指定し、サブフォルダ内も検索できるようにマクロを設計します。

VBAマクロの基本構造

以下は、指定したフォルダ内のWord文書を順に開き、特定の文字列を置換する基本マクロです。

Sub BatchReplace()
Dim fDialog As FileDialog
Dim folderPath As String
Dim fileName As String
Dim doc As Document
folderPath = “C:\\Documents\\TargetFolder” ‘ 対象フォルダのパス
fileName = Dir(folderPath & “\\*.docx”)
Do While fileName <> “”
Set doc = Documents.Open(folderPath & “\\” & fileName)
With doc.Content.Find
.Text = “置換前文字列”
.Replacement.Text = “置換後文字列”
.Execute Replace:=wdReplaceAll
End With
doc.Close SaveChanges:=True
fileName = Dir()
Loop
End Sub

このコードでは、Dir関数を使用して指定フォルダ内の.docxファイルを順に処理し、Findオブジェクトで文字列を置換しています。

サブフォルダ内も含めて一括処理する方法

複数階層のフォルダに対応する場合、再帰的にフォルダを巡回するマクロを作成するのが有効です。

以下は再帰処理の例です。

Sub ReplaceInSubfolders(folderPath As String)
Dim fso As Object
Dim folder As Object
Dim file As Object
Dim subFolder As Object
Dim doc As Document
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set folder = fso.GetFolder(folderPath)
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Name)) = “docx” Then
Set doc = Documents.Open(file.Path)
With doc.Content.Find
.Text = “置換前文字列”
.Replacement.Text = “置換後文字列”
.Execute Replace:=wdReplaceAll
End With
doc.Close SaveChanges:=True
End If
Next file
For Each subFolder In folder.SubFolders
ReplaceInSubfolders subFolder.Path
Next subFolder
End Sub

親フォルダを指定してこのマクロを呼び出すことで、全てのサブフォルダ内の文書も対象になります。

実際の運用例と注意点

例えば、社内マニュアルの更新で「旧製品名」を「新製品名」に一括置換する場合、上記マクロを使用すると、数百ファイルでも短時間で更新が完了します。

注意点として、置換対象の文字列やファイルバックアップを事前に確認しておくことが重要です。誤って重要な内容を置換すると、復旧に手間がかかるためです。

まとめ

複数フォルダに保存されたWord文書の文字列を一括置換するには、VBAマクロを活用するのが最も効率的です。基本的なFindオブジェクトの置換方法と、再帰的にフォルダを巡回する方法を組み合わせることで、業務時間の大幅な短縮が可能になります。

マクロを作成する際は、必ず事前にバックアップを取り、テスト環境で動作確認を行ってから本番環境で実行することをおすすめします。

コメント

タイトルとURLをコピーしました