仕事をしていると、顧客や社員のエクセルリストの情報からPDFを作成したいときがあります。
しかしエクセルをワードに転記しPDFを作成する工程を一つずつ行っていると、作業に時間がかかってしまいます。
また資料にミスがあると、やり直しになったり信頼を失ってしまったりしかねません。
このときExcel VBAとWordを組み合わせるとPDF作成作業を自動化できます。
そこでExcel×Word×PDFを連携したVBAサンプルを紹介します。
・VBAプログラム入りのエクセルをダウンロード可能
それでは以下で詳しく紹介していきます。
目次
- 1 VBA作成前の2つの事前準備
- 2 エクセルVBAでWordを個別に作成してPDFにする
- 3 VBA入りのエクセルファイルをダウンロード
- 4 VBAのプログラムソース解説
- 4.1 プログラム0|変数宣言の指定
- 4.2 プログラム1|プログラム開始
- 4.3 プログラム2|変数設定
- 4.4 プログラム3|Wordを起動する
- 4.5 プログラム4|Excelの「word差し込み」シートの設定
- 4.6 プログラム5|Excelの「word差し込み」シートのデータ取得
- 4.7 プログラム6|Excelのデータを一行ずつ処理する
- 4.8 プログラム7|Wordの「Template.docx」を開く
- 4.9 プログラム8|各行のデータをもとにTemplate.docxのデータを置換
- 4.10 プログラム9|置換後のWordファイルをPDFに変換
- 4.11 プログラム10|G列にPDFパスを入力
- 4.12 プログラム11|Wordファイルを閉じる(保存せずに)
- 4.13 プログラム12|Wordアプリを閉じてオブジェクト解放
- 4.14 プログラム13|プログラム終了
- 5 Excel VBAについて詳しく理解したいなら
- 6 VBAを自分で書けるようになる
VBA作成前の2つの事前準備
ExcelでVBAを使うためにはいくつかの準備が必要です。
具体的には以下です。
2. Wordを操作するための事前準備
上記の2つに関して、以下で説明します。
事前準備1. ExcelでVBAを使うための事前準備
Excelで、以下の2つの準備をします。
2. 開発タブを追加
保存ファイルの拡張子変更、Excelの基本設定変更の2つです。
2つともで難しい作業はなく、それぞれ1分もあれば設定変更可能です。
上記に関しては、以下の記事で解説をしています。
もしVBAを使うための準備段階に不安がある人は上記をご覧ください。
この内容は以下の動画で紹介しています。
入門エクセルマクロの使い方|マクロ作成から実行までを徹底解説
文字や画像だけで分かりづらい人は上記の動画をご覧ください。
事前準備2. Wordを操作するための事前準備
Excel VBAでWordを操作するためには、VBAの設定を変更しておく必要があります。
実はVBAがデフォルト設定の場合、Word操作はできません。
なぜなら、参照設定が変更だからです。参照設定とは、機能拡張させることです。
参照設定を変更することで、Wordを操作できるようになります。
この記事で紹介するプログラムを使えるようにするには、以下の2つの参照設定を変更します。
2.Microsoft Scripting Runtime
「Microsoft Word XX.0 Object Library」にチェックを入れることで、Word操作の設定ができるようになります。
「Microsoft Word XX.0 Object Library」と記載しましたが、「XX.0」は15.0などの数値が入っています。
「Microsoft Word XX.0 Object Library」は1種類しかないはずので、それにチェックを入れます。
「Microsoft Scripting Runtime」にチェックを入れることで、添付ファイルを保存するフォルダを作成することができるようになります。
VBAの参照設定の方法
以下、具体的な設定方法を紹介します。
手順2.Microsoft Word 16.0 Object Libraryのライブラリにチェックを入れて、OKをクリック
詳細はこちらの画像の通りです。
手順1.VBEを開いて頂いて、「ツール」→「参照設定」
手順2.Microsoft Word 16.0 Object Libraryのライブラリにチェックを入れて、OKをクリック
ここでは「Microsoft Word 16.0 Object Library」としていますが、「16.0」ではなく「15.0」のような他の数値が入っていることがあります。
お使いのExcelによっては、16.0以外の数値が入っている場合があります。その場合、一番大きな数値のもの(1つしかないですが)にチェックを入れるようにします。
上記の設定をしていないと、本事例で紹介しているWord操作の事例は動作しません。
必ずチェックを入れるようにします。
エクセルVBAでWordを個別に作成してPDFにする
今回は以下の作業を自動化します。
ただし一言で自動化と言っても、事前作業が2つあります。
VBA実行前の作業
2. エクセルにテンプレート(ワード)で置換したい文言を一覧にしておく
3. ワードとエクセルを同じフォルダに保存しておく
1. ワードでテンプレート文章を作成し、「Template.docx」というファイル名で保存する
今回は、ワードファイルに記載した「[姓]、[名]、[住所]、[電話番号]、[メールアドレス]」を置換するようにします。
一つ注意があります。
たとえば「[姓]」を読み込むため、「{姓}、姓、”姓”」といった書き方は全て読み込みません。あくまで「[姓]」の文言を置換します。
2. エクセルにテンプレート(ワード)で置換したい文言を一覧にしておく
エクセルの赤枠で囲んだ部分を、ワードファイルに記載した「[姓]、[名]、[住所]、[電話番号]、[メールアドレス]」と置換させます。置換作業はVBAで実行します。
なおヘッダー部分の「[姓]、[名]、[住所]、[電話番号]、[メールアドレス]」をワードの記載と対応させています。
要は「エクセルのヘッダーの記載」と「ワードの置換用文字」を対応させていますので、エクセルのヘッダーとワードの置換用文字を両方変更すれば、置換は可能です。
この説明が分かりづらい人は、ファイルをダウンロードできるようにしているので、そのまま使っていただければと思います。
3. ワードとエクセルを同じフォルダに保存しておく
本記事で紹介しているVBAプログラムでは、ワードとエクセルを同じフォルダに保存しておく必要があります。
VBAプログラムを変更すれば、別フォルダでの保管でも問題ありませんが、当然VBAプログラムの修正が必要です。
エクセルからメールアドレスと通知設定を取得
エクセルに入力されたメールアドレスに対してメールを自動送信します。
よって、メールアドレスが間違っていたり空欄だったりすると、メールを送信できません。
またエクセルの一覧の中には、メール送信が不要な場合もあることを考慮し、通知設定をON/OFFで切り替えることができるようにします。
VBA実行
事前作業が完了したら、メール自動送信のVBA(マクロ)を実行します。
今回は以下の作業をVBAで自動化します。
2. テンプレートのワードファイルの文言を置換してPDF化
3. エクセルにPDFのパスを出力
VBAを実行すると、エクセルの一覧の情報を取得しワードからPDFを作成します。そしてPDFのパスをエクセルに出力します。
PDFのパスを出力させる意図は、このPDFをメール送信することを想定しているからです。
上記のリンクの内容を参考にプログラムを改編することで、PDF作成からメール送信まで自動化できます。
そうすることで大幅な効率化を期待できます。
VBA入りのエクセルファイルをダウンロード
以下で紹介しているVBAプログラムをそのまま使いたい人は、以下のフォームからダウンロードできます。
登録したメールアドレスへ「zipファイル」を送信します。
そのzipファイルには、「Excel(本記事のVBAプログラム入り)、ワードファイル(テンプレート)」が保管されています。
本プログラムの内容をそのまま使用可能です。ぜひお仕事にお役立てください。
それでは、以下でプログラムについて詳細を説明します。
VBAのプログラムソース解説
今回紹介するプログラムの概要は以下です。
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 |
'プログラム0|変数宣言の強制 Option Explicit 'プログラム1|プログラム開始 Sub Word_Sashikomi_PDF() 'プログラム2|変数定義 Dim waitTime As Variant Dim i As Long, k As Long Dim path As String, pdffilepath As String, pdffilename As String 'プログラム3|Wordを起動する Dim wdapp As Word.Application Set wdapp = CreateObject("Word.application") Dim wddoc As Word.Document wdapp.Visible = True path = ThisWorkbook.path & "\Template.docx" 'プログラム4|Excelの「word差し込み」シートの設定 Dim ws1 As Worksheet Set ws1 = Worksheets("word差し込み") 'プログラム5|Excelの「word差し込み」シートのデータ取得 Dim myrange1 As Variant myrange1 = ws1.UsedRange 'プログラム6|Excelのデータを一行ずつ処理する For i = LBound(myrange1) + 1 To UBound(myrange1) 'プログラム7|Wordの「Template.docx」を開く Set wddoc = wdapp.Documents.Open(path) waitTime = Now + TimeValue("0:00:03") Application.Wait waitTime 'プログラム8|各行のデータをもとにTemplate.docxのデータを置換 For k = LBound(myrange1, 2) + 1 To UBound(myrange1, 2) - 1 With wddoc.Content.Find .Text = myrange1(1, k) .Forward = True .Replacement.Text = myrange1(i, k) .Wrap = wdFindContinue .MatchFuzzy = False .Execute Replace:=wdReplaceAll End With Next 'プログラム9|置換後のWordファイルをPDFに変換 pdffilename = myrange1(i, 1) & "_" & myrange1(i, 2) & myrange1(i, 3) & ".pdf" pdffilepath = ThisWorkbook.path & "\" & pdffilename wddoc.SaveAs2 Filename:=pdffilepath, FileFormat:=17 'プログラム10|G列にPDFパスを入力 ws1.Range("G" & i).Value = pdffilepath 'プログラム11|Wordファイルを閉じる(保存せずに) wddoc.Close savechanges:=False Next 'プログラム12|Wordアプリを閉じてオブジェクト解放 wdapp.Quit Set wddoc = Nothing Set wdapp = Nothing 'プログラム13|プログラム終了 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 Word_Sashikomi_PDF() |
「Sub Word_Sashikomi_PDF()」のプログラムを開始することを意味します。
VBAではプロシージャという単位でプログラムを呼び出します。
プロシージャの構文は下記となっています。
‘処理プログラム
End Sub
「Sub」で始まり「End Sub」で終わります。
「Sub XXXX」の「XXXX」の部分がプロシージャ名です。
このプロシージャ名はあらゆる文字(アルファベット、ひらがな、漢字、数字など)が使用可能です。
ただし、プロシージャ名の先頭は数字を入れるとエラーとなります。
あとで見たときに、「何のプログラムだったのか?」とならないようにするためです。
なお、「()」の中には何も記入されていません。これは引数なしという意味です。
初心者の内は、引数ということが分からなくてもVBAプログラムを書くことは可能です。
興味があれば、「VBA 引数」で検索して調べてみてください。
プログラム2|変数設定
1 2 3 |
Dim waitTime As Variant Dim i As Long, k As Long Dim path As String, pdffilepath As String, pdffilename As String |
変数を設定します。詳しくは以下です。
waitTimeをvariant型で定義します。watiTimeはプログラム7でワードファイルを開くときの処理待ち時間として使います。
iとkをLong(整数)型で定義します。エクセルを一行ずつ読み込んでデータを取得するときに使います。
path, pdffilepath, pdffilenameをそれぞれString(文字列)型で定義します。pathはテンプレートのワードファイルのパス、pdffilepathはPDFのファイルパス(絶対パス)、pdffilenameはPDFのファイル名としてそれぞれ使用します。
プログラム3|Wordを起動する
1 2 3 4 5 |
Dim wdapp As Word.Application Set wdapp = CreateObject("Word.application") wdapp.Visible = True Dim wddoc As Word.Document path = ThisWorkbook.path & "\Template.docx" |
Excel VBAでWordを操作するための設定を行います。
1 2 3 |
Dim wdapp As Word.Application Set wdapp = CreateObject("Word.application") wdapp.Visible = True |
まずはワード起動用(Word.Application)の変数をwdappで設定します。
そして「Set wdapp = CreateObject(“Word.application”)」という処理を行うことで、変数wdappにワードを設定することができます。
「wdapp.Visible = True」でワードを起動して、PC上に表示させます。
4 |
Dim wddoc As Word.Document |
ワードファイルを操作(Word.Document)するための変数wddocを定義します。
これにより、プログラム7でワードファイルを開き、操作できるようになります。
5 |
path = ThisWorkbook.path & "\Template.docx" |
変数pathに「ThisWorkbook.path & “\Template.docx”」を入れます。
これにより、エクセルと同じフォルダに存在する「Template.docx」のファイルパス(絶対パス)を取得します。
フルパスを取得しておく方が、エラーが発生しづらいので、ここではフルパスを取得するプログラムにしています。
プログラム4|Excelの「word差し込み」シートの設定
1 2 |
Dim ws1 As Worksheet Set ws1 = Worksheets("word差し込み") |
変数ws1をWorksheet(ワークシート)型で定義します。
そのws1にエクセルシート「word差し込み」を設定します。
プログラム5|Excelの「word差し込み」シートのデータ取得
1 2 |
Dim myrange1 As Variant myrange1 = ws1.UsedRange |
変数myrange1をvariant型で定義します。variant型で定義することで、型に制限されることなくデータを取り扱うことができます。
型とは、String(文字列)やWorksheet(ワークシート)やLong(整数)のことを指します。
型を指定することで、扱うことができるデータに制限が加わります。
そして「myrange1 = ws1.UsedRange」でExcelの「word差し込み」シートのデータをまるごと取得できます。
ws1.UsedRangeは、シート「word差し込み」で使用されているセルを全て取得します。
取得したデータは二次元配列として格納されるため、プログラム6以降では二次元配列であるmyrange1を活用して処理を行います。
二次元配列の注意点
二次元配列は処理速度が早くなったり、プログラムを書く量を減らしたりできます。
ただしプログラミング初心者の場合、慣れるまで時間がかかることが多いです。実際に私も躓きました。
そのため二次元配列が分からない人は、二次元配列にこだわらず、他の方法で処理することを目指すのも問題ありません。
エクセルVBAの場合、二次元配列でないと処理ができない場面はそう多くありません。
実際にプログラム6以降も、最終行を取得し、2行目から最終行まで処理するプログラムで対応可能です。
分からないことは無理せず、別のやりやすい方法で対応することをお勧めします。
プログラム6|Excelのデータを一行ずつ処理する
1 |
For i = LBound(myrange1) + 1 To UBound(myrange1) |
本事例では、エクセルのデータを2行目から最終行まで処理させます。
なぜならエクセルの1行目はヘッダー情報で処理には不要だからです。
以下で、「LBound(myrange1) + 1 To UBound(myrange1)」とする理由を、LBound関数とUBound関数の性質を踏まえて詳しく説明します。
LBound関数とUBound関数
「UBound(myrange1)」は二次元配列myrange1のインデックスの最大値
この事例では、どのような値が返ってくるかというと、以下のとおりです。
Debug.Print(“LBound(myrange1):” & LBound(myrange1))
Debug.Print(“UBound(myrange1):” & UBound(myrange1))
>>>LBound(myrange1):1
>>>UBound(myrange1):11
上記の結果が得られます。
つまりインデックスの最小値とはエクセルのデータが入っている一番上の行=「LBound(myrange1))」となり1、インデックスの最大値とはエクセルのデータが入っている最終行=「UBound(myrange1))」となり11となります。
さて本事例では、1行目はヘッダー情報であり処理は不要です。そのため2行目から処理を実行させる必要があります。
そこで「LBound(myrange1) + 1」とすることで2行目から開始させるようにしています。UBound(myrange1)=11のため、結果的に「For i = LBound(myrange1) + 1 To UBound(myrange1)」は「For i = 2 To 11」となります。
ここではLBound関数やUBound関数をメインに解説しましたが、ForNextを正しく使えないとLBound関数やUBound関数も上手く活用できません。
ForNextに自信がない人は、ForNextの使い方について以下で事例を交えながら解説しています。
さらに詳しく知りたい方は上記のリンクをご覧ください。
プログラム7|Wordの「Template.docx」を開く
1 2 3 |
Set wddoc = wdapp.Documents.Open(path) waitTime = Now + TimeValue("0:00:03") Application.Wait waitTime |
エクセルファイルを同じフォルダに存在する「Template.docx」を開く処理を行います。
1 |
Set wddoc = wdapp.Documents.Open(path) |
プログラム3で設定したpathには、「Template.docx」のフルパス(絶対パス)が設定されています。
またプログラム4でwdddocをワードファイル型で変数定義しています。
そのため「Set wddoc = wdapp.Documents.Open(path)」とすることで、「Template.docx」を開くことができます。
2 3 |
waitTime = Now + TimeValue("0:00:03") Application.Wait waitTime |
ここでは3秒、プログラムを止める処理を行っています。
なぜならワードファイルが開く前に処理が進むことでエラーが出ることがあるからです。
ワードファイルを開くとき、数秒時間かかることがあります。
もしワードファイルを開くのに2秒かかる場合、ワードファイルが開く前にプログラム8以降の処理が実行されるとどうなるでしょうか。
ワードファイルが開いていないため、エラーになってしまうことがあります。
そうすると、プログラムが正しく動作しないことになってしまうため、ここで3秒停止しています。
3秒はあくまで目安です。PCの動作が重い場合は、4秒や5秒止めたほうがいいこともあります。
4秒や5秒止めたい場合は、以下のようにTimeValue(“0:00:0X”)の「X」の部分を変更します。
5秒停止:waitTime = Now + TimeValue(“0:00:05”)
これでプログラムを停止させる時間をコントロールできます。
プログラム8|各行のデータをもとにTemplate.docxのデータを置換
1 2 3 4 5 6 7 8 9 10 |
For k = LBound(myrange1, 2) + 1 To UBound(myrange1, 2) - 1 With wddoc.Content.Find .Text = myrange1(1, k) .Forward = True .Replacement.Text = myrange1(i, k) .Wrap = wdFindContinue .MatchFuzzy = True .Execute Replace:=wdReplaceAll End With Next |
「Template.docx」の文言を、エクセルデータをもとに置換していきます。
以下で詳しく説明します。
1 |
For k = LBound(myrange1, 2) + 1 To UBound(myrange1, 2) - 1 |
エクセルのB列(2)からF列(6)まで処理させます。
A列はNo、G列はPDF資料のURL(フルパス)であり、Template.docxの文言置換は不要だからです。
さて以下で、「LBound(myrange1, 2) + 1 To UBound(myrange1, 2) – 1」とする理由を説明します。
LBound関数とUBound関数で列の要素数を取得する方法
「UBound(myrange1, 2)」でエクセル列の最大値
プログラム6で「LBound(myrange1) + 1 To UBound(myrange1)」とすることで、2~11でエクセルの各行を処理させました。
このようにLBound(myrange1)やUBound(myrange1)は行の最小値と最大値を取得できるのです。
それでは列の最小値と最大値を取得するにはどのようにすれば良いのかというと、「LBound(myrange1, 2) 」や「UBound(myrange1, 2)」のように「,2」を追記すれば良いです。
実際、この事例ではどのような値が返ってくるかというと、以下のとおりです。
Debug.Print(“LBound(myrange1,2):” & LBound(myrange1,2))
Debug.Print(“UBound(myrange1,2):” & UBound(myrange1,2))
>>>LBound(myrange1,2):1
>>>UBound(myrange1,2):7
上記の結果が得られます。
エクセルのデータが入っている一番左の列「LBound(myrange1,2))」は1(A列)、エクセルのデータが入っている一番右の列「UBound(myrange1,2))」となり7(G列)となります。
さて本事例では、1列目(A列)はNo、7列目(G列)はPDF資料のURL(フルパス)であり、処理不要です。2列目(B列)~6列目(F列)で処理を実行させる必要があります。
そこで「LBound(myrange1, 2) + 1 To UBound(myrange1, 2) – 1」とします。そうすることで、結果的に「For i = LBound(myrange1, 2) + 1 To UBound(myrange1, 2) – 1」は「For i = 2 To 6」となります。
これでB列からG列まで各列の処理を順々に実行していきます。
2 3 4 5 6 7 8 9 |
With wddoc.Content.Find .Text = myrange1(1, k) .Forward = True .Replacement.Text = myrange1(i, k) .Wrap = wdFindContinue .MatchFuzzy = False .Execute Replace:=wdReplaceAll End With |
この処理で置換を行います。
以下で各文言が指す意味を記載します。
VBAプログラム | 内容 |
---|---|
With wddoc.Content.Find | 最終行の「End With」まで、各プログラムの接頭に「wddoc.Content.Find」に付けるのを省略 |
.Text = myrange1(1, k) | Wordの文言「myrange1(1, k)」を検索(Excelの1行目、k列目の値) |
.Forward = True | 検索をWordの先頭から末尾に向かって実施 |
.Replacement.Text = myrange1(i, k) | Excelのi行目、k列目の値で置換 |
.Wrap = wdFindContinue | Wordでの検索が文書の先頭以外の位置で開始されて、文書の末尾に到達した場合、最初から繰り返す |
.MatchFuzzy = False | 「あいまい検索*」はしない(False) |
.Execute Replace:=wdReplaceAll | 置換を実施 |
End With | 1行目の「With wddoc.Content.Find」の終わりを表す |
*あいまい検索とは、大文字・小文字、全角文字・半角文字、ひらがな・カタカナ、長音の有無など、文字の種類や表記を区別しないで検索すること
置換完了後のWordファイルは以下のようになっています。
10 |
Next |
この「Next」はプログラム8冒頭の「For k = LBound(myrange1, 2) + 1 To UBound(myrange1, 2) – 1」のFor文の終わりを意味します。
プログラムがここまで来たら、プログラム8の冒頭に戻り、次の列の処理を行います。
プログラム9|置換後のWordファイルをPDFに変換
1 2 3 |
pdffilename = myrange1(i, 1) & "_" & myrange1(i, 2) & myrange1(i, 3) & ".pdf" pdffilepath = ThisWorkbook.path & "\" & pdffilename wddoc.SaveAs2 Filename:=pdffilepath, FileFormat:=17 |
プログラム8でWordの必要箇所の置換が終了しています。
そのため、プログラム9では置換後のWordをPDFに変換していきます。
1 2 |
pdffilename = myrange1(i, 1) & "_" & myrange1(i, 2) & myrange1(i, 3) & ".pdf" pdffilepath = ThisWorkbook.path & "\" & pdffilename |
「pdffilename = myrange1(i, 1) & “_” & myrange1(i, 2) & myrange1(i, 3) & “.pdf”」で、PDFのファイル名を設定します。ファイル名を指定することで、規則だったファイル名を付けることができます。
2. myrange1(i, 2):姓(B列)
3. myrange1(i, 3):名(C列)
上記の1と2の間を「_(アンダーバー」でつなぎ、最後に「.pdf」が付く
実例:「1_門司留美.pdf」
このようにPDFのファイル名が自動で付けられるようにします。
「pdffilepath = ThisWorkbook.path & “\” & pdffilename」とすることで、「エクセルファイルのパス」と「PDFのファイル名」を結合することで、フルパスを作成しておきます。
次のプログラムで、この「pdffilepath(PDFファイルのフルパス)」で指定したパスにPDFを保存します。
3 |
wddoc.SaveAs2 Filename:=pdffilepath, FileFormat:=17 |
WordをPDFに変換して保存します。
「SaveAs2」としたり、「FileFormat:=17」としたりしていますが、WordからPDFに変換するときはこの方法で処理が可能です。
「SaveAs2」や「FileFormat:=17」に疑問を持つ人もいるかもしれません。詳しい説明をするよりも、こういう型だと思っていただく方が混乱が少ないと思います。
ひとまずここはコピペしてそのまま活用していただくとよいです。
プログラム10|G列にPDFパスを入力
1 |
ws1.Range("G" & i).Value = pdffilepath |
G列にプログラム9で作成したpdffilepathを出力します。
なぜこのpdffilepathを入れるかというと、PDFのフルパスを活用することでさらなる効率化が期待できるからです。
たとえば作成したPDFをF列のメールアドレス宛に送信する場合があります。
このとき、Outlookと連携させることで、メール送信まで自動化することが可能です。
個別にメールを送信するプログラムと組み合わせると、単純作業を大きく減らせるはずです。
プログラム11|Wordファイルを閉じる(保存せずに)
1 2 |
wddoc.Close savechanges:=False Next |
ワードを閉じて、プログラム6に戻ります。
1 |
wddoc.Close savechanges:=False |
プログラム7で開いたwordを閉じます。
このとき「savechanges:=False」とすることで、保存せずにwordを閉じます。
理由は保存してしまうと、テンプレートの置換文字が置換されてしまい、テンプレートとして使えなくなるからです。
たとえば「{姓}」を「門司」で置換したファイルを保存してしまうと、次の行で置換されなくなってしまいます。({姓}の置換文字がなくなってしまうため)
そのため、保存せずにwordを閉じる必要があります。
なお、ここで閉じたTemplate.docxはプログラム6で置換前のwordとして開きます。
2 |
Next |
この「Next」はプログラム6「For i = LBound(myrange1) + 1 To UBound(myrange1)」のFor文の終わりを意味します。
このようにプログラム6~プログラム11で「開く」と「閉じる」を繰り返しています。まさにこの部分が人力でやる仕事を、プログラミングで代用している箇所です。
プログラム0~プログラム5は事前準備、プログラム12~プログラム13は後処理とイメージしていただくとよいです。
プログラム12|Wordアプリを閉じてオブジェクト解放
1 2 3 |
wdapp.Quit Set wddoc = Nothing Set wdapp = Nothing |
Wordをアプリごと閉じます。つまり、[Alt] + [F4]でWordを閉じるのと同じように、Wordそのものを閉じます。
またwddoc(ワードファイル用の変数)とwdapp(ワードアプリ用の変数)で設定したオブジェクトを解放します。
VBAではオブジェクトの解放をし忘れてもエラーは発生しませんが、他のプログラミング言語を学んでいくことも想定すると、お作法として覚えておくと良いです。
プログラム13|プログラム終了
1 |
End Sub |
プログラム1の「Sub Word_Sashikomi_PDF()」と対になるプログラムです。
プログラム終了させる記載です。
「End Sub」を読み込むと、プログラムが終了します。
プログラムの解説はここまでです。
Excel VBAについて詳しく理解したいなら
VBAを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にVBAを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
動画でも解説しています。
エクセルマクロVBAで出来ることを15の事例で紹介|日常業務をラクにするヒントを見つけよう!
(音声が小さいので、ボリュームを上げてご覧いただければと思います)
VBAの勉強方法
私はプログラミング初心者からVBAを勉強を始めて少しずつレベルアップしていきました。
成長の過程は以下で紹介しています。
学習の過程では、意識すべきポイントがあります。
特に独学の場合だと、勉強を優先してしまい、肝心な実践を疎かにしがちです。
私の経験では、実践から逆算した勉強が必要だと考えています。
目指すべきは会社でお金をもらいながら勉強することです。
要はVBAを仕事の一つとして上司に認めてもらうのです。
そうすればわざわざ高いお金を払って勉強をする必要がなくなります。
しかも作業を自動化して、会社やチームに貢献しつつ、自らのスキルアップできます。
そのために必要な考え方を以下で紹介しています。
とはいえ、プログラミング初心者でVBAについて知識ゼロの人もいるはずです。
いきなり会社でVBAで使うことさえ、とてつもなくハードルが高く見えてしまうものです。
その場合は、VBAの基本について学ぶ必要があります。
たとえば車の運転も慣れてしまえば、たいしたことではありません。
しかし教習所で運転の基本を学び、免許を取得することで、公道で運転できるようになります。
VBAも同じです。VBAに免許はありませんが、まずは基本を学ばないことには会社で使えるレベルにはなりません。
実際に私もプログラミング初心者のときは、動画を見たり書籍を読んだりして勉強しました。
今はオンラインの教材で無料で学習できるものも多いです。
上記のリンクでは、私の経験から勉強にオススメの教材を紹介しています。
興味がある人はご覧ください。
VBAを自分で書けるようになる
さて、本記事で紹介したマクロを利用すれば、作業の自動化が可能になります。
しかしデメリットもあります。それはカスタムできないことです。
なぜなら、色々な要望が増えるからです。
この動画を見たとき、「もっと○○ができるのでは?」や「ここはなんとかならないのか」と感じる人は少なくないはずです。
例えば、「他の条件を付け加えたい」や「日付毎に条件を変えたい」といった要望が出るかもしれません。
このような要望を満たすには、マクロを勉強して自力でマクロを編集できるようになる必要があります。
もし、自力でマクロを編集できるようになれば、今より仕事の効率はグッと上がります。
実際、私も自力でマクロを書けるようになってからは、仕事の生産性が一気に上がりました。
他の人が30分~1時間かけて行う仕事が、ボタン一つで終わらせることができるようになったのです。
その結果、周囲からの信頼も増し、仕事で高い評価を得られるようになりました。
ただ、要望に応えるようになるためには、マクロを学ぶ必要があります。
まずは無料でマクロを勉強してみる
ウェブや書籍で勉強すれば、マクロを習得できると考えている人は少なくありません。
しかし、仕事で使えるマクロを習得したいなら、仕事で使える部分に特化した教材で学ぶことをお勧めします。
なぜなら、ウェブや書籍には仕事に関係しない部分まで提供していることが多いからです。
例えば、マクロ初心者なのに配列を学ぼうとする人がいます。実は配列なしでも仕事で使えるマクロを書くことは可能です。
しかし、マクロ初心者ほど「全ての知識が必要だ」と考えて、無駄な学習に時間を使ってしまうのです。詳しくは、こちらの記事で紹介しています。
そこで、私がお勧めするのは仕事に直結するマクロ教材です。とくにお勧めするのは、こちらの無料オンライン動画です。
なぜなら、仕事に直結する部分に絞って、エクセルマクロを学ぶことができるからです。
マクロの作り方・考え方から解説しているので、教材をしっかり学べばここで紹介したマクロをゼロから書けるようになります。
マクロ初心者が、仕事に直結したいマクロを学ぶなら、まずはこちらの無料オンライン動画を試すのがいいです。
興味がある人は、まずは無料でエクセルマクロの勉強を始めてみてください。
もっと学びたいと感じたら、さらに深く勉強をしてみることをお勧めします。