EXCEL VBA

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

EXCEL VBA

こんにちは! 健史(たけふみ)です。

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

最初は、真似ることです。

少しずつ何回も Excel-VBAの起動、実行に慣れて、プログラムにも目を通して理解を深め、自然に手が動くようになるまで頭の回路に焼き付けて頂ければと思います。

そして、活用できるレベルにいって頂ければと嬉しく思います。

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

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

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

スポンサーリンク

プログラムの作成と実行

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

フォルダ内にある全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 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を開くファイルに指定して開きます。

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

Excel-VBA 実例 重複チェックして重複データを抽出する
こんにちは! 健史(たけふみ)です。 この記事は、Excel-VBAを起動して貼り付ければ動作することを目指しています。 最初は、真似ることです。 少しずつ何回も Excel-VBAの起動、実行に慣れて、プログラムにも目を...

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

Excel-VBA 実例 この通りやれば動く、とにかく触ってみよう
こんにちは! 健史(たけふみ)です。 パソコンをお使いの方の多くは、表計算ソフトExcelを利用されていると思います。 この記事は、Exceは知っているけれど ・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-VBAを起動して貼り付ければ動作することを目指しています。 最初は、真似ることです。 少しずつ何回も Excel-VBAの起動、実行に慣れて、プログラムにも目を...

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

Excel-VBA 実例 Excelの文字列を一括検索・置換
こんにちは! 健史(たけふみ)です。 この記事は、Excel-VBAを起動して貼り付ければ動作することを目指しています。 最初は、真似ることです。 少しずつ何回も Excel-VBAの起動、実行に慣れて、プログラムにも目を...
EXCEL VBA
スポンサーリンク
- 面白かったらシェアお願いします! -
健史をフォローする
自分で改善

コメント