こんにちは! 健史(たけふみ)です。
WORDファイルで保管されている文書の文字列、例えば
・組織変更によりマニュアルなどに記載されている部署名を一括で修正したい
・おのおの作成・修正された文書の'作成日'や'更新日'を揃えたい
ということありませんか。
プログラムで指定したフォルダ内のWORDファイルの文字列を修正する処理を作成してみました。
尚この記事は、Excel-VBAを起動して貼り付ければ動作することを目指しています。
Excel-VBAの構造、起動方法、実行方法などを理解されていない方は、以下の記事を参照しながら一度やってみてから対応されることをお勧めします。

実行中に発生したエラーの対処法は、上記記事の2.エラーが発生したときの対処法に記載しています。(この段落のリンクから直接遷移します)
プログラムの作成と実行
今回のサンプルプログラムは、
です。
単に文字列を置き換えるだけであればテキストファイル同様にWordファイルも、フリーソフト”サクラエディタ”の「Grep置換」でできますし、ニーズとしては多くないでしょう。
ですが、Excel-VBAでも「こんなこともできるんだぁ!」ということを知って頂ければと思います。
プログラムの概要は以下の通りです。
・所定のファルダ(IN)にある拡張子が".doc"となっているファイルを順次読み込み、"2020/05/01"~"2020/05/30"となっている文字列を"2020/05/31"に置き換える
・置き換えた後に別の所定フォルダ(out)に書き込む
尚、私の使っているWordは古いので拡張子が".doc"ですが、最新版をお使いの場合には".docx"と読み替えます。
>
>
イメージは以下の通りです。
実行前後
↓
対象ファイルを上書きせずに別フォルダに書き込むのは、万が一間違えて置き換えてしまった場合、元に戻すのがたいへんだからです。
手で対応する場合には、修正前にバックアップしておいて上書きするとして
①.エクスプローラでフォルダを開き、対象ファイルを開く(ダブルクリック、もしくは、[Enter]で)
②.編集(E)-置換(E)で置換画面を開く
③.検索する文字列(N)に"2020/05/01"、置換後の文字列(I)に"2020/05/31"を入力
④.すべて置換(A)をクリック
⑤.「③に戻り、検索する文字列(N)を"2020/05/02"へ変更、④(すべて置換(A)をクリック}」を"2020/05/30"までを繰り返す
⑥.ファイル(F)-上書き保存(S)
そして、①から⑥を全てのファイルに行うことでしょう。
そんな時に対応するプログラムです。
Exce-VBAでWordを使用する場合の準備
Exce-VBAでWordを使用する場合は、一度だけの準備作業が必要です。
以下の記事の「Wordを操作する準備」を行います。
参照:Excel VBA Wordを操作する主なプロパティとメソッド
実行までの手順
1.データ準備
1).[01.IN]フォルダと[02.OUT]フォルダを作成
この例ではGドライブに作成しています。
2).[01.IN]フォルダ内に以下の3ファイルを作成
2.Excelを起動し、[01.IN]フォルダと[02.OUT]フォルダ設定
1).シート1に以下のデータを貼り付ける
ドラッグ&コピー後にExcelに貼り付けるとき、[形式を選択して貼り付ける]-[テキスト]で貼り付けます。(セル[A1]で[右クリック]、[形式を選択して貼り付ける]-[テキスト])
参照フォルダ ドキュメント IN G:\01.IN ドキュメント OUT G:\02.OUT
プログラムを実行する場合のフォルダ名は、実際の環境に合わせて修正します。
3.Excel-VBAを起動
Altを押した状態でF8キーを押します。
4.[マクロ名(M):]に'test'と入力(''は不要、''内のtestを入力)
5.[作成(C)]をクリック
私はマクロ名を入力したら、そのままEnterを押します。
6.以下のプログラムをドラッグ&コピー
'入力フォルダ内を読み込むときの対象を定義、*は全てを意味する Const cnsDIR = "\*.doc" 'フォルダやファイルの場所用の変数を定義 Dim strPath1 As String Dim strPath2 As String 'ファイル名を格納するテーブルを定義 Dim tblFilename1(500) As String Dim i, last_i As Long 'データ編集用 Dim day1 As Long Dim strTemp As String '入出力フォルダのファイル名を取り扱う変数を定義 Dim strFilename As String Dim savFilename As String 'ワードファイルを読み込むための変数 Dim wordObj As New Word.Application ' Wordを起動する Dim wordDoc As Word.Document Dim objSelect As Object '入出力フォルダ名の場所をワークに取り込む strPath1 = Worksheets(1).Cells(3, 2) strPath2 = Worksheets(1).Cells(5, 2) 'フォルダの存在確認 --- 必要な場合のみ記述 --- If Dir(strPath1, vbDirectory) = "" Then MsgBox "INフォルダがない", vbExclamation Exit Sub End If If Dir(strPath2, vbDirectory) = "" Then MsgBox "OUTフォルダがない", vbExclamation Exit Sub End If '入力フォルダ内の最初のファイルを取得 strFilename = Dir(strPath1 & cnsDIR, vbNormal) i = 0 Do While strFilename <> "" ' 行を加算 i = i + 1 tblFilename1(i) = strFilename '次のファイル名を取得 strFilename = Dir() Loop '入力ファルダの対象件数を退避 last_i = i ' wordObj.Visible = True ' 起動はしているが画面表示されないのでWordを画面表示する) AppActivate wordObj ' Wordを最前面に表示する '入力ファルダのファイルを読み込み、出力ファイルを編集して出力 For i = 1 To last_i '入力ファイルをオープン strFilename = strPath1 & "\" & tblFilename1(i) Set wordDoc = wordObj.Documents.Open(strFilename, ReadOnly:=True) Set objSelect = wordObj.Selection wordDoc.ActiveWindow.View = wdPrintView ' 読込モードでは編集できないので編集モードに移行 For day1 = 1 To 30 If day1 < 10 Then strTemp = "2020/05/0" & day1 Else strTemp = "2020/05/" & day1 End If objSelect.Find.Text = strTemp objSelect.Find.Forward = True objSelect.Find.Replacement.Text = "2020/05/31" objSelect.Find.Execute Replace:=wdReplaceAll Next '出力ファイルへの書き込み savFilename = strPath2 & "\" & tblFilename1(i) wordDoc.SaveAs Filename:=savFilename If Dir(savFilename, vbDirectory) = "" Then wordDoc.Close savechanges:=False End If Next wordObj.Quit '起動しているExcelを終了する Application.Quit
6.以下に貼り付け(ペースト)
Sub test()
ここに貼り付ける
End Sub
7.F5キーで実行
プログラムが起動し、ファイルを一つひとつ読み込み、文字列を置き換え、出力フォルダに書き込む動作が自動で行われます。
8.実行結果の確認
出力フォルダには、入力フォルダ内のファイル名と同じ名前のファイルが生成されています。
ファイルの内容を確認すると、すべて日付が"2020/05/31"に置き換わっています。
プログラムの詳細説明
最初に、入力フォルダ内の拡張子が"doc"となっている全テキストファイル名をプログラム内のテーブル[tblFilename1]にプールします。
そして、Wordを起動し、tblFilename1を開くファイルに指定して開きます。
入力フォルダ内のテキストファイル名を取得する処理は、以下の記事を参照下さい。

For文については、以下の記事を参照下さい。

>
上記記事にない部分を追記します。
・Wordファイルを読み込むための変数
以下の3定義です。
特段言葉を覚えようとしてなく「Excel-VBAでWordを扱う場合は、こういう定義が必要なんだ」程度の理解です。
1.Dim wordObj As New Word.Application
「Wordアプリケーションオブジェクト」と言います。
この定義でWordが起動し(Wordのインスタンスを生成)、以降Wordを扱うときはwordObjを使います。
2.Dim wordDoc As Word.Document
「Wordドキュメントオブジェクト」と言います。
開いたWordファイルそのものです。
以下で対象Wordファイルを開きます。
Set wordDoc = wordObj.Documents.Open(strFilename, ReadOnly:=True)」
以降で開いたWordファイルを扱うときはwordObjを使います。
また以下は、読み取りモード開いたファイルを編集モードに変更します。
wordDoc.ActiveWindow.View = wdPrintView
3.Dim objSelect As Object
「オブジェクト変数」と言います。
また以下は、開いたWordファイルを全選択します。
Set objSelect = wordObj.Selection
・Wordファイルを読み込むための変数
以下はWordの文字列変換を実行する処理です。
objSelect.Find.Text = strTemp
objSelect.Find.Forward = True
objSelect.Find.Replacement.Text = "2020/05/31"
objSelect.Find.Execute Replace:=wdReplaceAll
想像できると思いますので、説明は致しません。
注意点
今回の例では、"2020/05/01"や"2020/05/15"といった「月/日」が「mm/dd」の文字列の場合に対応したプログラムでした。
"2020/05/01"が"2020/05/1"となっている場合には対応できません。
別の処理を記述して試行したのですが、"2020/05/15"の場合は、"2020/10/3115"に置き換わってしまいました。
最後に
今回は敢えて「日付の置き換え」に挑戦しましたが、例えば文書に記載されている部署名や管理者名が変更になる場合には使えます。
そういった文書の場合には、部署名や管理者名が変更になることの履歴を足したり再印刷が必要になることが多いので、結局は1つひとつ開いた対応が必要な場合が多いと思います。
使えるシーンは多くないと思いますが、それでも必要性が生じたときに思い出して頂ればと思います。
「Wordファイルの文字列を一括で置換するプログラム」でした。
テキストファイルの文字列を一括置換するプログラムは以下です。

Excelファイルの文字列を一括置換するプログラムは以下です。

コメント