◯ 差し込み文書や連続印刷を実現(前編)。
* 本文で触れている「サンプルブック」は こちら からダウンロードできます。
* Excelの「開発」タブが表示されていないときは、「ファイル」メニューの「オプション」を開き、「Excelのオプション」ウィンドウの「リボンのユーザー設定」をクリックします。右側の「リボンのユーザー設定」の「開発」にチェックを入れます。なお、上記は記事公開時点のMicrosoft 365(Windows)のExcelにおける操作方法であり、今後のバージョンアップなどによって手順が変わる可能性があります。
小清水さん「ああ、まったく。ああ、まったく」
末成くん「ど~したの小清水さん。そんなにイライラして…」
小清水さん「会員へのお知らせの文書をExcelで作ったら、ビジネス文書はWordが常識だろって部長が…」
末成くん「Excelの方が簡単なのにね」
小清水さん「がんばってWordドキュメントにコピーしてるけど、今日中に終わりそうにないわ」
末成くん「それは、お気の毒さん…。僕は残業がないのでお先に…」
小清水さん「つれないわね末成くん。つきあって残業するか、マクロを作るか…好きな方を選ばせてあげるわ」
Excelを業務で使っていて、思わず「困った」という経験はないでしょうか。そして、「こんなマクロがあれば、すぐに解決できるのに…」と、感じたことはないでしょうか。
Excelは大変便利な表計算ソフトですが、適切な使い方をしないと、正しい結果が得られないことが多々あります。この連載では、業務効率化を妨げている不適切な作業や悪習慣を、マクロで自動化することにによって解決していきます。
皆さんはビジネス文書の作成に、どのようなソフトウエアを使いますか? Excelは様々な用途に使用できる多機能な表計算ソフトなので、ちょっとした文書くらいなら、ワークシートで作成することができます。
しかし、会社によってはビジネス文書の作成は必ずWordを使う必要があったり、文書の保存や提出はWordのドキュメント形式のファイル(拡張子が「.docx」のファイル)で行う必要があったりと、Wordを使わざるを得ない状況が多いのもまた事実です。
もしもExcelのマクロを使って、ワークシートの表からWordのドキュメントを作成したり、作成した複数のドキュメントを連続して印刷したり、ドキュメントを連結して1つのドキュメントにしたりといったことができたら、すごく便利だと思いませんか?
今回はマクロを利用してWordドキュメントを操作する方法について、紹介していきたいと思います。では、早速作っていきましょう。
表のデータを使って差し込み文書を作成しよう!
まずはExcelに作成した表のデータを使用して、Wordのドキュメントに差し込み文書を作成し、名前をつけて保存するマクロを考えてみましょう。
「sample.xlsm」サンプルブックのSheet1シートには、あらかじめ次の表が作成されているものとします(図1)。
また、サンプルブックと同じフォルダーには、あらかじめ「有効期限.docx」という名前のファイルが保存されているものとします(図2)。有効期限.docxに作成されている文章は、図3です。
このドキュメントに対して、サンプルブックの表から「顧客名」「契約コース」「残りポイント」「有効期限」の各データを差し込み、新規にドキュメントファイルを作成したいと思います。
新規に作成するドキュメントは、ファイル名を「顧客番号」にして、サンプルブックと同じフォルダーに保存するものとします。また、ドキュメントファイルを作成する条件は、「残りポイント」の数値が0より大きい顧客を対象とすることとします。
では、早速作っていきましょう。Visual Basic Editor(VBE)を起動し、「挿入」メニューから「標準モジュール」をクリックして、標準モジュールを追加します。コードウィンドウに表示されたモジュールに、リスト1のコードを記述してください。
「お知らせ作成」という名前のプロシージャを作成しました。このプロシージャを実行すると、アクティブシートのE列の数値が0を超えるデータを対象に、サンプルブックと同じフォルダーにある有効期限.docxを開き、B列~F列のデータを差し込みます。その後、ファイル名をA列の文字列にリネームし、別名で保存します。
(1)の「Set wrd = CreateObject("Word.Application")」で、Wordのオブジェクトを作成します。作成したオブジェクトは、変数wrdに格納されます。変数にオブジェクトを格納するときは、Setステートメントを使用します。
(2)では、WordオブジェクトのVisibleプロパティに「True」を指定し、Wordアプリケーションを表示します。
(3)で、アクティブシートのA列の最終行を取得し、変数erに格納します。サンプルブックのSheet1シートの場合、数値の「12」が格納されます。
(4)のFor…Nextステートメントで、表の3行目から最終データ行までのセルに対して、繰り返し処理を行います。
(5)のIfステートメントの条件式「Cells(i, 5).Value> 0」で、E列の残りポイントが「0」を超えるとき、(6)~(13)の処理を実行します。残りポイントが「0」の顧客に対しては、何も処理を行いません。
(6)は、行継続文字「半角スペース」+「(半角アンダーバー)」を使用して改行していますが、実際は1行のコードです。ここで、サンプルブックと同じフォルダーにある有効期限.docxを開き(wrd.Documents.Open(ThisWorkbook.Path & "¥有効期限.docx"))、変数docに有効期限ドキュメントを格納します。この後(13)でドキュメントを閉じるまでは、変数docを使用して有効期限ドキュメントを操作することができます。
(7)で、マクロを実行した日付を和暦に変換して(Format(Date, "ggge年m月d日"))、ドキュメントの1段落目に挿入(doc.Paragraphs(1).Range.InsertBefore)します。Wordのドキュメント内の段落にデータを挿入するときは、「Paragraphs(x)」の「x」に、データを挿入したい段落の番号を入力します。
(8)では、ドキュメントの4段落目にB列の顧客名を挿入します。また挿入する際に、「様」の文字列を末尾に付加します。
(9)は16段落目にC列の契約コースを、(10)は17段落目にE列の残りポイントを、(11)は18段落目にF列の有効期限を、それぞれ挿入します。また挿入する際に、(9)は「契約コース:」、(10)は「残りポイント:」、(11)は「有効期限:」の文字列を、それぞれの先頭に付加します。
(12)では、作成したWordのドキュメントに名前を付けて保存(doc.SaveAs)します。保存先はマクロを実行するブックと同じフォルダーで、ファイル名はA列の顧客番号(Cells(i, "A").Value)に「.docx」を連結した名前です。
保存したら、(13)のCloseメソッドでドキュメントを閉じます。
(6)~(13)の処理を、E列の残りポイントが「0」でない顧客の数だけ繰り返した後、(14)でWordを終了し、(15)で「お知らせの作成が終了しました」のメッセージを表示して、コードを終了します。
では実際に、コードを実行して動作を確認してみましょう。
「マクロ」ダイアログボックスを表示し、「マクロ名」の一覧から「お知らせ作成」マクロを選択し、「実行」ボタンをクリックします。
マクロが正常に実行されると、「お知らせの作成が終了しました」のメッセージが表示されるので、「OK」ボタンをクリックします。次に、サンプルブックが保存されているフォルダーをエクスプローラーで開いてください(図4)。
「K0001.docx」「K0003.docx」「K0005.docx」「K0008.docx」「K0009.docx」の5つのドキュメントが作成、保存されています。これらはすべてSheet1シートのE列の、「残りポイント」があるデータになります。この中の「K0001.docx」をダブルクリックで開いてみましょう(図5)。
Wordが起動し、Wordドキュメントの内容が表示されます。ドキュメントの1段落目にマクロを実行した日付が和暦で、4段落目に顧客名が、16段落目に契約コースが、17段落目に残りポイントが、18段落目に有効期限が、それぞれ挿入されていることが確認できます。
ほかのWordドキュメントも確認してみてください。確認が終わったら、Wordを終了しましょう。