忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

access vba でのWord文書の文字列検索と置換について(Word処理用クラスに文字列置換関数を追加)

access vba でのWord用クラス作成について以下のページで説明しましたが、 今回はWord文書の中で文字列を検索し、その部分を指定された文字列で置き換える処理をクラスに追加してみます。

access vba でのWord処理用クラスの作成(ファイル保存時イベント[DocumentBeforeSave]でのファイル名変更処理を含む)

関数を追加する前に今回使用する Find オブジェクトについてみてみます。
以下の例は抜粋なのですが、Word.Documentオブジェクトとして WrdDoc が既に生成されているものとします。
Word.Documentオブジェクトの Content プロパティの Find オブジェクトを利用します。
(この Content プロパティは「文書全体を示す Range オブジェクト」のことで、 Range オブジェクトの中の Find オブジェクトとなります)

Find オブジェクトの以下の各プロパティをそれぞれ指定し Execute メソッドで処理種別を指定し、 置換処理等を行います。この処理種別には多くのものがありますので、それぞれについては正規の説明書を見て下さい。

今回は文字列の置換ですので、Replace を指定しています。 Replace の引数としては置換する文字列の個数 (1つだけ:wdReplaceOne、すべて:wdReplaceAll、または置換しない:wdReplaceNone) を指定します。
この例は、文書全体の「Word」を「ワード」に置き換える処理を行います。

Find オブジェクトの実行例

With WrdDoc.Content.Find
    .Text = "Word"               '置換元の文字列
    .Replacement.Text = "ワード"  '置換後の文字列
    .Wrap = wdFindContinue       '検索折返し指定
                                 '(文書の途中から検索し、最後に到達した時に先頭から続行)
    .Execute Replace:=wdReplaceAll
End With

基本的にはこの処理を複数の文字列の置換が出来る様に以下の様な関数にしました。

関数の引数としては置換される文字列と、置換文字列を配列で指定します。 尚、vba では配列の場合は Variant 型として宣言します。 置換される文字列配列と、置換文字列配列の個数のチェックは行っていないので、同じにする必要があります。

この関数での注意点は、置換文字列の中に改行を含んでいる場合に、そのまま一括で置換してしまうと 1個目の改行以降が左側に寄ってしまいます。そのため、改行で文字列を分解し、1個ごとに文字列と改行を出力する様にしています。
こうすることで、置換元の位置の左端に合わせた感じで改行後の文字列が揃うはずです。

Word文書文字列置換関数

'******************************************************************************
' Word文書文字列置換処理
'******************************************************************************
' 関数名 : WordReplace()
' 引数   : P_vaKey()                '差替KEY文字列の配列
'       : P_vaVal()                '差替文字列の配列
'       : P_blnCrLfLeftAlign       '左揃えフラグ
'******************************************************************************
Public Sub WordReplace(P_vaKey() As Variant, P_vaVal() As Variant, P_blnCrLfLeftAlign As Boolean)
    On Error GoTo Err_WordReplace
    
    Dim i As Integer
    For i = 0 To UBound(P_vaKey)
    
        If InStr(P_vaVal(i), vbCrLf) = 0 Or P_blnCrLfLeftAlign = False Then
            '置換文字列に改行コードが無い場合、または左揃えフラグがOFF
            
            '文字を検索、置換する
            With WordDoc.Content.Find
                .Text = P_vaKey(i)
                .Forward = True
                .Replacement.Text = Replace(CStr(P_vaVal(i)), vbCrLf, vbCr)
                .Wrap = wdFindContinue
                .MatchFuzzy = True
                .Execute Replace:=wdReplaceAll
            End With
    
        Else
            '置換文字列に改行コードがある場合
            
            '検索文字列の先頭にカーソル移動
            With WordApp.Selection.Find
                .Text = P_vaKey(i)
                .Execute
            End With
        
            '文字を検索、置換する
            With WordDoc.Content.Find
                .Text = P_vaKey(i)
                .Forward = True
                .Replacement.Text = ""      '取り敢えずクリア
                .Wrap = wdFindContinue
                .MatchFuzzy = True
                .Execute Replace:=wdReplaceAll
            End With
        
            Dim arr() As String
            arr = Split(P_vaVal(i), vbCrLf)
            
            '改行で分解した文字列をカーソル位置から順次出力
            Dim ix As Integer
            For ix = 0 To UBound(arr)
                If ix > 0 Then
                    '2個目以降は改行出力
                    WordApp.Selection.TypeText vbCr
                End If
                WordApp.Selection.TypeText arr(ix)
            Next ix
        End If
    Next i

Exit_WordReplace:
    Exit Sub

Err_WordReplace:
    MsgBox Err.Description
    Resume Exit_WordReplace
End Sub

この関数をWord処理用クラスに追加して、それを使用する例として、access フォームに1個のボタンのみを設置し、そのクリックイベントでワード文書を開く様にしてみます。

Word文書文字列置換関数の使用例

Option Compare Database

' クラスWordオブジェクト
Private mclsWord As clsWord

'------------------------------------------------------------------------------
' フォームロード時イベント
'------------------------------------------------------------------------------
Private Sub Form_Load()
    Set mclsWord = New clsWord
End Sub

'------------------------------------------------------------------------------
' フォームクローズイベント
'------------------------------------------------------------------------------
Private Sub Form_Close()
    'ワードクローズ
    mclsWord.WordClose
    'Wordオブジェクト解放
    Set mclsWord = Nothing
End Sub

'------------------------------------------------------------------------------
' コマンド1開始
'------------------------------------------------------------------------------
Private Sub コマンド1_Click()
    Dim strPath As String
    'ワードファイルを読み込み、文章を編集する状態にする
    strPath = Application.CurrentProject.path & "\" & "find-test.docx"
    'ワードファイルを読込み編集状態で表示する
    mclsWord.WordOpen strPath, True
    '
    Dim arrVaKey() As Variant
    Dim arrVaVal() As Variant

    arrVaKey = Array("@test1@", _
                     "@test2@", _
                     "@test3@", _
                     "@test4@")
    arrVaVal = Array("テスト1", _
                     "テスト2", _
                     "テスト3", _
                     "テスト4-1" & vbCrLf & "テスト4-2" & vbCrLf & "テスト4-3")
    '置換処理(左揃えを行わない)
    mclsWord.WordReplace arrVaKey, arrVaVal, False
    
    arrVaKey = Array("@test5@")
    arrVaVal = Array("テスト5-1" & vbCrLf & "テスト5-2" & vbCrLf & "テスト5-3")
    '置換処理(左揃えを行う)
    mclsWord.WordReplace arrVaKey, arrVaVal, True
End Sub


「コマンド1開始」を押下することで、ワードが起動し置換処理の結果が表示されます。 元のワードの文書と結果の文書は以下の画像の様になります。 左揃え処理を行う個所と、行わない個所の違いが分かると思います。


関連する記事

access vba でWordを起動しファイル保存時のファイル名変更について(DocumentBeforeSave : Word保存前イベント)
access vba でExcelを起動しファイル保存でのファイル名変更について(WorkbookBeforeSave : Excel保存前イベント)
access vba でのWord処理用クラスの作成(ファイル保存時イベント[DocumentBeforeSave]でのファイル名変更処理を含む)
access vba Bookmarkオブジェクトで文書の先頭にカーソルを移動する(Word処理用クラスに文書の先頭移動関数を追加)











PR

コメント

コメントを書く