サンプル

年賀状の宛名をエクセルだけで印刷(エクセルVBA)

なくなりそうで、なかなかなくならないのが「年賀状」ですね。

そうですね。私は、エクセルで住所録を作って、ワードの「はがき宛名面印刷ウィザード」で印刷しています。

エクセルVBAを使えば、もっと簡単に印刷できますよ。

でも、VBAを使えるようになるまで大変じゃないですか。年に一度のことだし、私は現状のままでイイです。

そう言わずに挑戦してみませんか? このサイトで紹介している他のものに比べると簡単なマクロなので、入門用にぴったりだと思いますよ。

ダウンロード

まずは、サンプル・ファイルをダウンロードしてください。

旧バージョン(XLOOKUPおよびTEXTSPLIT関数が使えない場合はこちらをご利用ください。)

最新バージョン(XLOOKUPおよびTEXTSPLIT関数が使える場合はこちらをご利用ください。)

使用方法

  • 「データ」シートに必要なデータを入力してください。
  • 年ごとの列のセルをダブルクリックして、印刷したい宛名のセルに「○」を入力してください。
  • 見出し行のセルを選択した状態で「年賀状宛名」または「封筒宛名」シートを開くと、印刷用データが自動的に作成されます。
  • 「ファイル」-「印刷」をクリックして、印刷して下さい。

細部については、「マニュアル」シートを参照してください。

ブックとワークシートの構成

ブックの構成

事件データベースのブックは、4つのシートで構成されています。

  • 「データ」シート
  • 「年賀状宛名」シート
  • 「封筒宛名」シート
  • 「マニュアル」シート

「データ」シートの構成

「データ」シートには、データの入力および表示を行う「データ」テーブルが配置されています。

テーブルを使う理由については、こちの記事を御覧ください。

テーブルの作成方法については、こちらの記事を参考にしてください。

テーブルには、左から「番号」「区分」「事務所等」「役職」「肩書」「名前」「連名」「敬称」「郵便番号」「住所」「備考」および年ごとの送付・受領のフィールドを設定しています。

「番号」は、このデータベースの主キーになっています。「年賀状宛名」や「封筒宛名」を作成する場合に、この値で表引きを行っていますので、必ず入力してください。また、重複した番号を使用しないように注意してください。

「区分」は、宛先を分類するために必要に応じて使っていただくためのものです。

「事務所等」「住所」までのデータが「年賀状宛名」や「封筒宛名」に印刷されるフィールドとなります。

「役職」「肩書」を区分しているのは、例えば「年賀状宛名」の場合に「代表取締役社長」は名前の右、「弁護士」は名前の上に印刷できるようにするためです。場合によっては、両方を印刷する場合もあるかもしれないので、それぞれ別のフィールドを設けています。

「名前」は、氏と名を別のフィールドにしても良いのですが、間に全角スペースを入力するようにしています。

「連名」は、「名前」と同じ高さに印刷できるように、「年賀状宛名」または「封筒宛名」のデータを作成する際に、自動的に全角スペースを入力するようにしています。

「敬称」は、「先生」や「様」を自由に使い分けられるように設けています。

「郵便番号」は、「-」を使って入力しておき、「年賀状宛名」を印刷する場合は、数字だけを印字するようにしています。(旧バージョンは、数字だけを入力し、「封筒宛名」を作成する際に「-」を自動入力するようにしていましたが、「0で始まるデータ」の扱いで面倒なことを経験したのでやめました。)

「住所」は、「年賀状宛名」を作成する際に2行に分ける場合はセル内改行を入力するようにしています。「封筒宛名」を作成する際には改行が無視されます。
数字は半角数字で入力してください。「年賀状宛名」では自動的に漢数字に変換します。

「備考」欄は、必要に応じて使用してください。印刷には影響しません。

年ごとの送付および受領を記録できるようにしてあります。ダブルクリックすると「○」、「×」、「喪」(喪中の意)および「」(空白)がトグルするようになっています。「年賀状宛名」または「封筒宛名」を作成する際には、「○」が入力されているレコードだけが対象となります。

「データ」シート

「年賀状宛名」および「封筒宛名」シートの構成

「年賀状宛名」および「封筒宛名」のシートを開くと、それぞれのデータが自動的に作成されます。

「年賀状宛名」シート
「封筒宛名」シート

1枚分の印刷用データだけを作成し、印刷対象のレコードで順次にデータを作成して印刷するようにプログラムしてもよいのですが、レコード数が多くなると処理にかなりの時間がかかってしまいます。このため、印刷対象のレコードすべての印刷データを一挙に作成し、一挙に印刷できるようにしています。

特に郵便番号の部分については、印刷がずれないように書式を設定しなければなりませんが、1ページ目の書式を修正すれば、2ページ目以降いも自動的にコピーされるようにしています。

それぞれのセルには、「データ」シートのレコードを読み込むための関数が入力されています。
レコードのテキストを書き込むようにマクロを作っても良いのですが、あえてワークシート関数を使うようにしています。
これは、「年賀状宛名」や「封筒宛名」シートのデータを作った後に修正が必要になった場合に、ついつい「データ」シートではなくて、 「年賀状宛名」や「封筒宛名」シート のほうを修正してしまうというエラーを防止するためです。
また、できるだけワークシート関数を使うという、本サイトの方針にも合致しています。

ただし、すべてを関数でやろうとすると、数式が複雑になり、可読性が低くなってしまいますので、数字を漢数字に変換する部分にはユーザー関数を使用しています。(旧バージョンは、2行のデータを1行ごとに分割する処理などにもユーザー関数を使用しています。)

「データ」シートからの表引きには、XLOOKUP関数とTEXTSPLIT関数を用いています。(旧バージョンは、INDEX関数とMATCH関数を用いています。)これらの新しい関数の使い方については、次のサイトを参照してください。

TEXTSPLITの代わりにTEXTBEFOREとTEXTAFTERを使った方が簡単なのですが、Office365限定なので使用していません。

「データ」シートにテーブルを用いているので、構造化参照を使っています。細部は、こちらのサイトを参照してください。

「マニュアル」シートの構成

「マニュアル」シートには、このブックの使用法と変更履歴を記載しています。

「マニュアル」シート

マクロの構成

エクセルの初期設定では、「開発」タブが表示されていないので、マクロの編集ができません。設定ができていない方は、下のサイトを参考に設定を行ってください。

VBEへの入力位置

「開発」-「Visual Basic」をクリックして、VBEを起動してください。

ビジュアル・ベーシック・エディター

各シートを操作するコードは、シートモジュールに記載しています。標準モジュールには、ユーザー関数のコードだけを記載しています。

プロジェクトの起動

このプロジェクトのマクロは、すべてイベントプロシージャにより実行されます。

「Sheet1(データ)」モジュールの機能

「Worksheet_BeforeDoubleClick」プロシージャ は、年ごとの送付・受領フィールドのセルがダブルクリックされた場合に、 「○」、「×」、「喪」(喪中の意)および「」(空白)のトグル入力を行います。
「データ」シートには、「データ」テーブルを配置してありますので、それを利用して列番号を把握しています。

「Sheet2(年賀状宛名)」および「Sheet3(封筒宛名)」モジュールの機能

「Workseet_Activate」プロシージャ は、宛名データの作成を行います。

最初にSheet1(データ)をアクティブにして、現在選択されているセルの行列番号を取得し、その後Sheet2またはSheet3をアクティブに戻しています。

その後、まず2枚目以降のデータを削除して、1枚目のデータをコピーしながら「番号」のデータだけを書き換えてゆきます。

「Module1」モジュール(標準モジュール)の機能

「Kanji」というFunctionプロシージャにより、ユーザー関数を定義し、半角の数字を漢数字に変換しています。

(旧バージョンでは、これに加えて「Address1」、「Address2」、「Office1」、「Office2」、「Name1」および「Name2」というユーザー関数を定義し、住所、事務所名、名前の配置などを調整しています。

ユーザー定義関数の名前は、最初の文字だけを大文字にして、ワークシート関数と区別しやすいようにしています。

VBAのコード記述手法

変数の命名には、ハンガリアン法を用いています。

これ以外のVBAのコードに関する細部の説明は、サンプルファイルのコードに記載しています。

コメント

  1. 管理人 より:

    TEXTSPLIT関数に関する記述を追加しました。

  2. 管理人 より:

    XLOOKUPおよびTEXTSPLIT関数を使用したサンプルファイルを追加しました。

  3. 管理人 より:

    TEXTBEFOREとTEXTAFTER関数に関する記述を追加しました。

  4. 管理人 より:

    旧バージョンのサンプルファイルに、住所データ入力の誤りがありましたので、修正しました。

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