WordマクロからExcelとWordを操作する

Wordマクロでは、Wordだけでなく他のアプリの処理も合わせて自動化することができます。

今回は、Excelで作成したリストを使って、Word文書を連続置換するマクロを例に説明します。

準備

Excelで置換リストを作成する

Excelブックに検索語句と置換語句の組み合わせのリストを作成して、範囲に名前を付けます。

置換リスト

ライブラリの参照を設定する

Word VBAの編集画面(VBE)で、[ツール]-[参照設定]をクリックします。[参照設定]ダイアログボックスで「Microsoft Excel 16.0 Object Library」をチェックして[OK]をクリックします。

この設定は、VBAプロジェクト(マクロファイル)単位で有効です。別のプロジェクトで同様のマクロを使用する際は別途設定する必要があります。

コードサンプルと解説

Sub Excelリストで連続置換()

  Dim appXL As Excel.Application
  Dim wbXL As Excel.Workbook
  Dim aryRep As Variant
  Dim r As Long

  'Excelを開いて名前付き範囲を2次元配列に格納
  Set appXL = New Excel.Application
  Set wbXL = wbXL.Workbooks.Open("D:\test\置換リスト.xlsx")
  
  aryRep = wbXL.Worksheets("リスト").Range("置換リスト")
  'appXL.Visible = True 'ユーザー操作なしのため非表示のまま
  'ブックを閉じてExcelを終了
  appXL.Quit SaveChanges:=False

  'Word文書を連続処理
  With ActiveDocument.Content.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .MatchWildcards = False
    .MatchFuzzy = False
    '配列に従って連続置換
    For r = 1 To UBound(aryRep)
      .Execute _
        FindText:=aryRep(r, 1), _
        ReplaceWith:=aryRep(r, 2), _
        Replace:=wdReplaceAll
    Next r
  End With
End Sub

ライブラリの参照とは

ライブラリの参照は、Word VBAから他のアプリのオブジェクトやプロパティ、メソッドの情報を利用できるようにします。

はじめの「Dim wbXL As Excel.Workbook」ではExcelブックオブジェクトの変数を宣言しています。ライブラリ参照なしでは、Wordは「Excel? ナニソレ?」とエラーになってしまいます。

また、「wbXL.」と入力するとExcelブックオブジェクトと解釈されるので、これにかかるプロパティやメソッドが入力候補として表示され、効率的にコーディングを進められます。

Excel上でのコーディングとは異なる点もあります。ここはWord VBAの場なのでExcelのオブジェクトであることの明示が必要なことです。Excel VBAでは「Workbook」で済むところを「Excel.Workbook」とします。

CreateObjectとの違い

次のようなコードを使うと、ライブラリを参照しなくてもWordからExcelの操作が可能です。

Dim appXL As Object
Set appXL = CreateObject("Excel.Application")

ただしこの場合は、WordはExcelやExcelオブジェクトを「何か不明なオブジェクト」としてしか扱えないので、入力候補の表示などのサポートは使用できません。

Excelの起動後の表示/非表示

appXL.Workbook.Open でExcelを起動してブックを開きますが、この時のExcelのウィンドウやブックは不可視の状態です。つまり、ユーザーがブックを閉じたりExcelを終了することはできないので、
appXL.Quit SaveChanges:=False でマクロでExcelの終了までを行っています。

Excelブックに処理結果を入力してユーザーに確認させたいような場合、次のコードでExcelウィンドウを可視化できます。
appXL.Visible = True

Excelマクロから上記と同じ処理を行うと…

 

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