EXCEL VBA

Excel-VBA 実例 Word文書の文字列を一括置換

EXCEL VBA

こんにちは! 健史です。

WORDファイルで保管されている文書の文字列、例えば
・組織変更によりマニュアルなどに記載されている部署名を一括で修正したい
・おのおの作成・修正された文書の'作成日'や'更新日'を揃えたい
ということありませんか。

プログラムで指定したフォルダ内のWORDファイルの文字列を修正する処理を作成してみました。

スポンサーリンク

プログラムの作成と実行

今回のサンプルプログラムは、

フォルダ内にある全Wordファイルの指定文字列を一括置換する

です。

単に文字列を置き換えるだけであればテキストファイル同様に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 ix1, ix1_max As Long
'データ編集用
    Dim numDay1 As Long
    Dim strTmp As String
'入出力フォルダのファイル名を取り扱う変数を定義
    Dim strFilename As String
    Dim savFilename As String
'ワードファイルを読み込むための変数
    Dim objWord As New Word.Application
    Dim docWord As Word.Document
    Dim objSelect As Object
'入出力フォルダ名の場所をワークに取り込む
    strPath1 = Worksheets(1).Cells(2, 2)
    strPath2 = Worksheets(1).Cells(3, 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
'
    Select Case Sheets.Count   'シート2,シート3を追加し忘れた時の対応
    Case 1
        Sheets.Add(After:=Sheets(Sheets.Count)).Name = "ワーク"
    End Select
    Sheets(2).Cells.Clear
'入力フォルダ内の最初のファイルを取得
    strFilename = Dir(strPath1 & cnsDIR, vbNormal)
    ix1 = 0
    Do While strFilename <> ""
        ' 行を加算
        ix1 = ix1 + 1
        Sheets(2).Cells(ix1, 1) = strPath1 & "\" & strFilename
        Sheets(2).Cells(ix1, 2) = strPath1
        Sheets(2).Cells(ix1, 3) = strFilename
        strFilename = Dir()
    Loop
    ix1_max = ix1
'入力ファルダのファイルを読み込み、出力ファイルを編集して出力
    For ix1 = 1 To ix1_max
'入力ファイルをオープン
        strFilename = Sheets(2).Cells(ix1, 1)
        Set docWord = objWord.Documents.Open(strFilename, ReadOnly:=True)
        Set objSelect = objWord.Selection
        docWord.ActiveWindow.View = wdPrintView ' 読込モードでは編集できないので編集モードに移行
'
        For numDay1 = 1 To 30
            If numDay1 < 10 Then
                strTmp = "2020/05/0" & numDay1
            Else
                strTmp = "2020/05/" & numDay1
            End If
            objSelect.Find.Text = strTmp
            objSelect.Find.Forward = True
            objSelect.Find.Replacement.Text = "2020/05/31"
            objSelect.Find.Execute Replace:=wdReplaceAll
        Next
'出力ファイルへの書き込み
        savFilename = strPath2 & "\" & Sheets(2).Cells(ix1, 3)
        docWord.SaveAs Filename:=savFilename
        If Dir(savFilename, vbDirectory) = "" Then
            docWord.Close savechanges:=False
        End If
    Next
    objWord.Quit
'起動しているExcelを終了する
    ThisWorkbook.Save
    MsgBox "処理終了!"
    Application.Quit

6.以下に貼り付け(ペースト)

Sub test()
ここに貼り付ける
End Sub

7.F5キーで実行
プログラムが起動し、ファイルを一つひとつ読み込み、文字列を置き換え、出力フォルダに書き込む動作が自動で行われます。

8.実行結果の確認
出力フォルダには、入力フォルダ内のファイル名と同じ名前のファイルが生成されています。

ファイルの内容を確認すると、すべて日付が"2020/05/31"に置き換わっています。

プログラムの詳細説明

最初に、入力フォルダ内の拡張子が"doc"となっている全テキストファイル名をプログラム内のテーブル[tblFilename1]にプールします。

そして、Wordを起動し、tblFilename1を開くファイルに指定して開きます。

入力フォルダ内のテキストファイル名を取得する処理は、以下の記事を参照下さい。

Excel-VBA 実例 重複チェックして重複データを抽出する
こんにちは! 健史です。 「Excelシートのある列項目が重複しているデータを探したい!」ということありませんか。 Excelの「COUNTIF 関数」を使えばできますが、処理データを現場にありそうなフォルダ情報から作成し、重複チェックする...

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

Excel-VBA 実例 この通りやれば動く、とにかく触ってみよう
こんにちは! 健史です。 パソコンをお使いの方の多くは、表計算ソフトExcelを利用されていると思います。 この記事は、Exceは知っているけれど ・Excel-VBAって何? ・Excel-VBAは取っ付きにくい! ・Excel-VBAっ...


上記記事にない部分を追記します。

・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-VBA 実例 テキスト文書の文字列を一括置換
こんにちは! 健史です。 手動で行う操作、例えば、 ・フォルダに保管されているテキストファイルを一つひとつ開く ・特定の文字列を検索して、あれば別の文字に変更する ・ファイルを上書きする を自動化したいということありませんか。 プログラムで...

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

Excel-VBA 実例 Excelの文字列を一括検索・置換
こんにちは! 健史です。 Excelファイルで保管されている文書の文字列を一括で修正したいということありませんか。 プログラムで指定したフォルダ内のExcelファイルの文字列を修正する処理を作成してみました。 尚この記事は、Excel-VB...



この記事は、Excel-VBAを起動して貼り付ければ動作することを目指しています。

Excel-VBAの構造、起動方法、実行方法などを理解されていない方は、以下の記事を参照しながら一度やってみてから対応されることをお勧めします。

Excel-VBA 実例 この通りやれば動く、とにかく触ってみよう
こんにちは! 健史です。 パソコンをお使いの方の多くは、表計算ソフトExcelを利用されていると思います。 この記事は、Exceは知っているけれど ・Excel-VBAって何? ・Excel-VBAは取っ付きにくい! ・Excel-VBAっ...

実行中に発生したエラーの対処法は、上記記事の2.エラーが発生したときの対処法に記載しています。(この段落のリンクから直接遷移します)

EXCEL VBA
スポンサーリンク
- 面白かったらシェアお願いします! -
健史をフォローする
自分で改善

コメント