どこの会社でもそうだと思うが社内便というのがあって、古封筒を使いまわして社内での連絡便にあてている。大抵送付票を封筒表に貼り付けて、送付元と送付先を書くための欄が二列設けてあるのが一般的だ(と思う)。
社内便も一通二通なら手書きで充分だけれど、宛先が一度に二十三十となるとちょっと手書きでは骨が折れる。だから送付票に宛先宛名を自動で入れて、必要分印刷してくれるツールを作ろうと思った。
最近はどこでも大抵WordとExcelくらいは普通にインストールされていて、宛名リストなんてのはプリントアウトではなくてExcelで管理されていたりすることが普通になっている。今回提供された宛先一覧も例にもれずExcelでデータ化されていて(打ったのは自分だが)、こいつを使って送付票を作るならExcelが一番面倒なさそうだ、ということで使用ソフトはExcelに決まった。
今回の作業には、名簿と送付票のシートが二枚があれば充分。印刷に用いられるのは後者なので、こちらにあらかじめ書式を設定しておいてデータだけを移せばいい。今回自分が作ったのは以下のような感じの実にシンプルなものだ。
No. | 送付元 | 送付先 |
---|---|---|
1 | 自分の所属 | (ここに送付先宛名及び氏名を入れる) |
2 | ||
3 | ||
... | [中略] | (以下10まで続く) |
10 |
適当に「No.」の列幅を決めたら、「送付元」と「送付先」列も体裁よくおさまるように幅を決めて、行高さも決めてやる。適当でいいです、適当で。隙間が空いたら絵を入れてもいいし、とにかく体裁は自由に決めてやって問題ない。
今回は送付先に宛先宛名を二行にしていれるつもりなので、送付先No. 1に書式設定を施す。具体的には「折り返して全体を表示する」をするくらいで、フォントサイズやなにかはそれこそ見栄えよく自由に適当に決めてしまう。
名簿を格納するシートはもっと単純に。A1に見出し「あて名」を、B1に「氏名」と打って終了。A列のA2以下に宛名が、B列のB2以下に宛名をずらりと記入することになる。
宛名宛先は直接入力してもいいのだが、今回は既にデータ化された名簿があるので、そいつをA:B列に重ならないところに貼り付けて、参照を使ってデータをセルに入れてやることにする。部名課名が別セルに入っていたので、=D2
& E2
と入力して以下はオートフィル。宛名も=F2
をオートフィルしてやってかまわない。
今回のマクロの概略は以下のとおり。
これだけならば実に簡単なスクリプトでできたりするのだ。なので以下に大公開。
Sub 送付票自動印刷()
Dim RowEnd As Integer
Dim RowChk As Integer
Dim Katagaki As String
Dim Namae As String
Dim WSad As Worksheet
Dim WSpr As Worksheet
'作業ワークシートの設定
Set WSad = ThisWorkbook.Sheets("名簿")
Set WSpr = ThisWorkbook.Sheets("様式")
'範囲の検出
WSad.Select
RowEnd = 1
RowEnd = Cells(RowEnd, 2).End(xlDown).Row
If RowEnd > 60000 Then GoTo ProsEnd
'値の取得と印刷の実行
WSpr.Select
RowChk = 2
While RowChk < (RowEnd + 1)
Katagaki = WSad.Cells(RowChk, 1).Value
Namae = WSad.Cells(RowChk, 2).Value
WSpr.Cells(2, 3).Value = Katagaki & vbNewLine & " " & Namae & "様"
WSpt.PrintOut
RowChk = RowChk + 1
Wend
'終了の手順
ProsEnd:
WSpr.Cells(2, 3).Value = "あて先" & vbNewLine & " 氏名" & "様"
WSad.Select
WSad.Cells(1, 1).Select
WSpr.Select
WSpr.Cells(1, 1).Select
End Sub
シート「様式」の宛先宛名が入力されるセルをC2(Cells(2, 3)
)としている。
ワークシート(オブジェクト)変数に「名簿」と「様式」のシートをそれぞれ読み込んで、後々記述の面倒がないようにしている。
ここでおこなわれているのは、宛名列の最終行を調べる作業。「名簿」B1から最終データ列まで移動する(ちょうどControl + カーソルキーでやるように)ことでデータの最終列を見つけようというのだが、もしデータが一行もなかったらExcelシートの最末端(63536行目)まですっとんでいってしまって、後のループ部分が半暴走状態になってしまう。だからそれを避けるために、最終行が60000を超えたときは作業をやめて「終了の手順」にいきなさいという指示がされている。
「名簿」の二行目始まって最終行に達するまで、宛先宛名を取得しながら「様式」送付先セルに値を代入し、その都度印刷を繰り返している。
ここで使われているKatagakiというのが宛名用の変数で、Namaeが宛名用の変数。宛名がKatagakiというのに別に意味はない。KatagakiとNamaeを&で連結するのだが、間に改行文字を示す定数vbNewLineを挟んで改行させ、最後には敬称「様」をくっつけた。Namaeの前にあるスペースみっつは簡易インデント。シート「様式」に入ってきたデータは使い捨てなので、再利用性だとかは微塵も考慮しない。普通ならインデントにスペースなんかは使いやしないよ。
ちなみに私は、完成したと思って敬称をつけるのを忘れたまま印刷を開始して、使えない送付票を大量生産してしまった。くれぐれもお気をつけあそばしますよう。
ProsEnd:
というのは、データ行がなかった場合に「値の取得と印刷の実行」をすっ飛ばして移動してくる、着地地点となるラベル名。
実はここの手順はなんの意味もなくて、宛先宛名セルにどうでもいい「あて先(改行) 氏名様」を入れて、両シートのセルA1にカーソルを移動させておくというだけのもの。シートが開いた際に、理由もなく訳の分からんところにカーソルがあってるのが嫌いなんだ。ただそれだけの理由。必要ないと思ったら削ってくれてもなんらかまわない(ラベル名を削ると、データ行がなかった場合にエラーが出るので、そのへんは注意が必要だけどね)。