Excel VBAでWordを編集する方法をお探しですね。
広告
Excel VBAからWordファイルを開いて、データを差し込んで印刷・保存する方法
Excelで管理している顧客リストや社員名簿を、Wordの書類に自動で流し込めたら便利だと思いませんか?請求書や案内状、契約書といった書類を何件も作るとき、手作業でコピー&ペーストを繰り返すのは大変ですし、貼り間違いも起こりやすいですよね。
この記事では、Excel VBAを使ってWordを操作する方法を、基本から実践まで順番に説明していきます。
難しそうに聞こえるかもしれませんが、一つずつ理解していけば大丈夫です。
まずは基本から:Excel VBAでWordを動かすってどういうこと?
Excel VBAからWordを操作するというのは、Excelのマクロを実行してWordを起動し、Word文書を開いたり、文字を書き換えたり、印刷や保存をしたりすることです。
普段、Excel VBAはExcelのシートやセルを操作するために使いますよね。
でも実は、Wordも同じように操作できるんです。
Excelに入っている顧客データをWord文書に流し込むことで、会社で決められたWordのテンプレートを使った書類作りが自動化できます。
参照設定って何?
Excel VBAからWordを使うには、まず「参照設定」という準備が必要です。
VBE(Visual Basic Editor)を開いて、「ツール」メニューから「参照設定」を選び、「Microsoft Word XX.X Object Library」にチェックを入れます。
これをやっておくと、`Word.Application`や`Word.Document`といった専用の型が使えるようになります。
コードを書くときに自動補完が効くので、初心者の方には特におすすめです。
もう一つの方法として、参照設定を使わずに`Object`型で書く方法もあります。
こちらは複数のOfficeバージョンが混在している環境で便利なこともありますが、最初は参照設定ありで始めたほうがわかりやすいでしょう。
最小限のコードで試してみよう
まずは、Wordファイルを開くだけの簡単なコードを見てみましょう。
“`vba
Option Explicit
Sub Wordファイルを開く基本()
Dim wdApp As Word.Application
Dim wdDoc As Word.Document
Dim filePath As String
‘Wordアプリケーションを起動
Set wdApp = New Word.Application
wdApp.Visible = True ‘画面に表示する
‘ファイルパスを指定(Excelと同じフォルダにあるtemplate.docxを開く)
filePath = ThisWorkbook.Path & “\template.docx”
Set wdDoc = wdApp.Documents.Open(FileName:=filePath)
‘ここに文字の置き換えや印刷などの処理を書く
‘Wordを閉じる
wdDoc.Close SaveChanges:=False
wdApp.Quit
Set wdDoc = Nothing
Set wdApp = Nothing
End Sub
“`
このコードの流れはこんな感じです:
1. Wordアプリケーションを起動する
2. 指定したWordファイルを開く
3. 必要な処理をする(この例では何もしていません)
4. Wordファイルを閉じる
5. Wordアプリケーションを終了する
`wdApp.Visible = True`にすると、Wordが画面に表示されます。
最初のうちはこれを`True`にしておくと、どこまで処理が進んだか確認しやすいです。
慣れてきたら`False`にすれば、裏側で処理が進むので見た目がスッキリします。
テンプレートを守るための工夫
実務で大事なのは、元のテンプレートファイルを壊さないことです。
`Documents.Open`に`ReadOnly:=True`を付けると、読み取り専用で開けます。
“`vba
Set wdDoc = wdApp.Documents.Open(FileName:=templatePath, ReadOnly:=True)
“`
こうしておけば、うっかり上書き保存してしまう心配がありません。
処理後は別名で保存するようにすれば、何度実行しても元のテンプレートはそのまま残ります。
もう一つ大事なのが、最後にWordをきちんと閉じることです。
`wdApp.Quit`を忘れると、画面には見えなくてもWordがバックグラウンドで動き続けてしまいます。
次にマクロを実行したときに動作がおかしくなる原因になるので、必ず閉じるようにしましょう。
Excelのデータをどうやって差し込むか考えよう
Excel VBAでWord文書にデータを流し込む方法はいくつかありますが、一番わかりやすいのは「置き換え方式」です。
置き換え方式の仕組み
Word文書の中に、`[氏名]`、`[住所]`、`[請求金額]`のような目印を入れておきます。
これを「プレースホルダー」と呼びます。
Excel側では、1行目に同じ見出しを用意します:
| 管理番号 | [氏名] | [住所] | [請求金額] |
|———|——–|——–|———–|
| 001 | 山田太郎 | 東京都〇〇区 | 50,000円 |
| 002 | 鈴木花子 | 大阪府△△市 | 30,000円 |
VBAで1行ずつ読み取って、Word文書の`[氏名]`を「山田太郎」に、`[住所]`を「東京都〇〇区」に置き換えていきます。
こうすれば、1件ずつ個別の書類が自動で作れるわけです。
この方法のいいところ
Wordには「差し込み印刷」という標準機能がありますが、VBAで自分で制御するメリットもたくさんあります:
– 印刷だけでなく、個別ファイルとして保存できる
– PDFに変換することもできる
– 処理した日時をExcelに記録できる
– 後から項目を追加しやすい
ただし注意点もあります。
WordとExcelで目印の文字が完全に一致していないと置き換えられません。
最初に命名ルールを決めておくことが大切です。
準備するもの3つ
1. **Wordテンプレート**:`[氏名]`、`[住所]`などの目印を入れておく
2. **Excelのデータ表**:1行目に見出し、2行目以降にデータを入力
3. **VBAコード**:Excelの各行を読み込んで、Wordに差し込むプログラム
テンプレートを守る設計にしよう
大事なのは、テンプレートファイルを直接編集しない設計にすることです。
基本的な流れはこうです:
1. テンプレートを開く(読み取り専用)
2. データを置き換える
3. 別名で保存する
4. テンプレートは保存せずに閉じる
こうすれば、何度実行してもテンプレートは元のまま。
請求書や契約書のように書式が大事な書類では、この考え方がとても重要です。
実際に動くコードを見てみよう
では、実践的なコードを紹介します。
Excelの「データ一覧」シートにあるデータをもとに、Wordテンプレートを開いて文字を置き換え、印刷して保存するマクロです。
前提条件
– Excelの1行目に`[氏名]`、`[住所]`、`[電話番号]`などの見出しがある
– Word文書にも同じ文字列が入っている
– Excelブックと同じフォルダに`template.docx`がある
コード全体
“`vba
Option Explicit
Sub Word差し込み印刷と置換編集()
Dim ws As Worksheet
Dim wdApp As Word.Application
Dim wdDoc As Word.Document
Dim templatePath As String
Dim savePath As String
Dim lastRow As Long
Dim lastCol As Long
Dim i As Long
Dim j As Long
Dim findText As String
Dim replaceText As String
Dim saveName As String
‘データ一覧シートを取得
Set ws = ThisWorkbook.Worksheets(“データ一覧”)
‘データの最終行と最終列を取得
lastRow = ws.Cells(ws.Rows.Count, “A”).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
‘テンプレートのパス
templatePath = ThisWorkbook.Path & “\template.docx”
‘Wordアプリケーションを起動
Set wdApp = New Word.Application
wdApp.Visible = True
‘データを1行ずつ処理
For i = 2 To lastRow
‘テンプレートを開く(読み取り専用)
Set wdDoc = wdApp.Documents.Open(FileName:=templatePath, ReadOnly:=True)
‘各列のデータで置き換え
For j = 2 To lastCol
‘見出し(置き換え前の文字)
findText = CStr(ws.Cells(1, j).Value)
‘データ(置き換え後の文字)
replaceText = CStr(ws.Cells(i, j).Value)
‘文字列を置き換える
With wdDoc.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = findText
.Replacement.Text = replaceText
.Forward = True
.Wrap = wdFindContinue
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.Execute Replace:=wdReplaceAll
End With
Next j
‘保存ファイル名を作る(管理番号_氏名.docx)
saveName = ws.Cells(i, 1).Value & “_” & ws.Cells(i, 2).Value & “.docx”
savePath = ThisWorkbook.Path & “\” & saveName
‘印刷する
wdDoc.PrintOut
‘別名で保存
wdDoc.SaveAs2 FileName:=savePath
‘保存せずに閉じる(テンプレートを守るため)
wdDoc.Close SaveChanges:=False
Set wdDoc = Nothing
‘Excelに処理済みの記録を残す
ws.Cells(i, lastCol + 1).Value = Format(Now, “yyyy/mm/dd hh:nn:ss”) & ” 処理済”
Next i
‘Wordアプリケーションを終了
wdApp.Quit
Set wdApp = Nothing
End Sub
“`
コードのポイント解説
**1. 見出しを置き換え前の文字として使う**
“`vba
findText = CStr(ws.Cells(1, j).Value) ‘例:[氏名]
replaceText = CStr(ws.Cells(i, j).Value) ‘例:山田太郎
“`
Excelの1行目を置き換え前、データ行を置き換え後として使っています。
この方法なら、後から列を増やしても対応しやすいです。
**2. 文字列の置き換え方法**
`wdDoc.Content.Find`は、Word文書の本文全体を対象に検索します。
– `Wrap = wdFindContinue`:文書の最後まで検索を続ける
– `Replace:=wdReplaceAll`:該当箇所をすべて置き換える
氏名や住所が文書内に何回出てきても、一気に置き換えられます。
**3. ファイル名の作り方**
“`vba
saveName = ws.Cells(i, 1).Value & “_” & ws.Cells(i, 2).Value & “.docx”
“`
管理番号と氏名を組み合わせてファイル名にしています。
「001_山田太郎.docx」のようなファイルができます。
**4. 処理記録を残す**
“`vba
ws.Cells(i, lastCol + 1).Value = Format(Now, “yyyy/mm/dd hh:nn:ss”) & ” 処理済”
“`
最終列の次の列に、処理日時と「処理済」の文字を記録します。
どこまで処理したか後から確認できるので便利です。
実務で使うときの調整ポイント
**印刷を後回しにしたい場合**
最初は印刷せずに、保存だけして確認したいこともありますよね。
その場合は、この行をコメントアウトします:
“`vba
‘wdDoc.PrintOut ‘←この行の先頭に’を付ける
“`
出力されたWordファイルを確認して、問題なければコメントを外せばOKです。
**ファイル名に使えない文字に注意**
顧客名や会社名をファイル名に使う場合、スラッシュ(`/`)、円記号(`\`)、コロン(`:`)、アスタリスク(`*`)などは使えません。
これらが含まれているとエラーになるので、事前に置き換える処理を入れておくと安心です。
“`vba
‘ファイル名に使えない文字を置き換える関数の例
Function SafeFileName(str As String) As String
SafeFileName = str
SafeFileName = Replace(SafeFileName, “/”, “”)
SafeFileName = Replace(SafeFileName, “\”, “”)
SafeFileName = Replace(SafeFileName, “:”, “”)
SafeFileName = Replace(SafeFileName, “*”, “”)
SafeFileName = Replace(SafeFileName, “?”, “”)
SafeFileName = Replace(SafeFileName, “”””, “”)
SafeFileName = Replace(SafeFileName, “<", "")
SafeFileName = Replace(SafeFileName, ">“, “”)
SafeFileName = Replace(SafeFileName, “|”, “”)
End Function
“`
よくあるトラブルと解決方法
Excel VBAでWordを操作するとき、つまずきやすいポイントがいくつかあります。
事前に知っておけば、トラブルを避けられますよ。
1. 参照設定のエラー
**症状**:「ユーザー定義型は定義されていません」というエラーが出る
**原因**:参照設定で「Microsoft Word XX.X Object Library」にチェックが入っていない
**解決方法**:
– VBEの「ツール」→「参照設定」を開く
– 「Microsoft Word XX.X Object Library」を探してチェックを入れる
– OKを押す
または、参照設定を使わない書き方に変更する:
“`vba
‘参照設定あり
Dim wdApp As Word.Application
‘参照設定なし(遅延バインディング)
Dim wdApp As Object
Set wdApp = CreateObject(“Word.Application”)
“`
2. ファイルパスのミス
**症状**:「ファイルが見つかりません」というエラーが出る
**よくある原因**:
– Excelブックが未保存(保存してから実行しましょう)
– ファイル名が間違っている(スペルミスに注意)
– フォルダの場所が違う
**確認方法**:
“`vba
‘パスを確認するコード
Sub パス確認()
MsgBox ThisWorkbook.Path & “\template.docx”
End Sub
“`
このマクロを実行して、表示されたパスにファイルがあるか確認してください。
**OneDriveや共有フォルダの注意点**
OneDriveや共有フォルダ上のファイルは、同期状態やアクセス権の影響を受けることがあります。
動作が不安定な場合は、まずローカルフォルダ(デスクトップやドキュメントなど)で試してみましょう。
3. 置き換えがうまくいかない
**症状**:一部のプレースホルダーが置き換わらない
**原因**:ヘッダー、フッター、テキストボックス、図形の中の文字は`wdDoc.Content.Find`では置き換えられない
**解決方法**:ヘッダーやフッター、図形も対象にする処理を追加する
“`vba
‘ヘッダー・フッターも置き換える例
Dim sect As Word.Section
For Each sect In wdDoc.Sections
‘各セクションのヘッダー
With sect.Headers(wdHeaderFooterPrimary).Range.Find
.Text = findText
.Replacement.Text = replaceText
.Execute Replace:=wdReplaceAll
End With
‘フッターも同様に処理
With sect.Footers(wdHeaderFooterPrimary).Range.Find
.Text = findText
.Replacement.Text = replaceText
.Execute Replace:=wdReplaceAll
End With
Next sect
“`
4. Wordが閉じない・開きっぱなしになる
**症状**:マクロ実行後、Wordプロセスが残っている
**原因**:エラーが起きて途中で止まり、`Quit`が実行されなかった
**解決方法**:エラーが起きても必ずWordを閉じるように、エラーハンドリングを入れる
“`vba
Sub 安全なWord操作()
Dim wdApp As Word.Application
Dim wdDoc As Word.Document
On Error GoTo ErrHandler ‘エラーが起きたらErrHandlerへ飛ぶ
Set wdApp = New Word.Application
wdApp.Visible = True
‘ここにメインの処理を書く
ExitHandler:
‘正常終了時も異常終了時もここを通る
On Error Resume Next ‘閉じる処理中のエラーは無視
If Not wdDoc Is Nothing Then wdDoc.Close SaveChanges:=False
If Not wdApp Is Nothing Then wdApp.Quit
Set wdDoc = Nothing
Set wdApp = Nothing
Exit Sub
ErrHandler:
MsgBox “エラーが発生しました。
” & vbCrLf & _
“エラー番号:” & Err.Number & vbCrLf & _
“内容:” & Err.Description, vbExclamation
Resume ExitHandler ‘ExitHandlerへ飛んでWordを閉じる
End Sub
“`
このパターンを使えば、どこでエラーが起きても必ずWordが閉じられます。
5. 処理が遅い
**症状**:件数が多いと時間がかかる
**改善方法**:
“`vba
‘画面更新を止める
Application.ScreenUpdating = False
wdApp.ScreenUpdating = False
‘処理本体
‘画面更新を再開
Application.ScreenUpdating = True
wdApp.ScreenUpdating = True
“`
画面の再描画を止めると、処理速度が上がります。
もっと安定して使うためのコツ
そもそもWordで作る必要がある?
Excel VBAでWordを操作する前に、本当にWordで作る必要があるか考えてみましょう。
**Excelで十分な場合**:
– 単純な一覧表
– 社内向けの資料
– データが中心の書類
**Wordが向いている場合**:
– 契約書、通知書、案内状など社外向け文書
– 段落や余白、ヘッダー・フッターが重要な書類
– 会社で決められたテンプレートがある場合
役割分担を明確にすると、保守しやすい仕組みになります:
– **Excel**:データ管理
– **Word**:文書レイアウト
フォルダ構成を整理しよう
実務で使うなら、フォルダ構成を整えておくと管理しやすくなります。
“`
プロジェクトフォルダ/
├ データ管理.xlsm (マクロ入りExcel)
├ template.docx (テンプレート)
└ 出力/ (生成されたファイルを保存)
“`
出力先フォルダは、コードで自動作成することもできます:
“`vba
Dim outputFolder As String
outputFolder = ThisWorkbook.Path & “\出力\”
‘フォルダがなければ作成
If Dir(outputFolder, vbDirectory) = “” Then
MkDir outputFolder
End If
“`
プレースホルダーの命名ルール
プレースホルダーは、通常の文章では使わない形式にしましょう。
**おすすめ**:
– `[氏名]`、`[住所]`のように角カッコで囲む
– `{氏名}`、`{住所}`のように波カッコで囲む
– `<<氏名>>`、`<<住所>>`のように記号で目立たせる
**避けたほうがいい**:
– `氏名`、`住所`のようにそのまま書く(通常文と区別できない)
– `@氏名`、`#住所`のような記号(メールアドレスや番号と混同しやすい)
テスト実行の手順
いきなり全件処理すると、失敗したときに大変です。
段階的にテストしましょう。
**ステップ1**:1件だけ処理
“`vba
For i = 2 To 2 ‘2行目だけ処理
“`
**ステップ2**:保存だけして印刷しない
“`vba
‘wdDoc.PrintOut ‘コメントアウト
“`
**ステップ3**:問題なければ全件処理
“`vba
For i = 2 To lastRow ‘全行処理
“`
**ステップ4**:印刷も有効化
“`vba
wdDoc.PrintOut ‘コメント解除
“`
処理ログを残そう
どこまで処理したか記録を残しておくと、途中で止まっても再開しやすくなります。
“`vba
‘処理開始時刻を記録
ws.Cells(i, lastCol + 1).Value = Format(Now, “yyyy/mm/dd hh:nn:ss”) & ” 処理中”
‘処理が成功したら更新
ws.Cells(i, lastCol + 1).Value = Format(Now, “yyyy/mm/dd hh:nn:ss”) & ” 完了”
“`
エラーが起きた行だけ「処理中」のままになるので、どこで止まったかすぐわかります。
まとめ:Excel VBAとWordの連携で業務を効率化しよう
Excel VBAからWordファイルを開いて、データを差し込んで、文字列を置き換えて、印刷・保存する。
この一連の流れができるようになれば、請求書、送付状、案内状、証明書など、いろいろな書類作成に応用できます。
**大事なポイントをおさらい**:
1. **参照設定を忘れずに**:VBEで「Microsoft Word XX.X Object Library」にチェック
2. **テンプレートは読み取り専用で開く**:元のファイルを守る
3. **プレースホルダーは目立つ形式に**:`[氏名]`のように通常文と区別
4. **ExcelとWordで見出しを一致させる**:置き換えがうまくいく
5. **エラーハンドリングを入れる**:途中で止まってもWordを閉じる
6. **段階的にテストする**:1件→保存のみ→全件→印刷
最初は少ない件数で試して、置き換えと保存が正しくできることを確認してください。
問題なければ印刷処理を追加する、という流れで進めると失敗を減らせます。
一度仕組みを作ってしまえば、横展開も簡単です。
テンプレートとデータ一覧を変えるだけで、いろいろな書類に使い回せます。
手作業でコピー&ペーストを繰り返すよりずっと早く、ミスも減らせますよ。
ぜひこの記事を参考に、Excel VBAとWordの連携に挑戦してみてください!
広告
