サンプル

年賀状宛名印刷(エクセルVBA)

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

そうですね。私は、ワードの「はがき宛名面印刷ウィザード」を使って宛名を印刷しています。

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

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

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

ダウンロード

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

マクロを使用するためには、エクセルの設定を変更しなければならない場合があります。設定方法が分からない方は、こちらのサイトに詳しい説明があります。

使用方法

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

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

このサンプルは、システムを新たに作ったり、改善したりする場合の参考にしていただくためのものです。
使用にあたっては、それぞれの法律事務所に応じた修正を行った上でお使いください。

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

ブックの構成

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

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

「データ」シートの構成

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

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

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

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

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

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

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

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

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

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

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

「郵便番号」は、数字だけを入力し、「封筒宛名」を作成する際に「-」を自動入力するようにしています。

「住所」は、「年賀状宛名」を作成する際に2行に分ける場合はセル内改行を入力するようにしています。「封筒宛名」を作成する際には改行が無視されます。

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

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

「データ」シート

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

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

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

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

特に年賀状印刷においては、郵便番号の印刷がずれないように細部書式の修正が必要となりますが、1ページ目のデータについて修正すれば、2ページ目以降の書式も自動的に修正されるようにしています。

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

ただし、すべてを関数でやろうとすると、非常に複雑な入力が必要になり、可読性が低くなってしまいます。このため、ユーザー関数を設定して、それを読み込むようにしています。ちょっと、どっちつかずの対応になってしまっている感はありますが...

「データ」シートからの表引きには、VLOOKUP関数を用いるのが一般的ですが、このサンプルではINDEX関数とMATCH関数を用いています。また、「データ」シートにテーブルを用いているので、構造化参照を使っています。細部は、こちらのサイトを参照してください。

ちなみに、最近のエクセルではXLOOKUP関数という大変便利な関数も使えます。

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

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

「マニュアル」シート

マクロの構成

VBEへの入力位置

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

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

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

プロジェクトの起動

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

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

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

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

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

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

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

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

「Kanji」「Address1」「Address2」「Office1」「Office2」「Name1」および「Name2」というFunctionプロシージャにより、ユーザー関数を定義しています。

「Kanji」 プロシージャは、半角の数字を漢数字に変換します。

「Address1」「Address2」「Office1」「Office2」「Name1」および「Name2」 は、住所、事務所名、名前の配置などを調整しています。

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

VBAのコード記述手法

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

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

コメント

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