VBAを使うと、Wordファイルを操作して仕事を効率化することができます。
たとえば以下のような作業を効率化できます。
・VBAプログラム入りのファイルをダウンロード
このページでは、エクセルマクロでワードを操作する方法を紹介していきます。
目次
- 1 エクセルマクロで差し込み印刷作業を自動!概要説明
- 2 エクセルVBAでのワード操作とは?メリットや違い
- 3 エクセルVBAでwordを操作する前に考えるべきこと
- 4 「エクセルVBAでWord操作」と「Word VBA」の違い
- 5 VBA入りのエクセルファイルをダウンロード
- 6 エクセルVBAでWord連携する前に準備
- 7 エクセルのデータからWordの差し込み印刷
- 7.1 プログラム0|変数宣言の指定
- 7.2 プログラム1|プログラム開始
- 7.3 プログラム2|変数設定
- 7.4 プログラム3|シート設定
- 7.5 プログラム4|エクセルの最終行と最右列を取得
- 7.6 プログラム5|ワード起動
- 7.7 プログラム6|テンプレートワードのパス取得
- 7.8 プログラム7|エクセルのデータを1行ずつ処理
- 7.9 プログラム8|テンプレートワードを開く
- 7.10 プログラム9|テンプレートワードにエクセルデータを挿入
- 7.11 プログラム10|データを差し込んだワードを印刷
- 7.12 プログラム11|ワードファイルを保存
- 7.13 プログラム12|テンプレートワードを保存せずに閉じる
- 7.14 プログラム13|オブジェクト解放
- 7.15 プログラム14|エクセルにデータを出力
- 7.16 プログラム15|ワードをアプリケーションごと閉じる
- 7.17 プログラム16|プログラム終了
- 8 エクセルVBAでWordを操作する事例
- 9 Excel VBAについて詳しく理解したいなら
エクセルマクロで差し込み印刷作業を自動!概要説明
このページでは以下のようなデータの一覧を、Wordに情報を入れこんでいきます。そして情報を入れこんだら、差し込み印刷を行います。
作成に必要な事前準備は以下です。
手順1. テンプレートワードファイルの作成
手順2. エクセルの一覧データの準備
手順3. VBAプログラムを実行
このページでは紹介している差し込み印刷マクロをダウンロードできるようにしています。
興味がある人はダウンロードしてご活用ください。
手順1. テンプレートワードファイルの作成
「Sample.docx」として上記のテンプレートワードファイルを使います。
差し込みしたい箇所を以下のように、[xxx]と入力しています。
[名]
[住所]
[電話番号]
[メールアドレス]
上記の文言を手順2で準備したエクセルのデータと置換するようにします。
もし上記以外の文言を置換したい場合は、[xxx]をテンプレートワードに入力しておきます。
手順2. エクセルの一覧データの準備
このページで紹介するVBAプログラムでは、上記のようなデータ一覧を準備しておきます。
このエクセルには以下の情報が入力されています。
A列:No
B列:[姓]
C列:[名]
D列:[住所]
E列:[電話番号]
F列:[メールアドレス]
上記の文言は手順1で置換する文言と合わせています。
つまりエクセルの1行目の[xxx]の文言に該当するデータを、テンプレートワードの[xxx]の文言と置換させます。
当然ですが[xxx]の文言とテンプレートワードの[xxx]が一致しないと、このページで紹介するプログラムは正しく動きません
必要に応じてVBAプログラムの修正が必要になりますので、注意が必要です。
手順3. VBAプログラムを実行
ボタンを押すとVBAプログラムが実行されます。
以下のように差し込み印刷を行います。
これをエクセルに入力されているデータの数だけ実行します。
差し込み印刷を実行したワードファイルは以下のとおり、新しいファイルとして保存します。
ボタンにVBAプログラムを登録
上記の画像では、VBAプログラムをボタンに登録しています。
ボタンにVBAプログラムを登録することで、ボタンを押下しプログラムを実行することができます。
ボタンをVBAプログラムを設定したい場合は、以下で動画も交えて設定方法を紹介しているので、そちらをご覧ください。
さらなる効率化
差し込み印刷を実行したファイルをメール送信したい場合があります。
その場合、数十個あるワードファイルを一つずつメール送信するのは手間です。
そこで個別のメール送信もVBAで自動化するとさらに便利です。
そのVBAプログラムは以下で紹介しています。
またExcel×Outlookの自動化については以下でまとめています。
興味がある人はご覧ください。
エクセルVBAでのワード操作とは?メリットや違い
エクセルVBAでワードを操作したいが、そもそも「ワード操作とは何か」について紹介します。
エクセルVBAによるWord操作とは
「エクセルマクロでのWord操作」とは、エクセルマクロVBAを通じてWordの文章を記載したり、Wordにエクセルの表を作ったりすることを指します。
エクセルからWordを操作するので、エクセルの表やエクセルの顧客情報や商品情報をWordに流し込みたい場合は役立ちます。
具体的なメリットやデメリットについて、以下で記載します。
Word操作のメリット
エクセルマクロでワード操作するメリットは、多くの場合、差し込み印刷でしょう。
たとえば、「エクセルの情報をもとに、大量のワードファイルを顧客ごとに文言を変更して印刷」という仕事には重宝します。
もし、この仕事をマクロを使用せずに行うなら、手作業で一つずつ、コピペしてワードに貼り付ける必要があり、かなりしんどい作業です。
しかし、エクセルマクロを利用すれば、ボタン一つで印刷するところまで自動で行えます。
Word操作のデメリット
デメリットとしてもっとも大きいのは、ワードが必要な場面はほとんどないことです。
Word作成して資料作成しなくても、エクセルで代用可能です。
つまり、わざわざワードを操作するメリットはほとんどないのが実情です。
エクセルマクロを利用して、エクセルの中で作業を完結したほうがよっぽどラク。ワードに強いこだわりがない限り、エクセルマクロでワードを操作することはムダです。
むしろ、ワードと同じ資料をエクセルで作成しておいて、エクセルからエクセルのフォーマットに情報を流し込む方が賢いやりかたです。
こうすれば、わざわざワード操作という上級テクニックを使用する必要がないので、ラクにプログラムを組めます。
エクセルVBAでwordを操作する前に考えるべきこと
エクセルVBAでWord操作する前に考えることとして、「本当にワードは必要か?」という点があります。
実は、エクセルVBAからワード操作しないといけない場面は多くありません。
このページで紹介している事例ではテンプレートにワードを利用していますが、テンプレートをエクセルで作成しても同じような処理は可能です。
しかもエクセルVBAは、エクセルの中で作業を完結したほうが処理が簡単です。
Excel VBA×Wordによる連携はどうしてもワードを使わないといけない場合に使用する
ただし会社のフォーマット上、ワードを使用しないといけないことはあります。
仮に面倒だと感じていたとしてもルール上、ワードということは変えようにも変えることができないものです。
よって、どうしてもワードを使わないといけない場面にのみ活用するほうがコスパはいいと言えます。
「エクセルVBAでWord操作」と「Word VBA」の違い
「エクセルVBAでWord操作」と「Word VBA」の違いは、エクセルからワードを操作するか、ワード自身でワードを操作するかの違いです。
エクセルVBAでWord操作
エクセルVBAでWord操作すると、エクセルのデータをWordに入れ込むことができます。
具体的にいうと、以下の用途で強みを発揮します。
・テンプレートとなるWordの必要な[氏名]などをエクセルに記載されている情報を差し込める
Word VBA
Word VBAでは、Wordの機能をマクロで実行できます。使い所としては、複数の操作を1つに集約できます。
たとえば、以下のようなWordの見た目を整える操作をWord VBAで実行できるようにしておくと、重宝します。
2. フォントサイズ12
3. フォントの色を黒
ワードを普通に使用すると、3つの操作を1つずつ行う必要があります。しかし、マクロを使えば、この3つの操作を1つの操作に集約することができます。
実際には、ワードVBAからエクセル操作することは可能ですが、使うメリットが全くありませんので、ここでは割愛します。
VBA入りのエクセルファイルをダウンロード
以下で紹介しているVBAプログラムをそのまま使いたい人は、以下のフォームからダウンロードできます。
登録したメールアドレスへ「VBAプログラムが含まれたエクセル」を送信します。
本プログラムの内容をそのまま使用可能です。ぜひお仕事にお役立てください。
エクセルVBAでWord連携する前に準備
エクセルVBAでword操作するためのプログラミングに入る前に、準備しておくことがあります。
準備|VBEで外部ライブラリへの参照設定でWord型を追加
参照設定とは、機能拡張させること、です。
Microsoft Word 15.0 Object Libraryにチェックを入れることで、Word操作の設定ができるようになります。バージョンによっては、15.0ではないときがあります。もし15.0ではなく、数字が小さい場合は、それにチェックを入れましょう。
1.VBEを開いて頂いて、「ツール」→「参照設定」
2.Microsoft Word 15.0 Object Libraryのライブラリにチェックを入れて、OKをクリック
詳細はこちらの画像の通りです。
1.VBEを開いて頂いて、「ツール」→「参照設定」
2.Microsoft Word 15.0 Object Libraryのライブラリにチェックを入れて、OKをクリック
ワードオブジェクトについて理解しておく
エクセルマクロから、ワード操作するときのハードルは、オブジェクト知識が必要なことです。もし、オブジェクトの知識が乏しい場合、コード編集に難しさを感じるでしょう。
VBAでエクセルを操作するときと違って、ワード独自のオブジェクトが多数出てきます。これが、混乱する原因になりますので、調べながら、学習していくことをオススメします。
学習方法については、この記事の後半で記載していますので、合わせてよんでみてください。
エクセルのデータからWordの差し込み印刷
今回紹介するプログラムの概要は以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
'プログラム0|変数設定の指定 Option Explicit 'プログラム1|プログラム開始 Sub Sashikomi_Insatsu() 'プログラム2|変数設定 Dim i As Long, k As Long Dim waitTime As Variant 'プログラム3|シート設定 Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("データ一覧") 'プログラム4|エクセルの最終行と最右列を取得 Dim cmax As Long, cnt As Long cmax = Range("A65536").End(xlUp).Row cnt = Range("IV1").End(xlToLeft).Column 'プログラム5|ワード起動 Dim wdapp As Word.Application Set wdapp = CreateObject("Word.application") wdapp.Visible = True 'プログラム6|テンプレートワードのパス取得 Dim path As String path = ThisWorkbook.path & "\Sample.docx" 'プログラム7|エクセルのデータを1行ずつ処理 For i = 2 To cmax 'プログラム8|テンプレートワードを開く Dim wddoc As Word.Document Set wddoc = wdapp.Documents.Open(path) waitTime = Now + TimeValue("0:00:03") Application.Wait waitTime 'プログラム9|テンプレートワードにエクセルデータを挿入 For k = 0 To cnt - 2 With wddoc.Content.Find .Text = ws.Range("B1").Offset(0, k).Value .Forward = True .Replacement.Text = ws.Range("B" & i).Offset(0, k).Value .Wrap = wdFindContinue .MatchFuzzy = True .Execute Replace:=wdReplaceAll End With Next 'プログラム10|データを差し込んだワードを印刷 wddoc.PrintOut 'プログラム11|ワードファイルを保存 Dim str As String str = ws.Range("A" & i).Value & "_" & Range("B" & i).Value & Range("C" & i).Value & ".docx" wddoc.SaveAs Filename:=ThisWorkbook.path & "\" & str 'プログラム12|テンプレートワードを保存せずに閉じる wddoc.Close savechanges:=False 'プログラム13|オブジェクト解放 Set wddoc = Nothing 'プログラム14|エクセルにデータを出力 ws.Range("G" & i).Value = Now & "処理済" Next 'プログラム15|ワードをアプリケーションごと閉じる wdapp.Quit Set wdapp = Nothing 'プログラム16|プログラム終了 End Sub |
プログラム0|変数宣言の指定
1 |
Option Explicit |
「Option Explicit」とは、変数宣言を強制するためのものです。
これを入れておくと、変数を定義していない場合、エラーが出ます。
つまり、「Option Explicit」を入力しておくことで、たとえば「Dim i」をあらかじめ入力しないと、「i」という変数を使えません。
もし「Option Explicit」を入力しているのに、「Dim i」を書かずに「i = 1」と書くと、エラーメッセージが表示されます。
実は、この機能はあくまでオプションです。「Option Explicit」を入力しなくても、プログラムは動きます。
しかし、これを入れておくことで、変数の誤記によるエラーを防止することができます。
結果的に、プログラム作成速度が上がるので、「Option Explicit」を入力することを習慣化することをオススメします。
プログラム1|プログラム開始
1 |
Sub Sashikomi_Insatsu() |
「Sub CreateSheets()」のプログラムを開始することを意味します。
VBAではプロシージャという単位でプログラムを呼び出します。
プロシージャの構文は下記となっています。
1 2 3 |
Sub プロシージャ名() '実行プログラム End Sub |
「Sub」で始まり「End Sub」で終わります。
「Sub XXXX」の「XXXX」の部分がプロシージャ名です。
このプロシージャ名はあらゆる文字(アルファベット、ひらがな、漢字、数字など)が使用可能です。
ただし、プロシージャ名の先頭は数字を入れるとエラーとなります。
あとで見たときに、「何のプログラムだったのか?」とならないようにするためです。
なお、「()」の中には何も記入されていません。これは引数なしという意味です。なお、プログラム2-1では引数を受け取ってプログラムを実行します。
初心者の内は、引数ということが分からなくてもVBAプログラムを書くことは可能です。
興味があれば、「VBA 引数」で検索して調べてみてください。
プログラム2|変数設定
1 2 |
Dim i As Long, k As Long Dim waitTime As Variant |
変数を設定します。
プログラム3|シート設定
1 2 |
Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("データ一覧") |
wsをワークシート型で変数設定します。
「データ一覧」シートをwsとします。
プログラム4|エクセルの最終行と最右列を取得
1 2 3 |
Dim cmax As Long, cnt As Long cmax = Range("A65536").End(xlUp).Row cnt = Range("IV1").End(xlToLeft).Column |
エクセルの最終行と最右列を取得します。
これにより差し込み印刷を行うデータ一覧の範囲を設定します。
cmaxはA列の最終行を取得します。この事例ではA11がA列の最終行であるため、cmax=11となります。
cntは1行目の最右列を取得します。この事例ではG1が1行目の最右列であるため、cnt=7となります。
なお列は「A列:1,B列:2,C列:3,・・・,G列:7」とカウントしていくため、cnt=7です。
cmaxとcntをDebug.Printでチェックしてみます。
1 2 3 4 5 6 7 8 |
Dim cmax As Long, cnt As Long cmax = Range("A65536").End(xlUp).Row cnt = Range("IV1").End(xlToLeft).Column Debug.Print "cmax:" & cmax Debug.Print "cnt:" & cnt >>>cmax:11 >>>cnt:7 |
プログラム5|ワード起動
1 2 3 |
Dim wdapp As Word.Application Set wdapp = CreateObject("Word.application") wdapp.Visible = True |
ワードアプリケーションを起動します。
「wdapp.Visible = True」でワードをPC上に見える形で起動します。
プログラム6|テンプレートワードのパス取得
1 2 |
Dim path As String path = ThisWorkbook.path & "\Sample.docx" |
テンプレートのワードファイルのパスをpathで取得します。
なおテンプレートワードファイルはエクセルと同じフォルダに保管してある必要があります。
pathをDebug.Printでチェックしてみます。
1 2 3 4 5 |
Dim path As String path = ThisWorkbook.path & "\Sample.docx" Debug.Print "path:" & path >>>path:D:\(省略)\01_Excelの情報をwordに差し込み印刷\Sample.docx |
上記のとおりテンプレートのWordファイルのpathを取得できました。
プログラム7|エクセルのデータを1行ずつ処理
1 |
For i = 2 To cmax |
2行目からcmax(11)行目まで処理を行います。
各行のデータを一覧をもとに置換(差し込み)を行います。
プログラム8|テンプレートワードを開く
1 2 3 4 |
Dim wddoc As Word.Document Set wddoc = wdapp.Documents.Open(path) waitTime = Now + TimeValue("0:00:03") Application.Wait waitTime |
プログラム6で設定したテンプレートワードを開きます。
このときwaittimeでワードを起動するまで3秒待つようにしています。
3秒待つ理由は、ワードファイルを開く前にワードに対する処理が行われないようにするためです。
実はワードファイルを開くときに時間がかかる場合があり、ワードファイルを開く前に処理が行われると予期しない結果になってしまうリスクがあるのです。
よって3秒待つことで、正しく処理が実行されるようにします。
プログラム9|テンプレートワードにエクセルデータを挿入
1 2 3 4 5 6 7 8 9 10 |
For k = 0 To cnt - 2 With wddoc.Content.Find .Text = ws.Range("B1").Offset(0, k).Value .Forward = True .Replacement.Text = ws.Range("B" & i).Offset(0, k).Value .Wrap = wdFindContinue .MatchFuzzy = True .Execute Replace:=wdReplaceAll End With Next |
エクセルのデータでWordの該当箇所に置換していきます。この置換によりデータを差し込んでいきます。
2. [名] → 留美
3. [住所] → 茨城県つくば市臼井10-14-11
4. [電話番号] → 03-5585-6163
5. [メールアドレス] → luctus@gild-a.ob.jp
(置換前 → 置換後)
エクセルの一覧をもとに差し込み(印刷)を行っていきます。
プログラム10|データを差し込んだワードを印刷
1 |
wddoc.PrintOut |
差し込みが完了したWordを印刷(プリントアウト)します。
事前にワードファイルで印刷を行って、正しくプリントアウトされることを確認しておきます。
印刷設定がうまくいっていないと、ここでVBAプログラムがエラー停止してしまいます。
プログラム11|ワードファイルを保存
1 2 3 |
Dim str As String str = ws.Range("A" & i).Value & "_" & Range("B" & i).Value & Range("C" & i).Value & ".docx" wddoc.SaveAs Filename:=ThisWorkbook.path & "\" & str |
差し込みが完了したワードファイルを新しいファイル名で保存します。
新しいファイル名はstrで設定します。
strをDebug.Printでチェックしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
For i = 2 To cmax '(省略) Dim str As String str = ws.Range("A" & i).Value & "_" & Range("B" & i).Value & Range("C" & i).Value & ".docx" Debug.Print "str:" & str Next >>>str:1_門司留美.docx >>>str:2_倉敷彰.docx >>>str:3_宮崎孝富.docx >>>str:4_高岡敦史.docx >>>str:5_能代一郎.docx >>>str:6_鳴門輝恵.docx >>>str:7_鹿児島役子.docx >>>str:8_宮城奈津子.docx >>>str:9_前橋玲子.docx >>>str:10_福知山謙次.docx |
上記のstrでワードファイルを新しい名前で保存します。
プログラム12|テンプレートワードを保存せずに閉じる
1 |
wddoc.Close savechanges:=False |
プログラム8で開いたWordファイルを保存せずに閉じます。
ここを上書き保存してしまうと、テンプレートであるワードファイルにデータが差し込まれた状態で保存されます。
よってワードを保存せずに閉じるようにする必要があります。
プログラム13|オブジェクト解放
1 |
Set wddoc = Nothing |
プログラム8で設定したwddocのオブジェクトを解放します。
プログラム14|エクセルにデータを出力
1 2 |
ws.Range("G" & i).Value = Now & "処理済" Next |
エクセルのG列にプログラム処理を実行した日時を出力します。
これで処理が完了していることをエクセル上で確認できるので便利です。
プログラム15|ワードをアプリケーションごと閉じる
1 2 |
wdapp.Quit Set wdapp = Nothing |
プログラム5で起動したワードをアプリケーションごと閉じます。
同時にwdappのオブジェクトを解放します。
プログラム16|プログラム終了
1 |
End Sub |
プログラム1と対になるプログラムで、プログラム終了させるための記述です。
「End Sub」を読み込むと、プログラムが終了します。
プログラムの解説はここまでです。
エクセルVBAでWordを操作する事例
エクセルVBAを使ってWordを操作することで、業務を効率化することができます。
以下のページで仕事で使える事例を使ってプログラム解説をしています。またVBA入りのファイルをダウンロード可能です。
上記のページでは具体的に下の内容を紹介しています。
VBAでWordを開く,名前をつけて保存,閉じる|非表示や読み取り専用で開く方法も紹介
エクセルVBAでWordにデータを差し込み置換してPDFに変換・作成
VBAでワード操作!エクセル表をコピーしてWordに貼り付ける
エクセルマクロVBAで資料送付状(Word)の作成・印刷を効率化
VBAでWord議事録メモを作成して最前面表示!ファイルコピーと一覧化で整理整頓
VBAで翻訳を自動化!Word文章をGoogle翻訳するツール紹介|日本語と英語が対象
Excel VBAについて詳しく理解したいなら
VBAを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にVBAを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
動画でも解説しています。
エクセルマクロVBAで出来ることを15の事例で紹介|日常業務をラクにするヒントを見つけよう!
(音声が小さいので、ボリュームを上げてご覧いただければと思います)
VBAの勉強方法
私はプログラミング初心者からVBAを勉強を始めて少しずつレベルアップしていきました。
成長の過程は以下で紹介しています。
学習の過程では、意識すべきポイントがあります。
特に独学の場合だと、勉強を優先してしまい、肝心な実践を疎かにしがちです。
私の経験では、実践から逆算した勉強が必要だと考えています。
目指すべきは会社でお金をもらいながら勉強することです。
要はVBAを仕事の一つとして上司に認めてもらうのです。
そうすればわざわざ高いお金を払って勉強をする必要がなくなります。
しかも作業を自動化して、会社やチームに貢献しつつ、自らのスキルアップできます。
そのために必要な考え方を以下で紹介しています。
またオンライン教材についても紹介しておきます。
上記のリンクでは、私の経験から勉強にオススメの教材を紹介しています。
興味がある人はご覧ください。
さて学習の過程では、意識すべきポイントがあります。
自分のレベルに合わせて、少しずつレベルアップしていくとより効果的に学ぶことができます。
以下のページで事例や動画を使いながら、エクセルマクロについて勉強できます。
上記のリンクでは、体系的にマクロを勉強できますので、興味がある人はご覧ください。