Accessで年賀状の宛名印刷をする

#はじめに
Accessで学んだことを実践するため、「年賀状の宛名印刷」をしました。

#やったこと
##1.Excelで住所録を作成　
　・連名については、デフォルトを2名連名の配置とする。
　・1名宛なら連名用の場所は空欄とする。
　・3人以上の連名については、「〇〇様、御一同様」という書き方にする。
　・備考欄を作る。

##2.Excel住所録をAccessにインポート　

##3.テーブルを2つ作成　(宛先テーブル、差出人テーブル)　
　・（宛先テーブル）（デザインビュー）「送付記録フィールド、受領記録フィールド」について「〇 or × or 喪中」から選択できるようにデータ型でルックアップウィザードを設定する。
　・（宛先テーブル）（デザインビュー）宛先住所を郵便番号をもとに自動入力するように設定する。（参考：『できるAccess2019』p68~70）
　・（宛先テーブル）（データシートビュー）フィールドの先頭行に 印刷するor しない を選ぶフィールドを追加する。「フィールド名＝印刷」→さらに（デザインビュー）で「印刷 or ×」から選択できるようにデータ型でルックアップウィザードを設定する。
　・（差出人テーブル）（デザインビュー）「差出人形式フィールド」について「夫婦連名 or 妻個人名 or ブランク」から選択できるようにデータ型でルックアップウィザードを設定する。

##4.リレーションシップを使って宛名テーブルと差出人テーブルを関連付ける　
（参考：『できるAccess2019』p210~214）
　・差出人は「夫婦連名」と「妻個人名」「ブランク」の3種類があるので、宛名に対して差出人を割り振る。

##5.印刷に必要な情報のみを取得するクエリを作成する
（参考：『できるAccess2019』p280~）

　・2つのテーブルから印刷に必要なフィールドを選び、一覧表示させる。
必要なフィールド…
「宛先テーブル」＝印刷、宛先ID、姓、名、連名、郵便番号、住所_1、住所_2。
「差出人テーブル」＝郵便番号、住所_1、住所_2、氏名
　・「印刷フィールド」が「印刷」になっているものだけを抽出するため、デザインビューの「印刷フィールド」で抽出条件を「"印刷"」と設定する。（参考：『できるAccess2019』p287　、 [基本的な抽出条件の書き方について/ヘルプの森](https://www.helpforest.com/access/ob_query/ac050014.htm)）

##6.レポートで配置を年賀はがきに合わせる
　（参考：『できるAccess2019』p326~）
　・[作成]→[はがきウィザード]で年賀はがきを選択し、出てくる指示に従いクエリから必要な情報を選び住所&氏名を配置していく。
　 ※[手間取った点]参照。

　・4.で指定したリレーションが正常に稼働しているかレポート上で確認。


#手間取った点
##「パラメータの入力」というダイアログボックスが表示される
###〇内容〇
[6.レポートで配置を年賀はがきに合わせる]　でレポートを作成&保存後、同レポートを開こうとすると、「パラメータの入力…Q_印刷用宛先」というダイアログボックスが表示される。レポートの配置を印刷プレビューで確かめたいが、OKを押しても次々に「差出人_姓」「差出人_名」「差出人連名」「差出人_T_差出人」「差出人_氏名」「差出人_T_宛先」というダイアログボックスが表示され次に進めない。

![パラDL (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/79fba8a0-b217-1987-5c02-18d06c254c06.png)


最後には「Microsoft Visual Basic  実行時エラー'-2147352567 (80020009)':ドット(.)、！演算子、かっこ()の使い方が正しくありません。」というエラー文が表示された。
![eMSV.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/540db86c-a2bd-e6c0-5b0e-19257cdbf9a3.png)

###〇やったこと（この方法では解決しなかった）〇
####【その1】
ダイアログボックスにある「？」マークをクリックしてみた。内容は次のリンク先の通り。
[Access によりパラメーター値の入力が求められるのはなぜですか?](https://support.microsoft.com/ja-jp/office/access-%e3%81%ab%e3%82%88%e3%82%8a%e3%83%91%e3%83%a9%e3%83%a1%e3%83%bc%e3%82%bf%e3%83%bc%e5%80%a4%e3%81%ae%e5%85%a5%e5%8a%9b%e3%81%8c%e6%b1%82%e3%82%81%e3%82%89%e3%82%8c%e3%82%8b%e3%81%ae%e3%81%af%e3%81%aa%e3%81%9c%e3%81%a7%e3%81%99%e3%81%8b-0e71a1dd-e498-49a1-9e2e-356538d226ff?ns=msaccess&version=19&syslcid=1041&uilcid=1041&appver=zac190&helpid=73718&ui=ja-jp&rs=ja-jp&ad=jp)
この説明を読むと、どうもはがきウィザードで選択したクエリの中の式がおかしいということらしい。ここで、もう一度はがきウィザードを表示させたいと思ったのだが、方法がわからなかった。なのでレポートをデザインビューで開いて内容を確認してみた。

![Rエラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/12dbf711-fa89-51b2-ea0a-478d98d7d816.png)

「非連結」の表示が気になる。どういうこと？？
→こちらの記事 [はがきウィザードの利用/もう一度学ぶMS-Access](https://www.accessdbstudy.net/entry/20140510/p100000)でも同じように「非連結」で表示されていた。VBAで制御されているからこういう表示になるとのこと。印刷の際にはきちんと住所が表示されるようなので、このままスルー。

「様」についてははがきウィザードの敬称欄に直接「様」を入力したら、[=IIf(IsNull([Report]![_Position])=-1,IIf(IsNull([Report]![_Name])=-1,"御中","様"),[Report]![_Position])]←こんなVBAが自動入力されていた。エラー文にある「ドット(.)、！演算子、かっこ()」が存在しているのはこの「様」のVBAのみ。


####【その2】
その1で直接入力した「様」が怪しいと思ったので、直接入力せず、“宛先テーブルの「名」「連名」フィールドの横にそれぞれ「名敬称」「連名敬称」フィールドを追加して、クエリにも同じように追加し、その敬称をはがきウィザードで選択する”、という方法を取ってみる。
現在のレポートを削除し、新しくはがきウィザードでレポート作成してみた。その際、はがきウィザードで指定できるフィールド数をオーバーしてしまったので現段階では「姓」については指定せず、後からレポートのデザインビューで「姓」フィールドを自分で追加する。

![はがきw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/ee00c18a-50b8-0522-5a00-47dba27c0fdd.png)

![はがきw出.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/62387b89-6542-a7e2-0c34-d48b9df2cb53.png)

![はがきw数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/de38c20a-c1c9-efb2-473f-15b3a50915dc.png)

→結果、前回と同じエラーが出てしまった。
エラーメッセージ文のダイアログボックスに[デバック]というボタンがあったのでクリックすると、下記の画面が表示された。
**デバック**というのは、**プログラムの欠陥を発見&修正し、きちんとプログラムが動くようにする作業**のことらしい。

![デバック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/f63b8c13-f7b8-3e4f-b4e1-de16acad9b7a.png)

VBAらしきものが映し出されている。
黄色くマーカーされている部分は下記の通り。

```
DevideAddress Nz(Me![_Address]), stCty(1), stCty(2), stCty(3), stCty(4), stCty(5)
```

宛先住所か差出人住所のことだと思う。
エラー文には「ドット(.)、！演算子、かっこ()の使い方が正しくありません」とあるから、このVBAの「！」「()」の使い方が間違っているということ？しかしこのVBAはAccessが自動生成したVBAだし、他の箇所の「！」「()」の使われ方と見比べても、私には問題点がわからなかった。「DevideAddress Nz(Me![_Address])」等でググるも、VBAを勉強していない現段階では「よくわからない...」というのが正直なところ。

####【その3】
はがきウィザードで連結するフィールドを選択する段階で、どんな選択をするとエラー（「Microsoft Visual Basic  実行時エラー'-2147352567 (80020009)':ドット(.)、！演算子、かっこ()の使い方が正しくありません。」のエラー）が出ずに印刷プレビューまで進めるかひとつひとつ確認してみる。

1.（＝その2までで行ってきた選択方法）
　宛先欄＝印刷用クエリから[郵便番号、住所1、住所2、名、名敬称、連名、連名敬称]を選択
　差出人欄＝印刷用クエリから[郵便番号、住所1、住所2、氏名]を選択
　→エラー。　

2.宛先欄＝宛先テーブルから[郵便番号、住所1、住所2、名、名敬称、連名、連名敬称]を選択
　差出人欄＝ブランク　
　→エラー出ず。が、
　①宛先欄の住所について、全て[宛先ID 3]の住所になってしまう。郵便番号&名&名敬称&連名&連名敬称 は正しく表示される。　→一度レポートを閉じて再表示したら、それぞれ正しい住所が表示されるように直った。
　②クエリから選択していないので、印刷しないレコードについても表示されてしまう。[宛先ID 1～47]全てのレコードが表示される。

**3.（この方法を採用！）**
　宛先欄＝宛先テーブルから[郵便番号、住所1、住所2、名、名敬称、連名、連名敬称]を選択
　差出人欄＝差出人テーブルから[郵便番号、住所1、住所2、氏名]を選択
　→エラー出ず。が、
　①宛先欄について、宛先ID 3以降の住所が全て[宛先ID 3]の住所になってしまう。（宛先ID 1、2は正しい住所が表示される。）郵便番号&名&名敬称&連名&連名敬称 は正しく表示される。　→一度レポートを閉じて再表示したら、それぞれ正しい住所が表示されるように直った。
　②クエリから選択していないにも関わらず、差出人欄はちゃんとリレーションを組んだとおりの組み合わせでちゃんと表示される。　
　③クエリから選択していないので、印刷しないレコードについても表示されてしまう。ただ気になるのがレコードの選択のされ方。全47レコードの内、クエリで「印刷する」を選択しているのは[宛先ID 1～26]。しかし、今回選択されているのは[宛先ID 1～28]。どういった基準で選択されたのかが不明。[差出人形式フィールド]について、[宛先ID 1～14]は[夫婦連名]、[宛先ID 15～26]は[妻個人名]、[宛先ID 27～28]は[ブランク]、[宛先ID 29～47]は何も選択していない空白レコードになっている。何かしらの値が入っているレコードが選択されたということだろうか？

####【その4】
はがきウィザードを使わずにレポート作成してみる。
→年賀はがきの配置を1から作ることに苦戦。断念。

###〇解決方法〇
クエリを使うとどうしてもエラーが出てしまうため、今回はテーブルのレコードを直接使う上記 **“【その3】-3.”**の方法を使って印刷することにした。

レイアウトと数字書式に訂正が必要なので、訂正していく。

1.住所内の数字表記について。宛先住所ははがきウィザードで「宛先住所データに漢数字を使う」にチェックしていたので漢数字表記になっている。が、差出人住所についてはテーブルで入力した通りのアラビア数字表記になっている。→なので、差出人テーブルの住所を直接漢数字に訂正する。→解決。

2.宛先の姓が抜けているのでレポートのデザインビューで追加する。→できない。
　デザインビューで他の項目（=[T_宛先_名]）をコピー＆ペーストしてその中の表記を“=[T_宛先_姓]”に変更することで姓の欄をレポート内に追加しようと試みたが、これをすると、以前のように「パラメータの入力」のエラーが出てしまう。
→なので、宛先テーブルの内容を変更することにした。現段階では「姓」と「名」に分けていた宛名を、「姓　名」同じセルに入力することで、はがきウィザードで指定できる枠に入れることにした。→解決。

3.差出人住所について。住所1に番地まで、住所2に建物名と部屋番号を入力してあるのだが、レポートでは1行目に建物名まで、2行目に部屋番号が表示されている。1行目を番地まで(＝住所1)、2行目に建物名と部屋番号(=住所2)が表示されるようにしたい。→下記スクショのように差出人会社名欄に住所2を指定しデザインビューで配置を自分でいじることを試みる。→できない。
差出人氏名の枠に入ってしまい、単独でいじることができなくなった。

![R差出人w.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/6efd21f5-68c6-1c05-9b53-7a7d668375c8.png)

![Rデザ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/fe702901-9be6-5bf5-44a2-2567984e5494.png)

→デザインビューで差出人住所_1の枠をコピー&ペーストしてから、コピペした枠の「住所_1」表記を「住所_2」に変更する。→できない。
上書き保存後に印刷プレビューを開こうとすると、例のエラー文が出てしまう。デザインビューに戻ると下記のように “=[T_差出人_住所_2]”　という形で“[]”が勝手に追加されてしまっている。デザインビューでは他の枠も　“=T_差出人_住所_1”　のように　“＝文字”　の形で表示されているが、その裏にはどうもVBAが組まれているようだ。だから単にコピペしただけでは、VBAまではコピーされずにテーブルの情報を引っ張ってこられないのだと予想する。

![Rデザ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/29b7917e-aa58-d2dd-ed7b-0b6ffeca691d.png)

→3.については解決できない。現時点では諦めて、当初の通り「1行目に建物名まで、2行目に部屋番号」という表記でいく。

4.レイアウトビューで「各枠の配置」を自分のしたいように変更する。
→配置場所の変更はできたが、枠内の書式を変えられない。また、連名の敬称について「連名がブランクだった場合は"御中"と表示する」というプログラムが組まれてしまっている。

配置については、
はがきウィザードを使わずにレポート作成すれば、[このページ](https://dekiru.net/article/15367/)で説明されているように、[フォームデザインツール→配置→サイズ/間隔→上下の間隔を均等にする]と進んで均等割り付けができる。しかし、はがきウィザードを使った今回は、この間隔についてのボタンが選べないようになっていて(下スクショ)、均等割り付けの指定ができない。

![間隔.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/c7639f60-6cff-c929-470e-59f762786dc2.png)

→[宛先テーブル/デザインビュー/フィールドプロパティ/書式]で設定しようと試みるも、できず。
→宛先テーブルで[氏名、名敬称、連名、連名敬称]と分けていたものを、[氏名 様、連名 様]というふうに「様」とセットにする。そのうえで下記スクショのようにはがきウィザードで指定する。

![はがきw2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/44531e65-22ef-3002-5b24-3006f5ef4dbd.png)

→このままだと印刷画面では連名のあとに「様 or 御中」が表示されるVBAが組まれている状態なので、レポートビューで該当箇所の枠を[Delete]で削除する。
→必要な項目のみが表示されるようになった！！
→レポートビューで氏名、連名の位置とフォントの大きさを手動で調整する。→OK。
　※ただこの方法だと、今回は名字2文字、名前2文字の氏名の場合の配置に合わせたので、連名のレコードについては配置が一人目と二人目の「様」の高さが合わず見た目が良くない例が何件かあった。本当は文字数が違っても、「様」の高さをそろえたい。


#振り返り
##【実際に使ってみて気づいたこと】
・フォームは今回の内容だと不要だと思った。4.（リレーションシップを使って宛名テーブルと差出人テーブルを関連付ける）でリレーションシップを設定した後に一度フォームを作ってみた。が、結局テーブルと同じ形にしたほうがわかりやすいと感じ、テーブルで直接編集することにした。この判断でOKなのかは、現段階の自分では判断できない。が、自分が作りやすいように今回はフォーム無しにした。（フォーム参考：『できるAccess2019』p234~274）

##【未解決事項】
・クエリをレポートに反映させたい。（今回は反映させることができなかったので、印刷する/しない　の指定ができなかった。印刷時に手動で「何枚目から何枚目を印刷する」と指定することで対応した。）

・[宛先テーブル]の[データシートビュー]、[送付記録フィールド、受領記録フィールド]について「〇 or × or 喪中」から選択できるようにデータ型でルックアップウィザードを設定する際、「送付2020元旦」「受領2020元旦」「送付2021元旦」「受領2021元旦」フィールド4つに同じ設定(〇 or × or 喪中)をした。これを一括で設定する方法はあるのか？

・Excelだと複数セルに同じ値を入力するときにセルを右クリックしてドラッグすると一括コピペができるが、Accessはできないようだった。（ググると、Excelでコピペ作業をしてからそれをAccessに読み込むという方法が紹介されていた。）結局今回はひとつひとつのフィールドをクリックして貼り付ける作業をした。が、きっと方法があると思う。

・今回は年賀はがきの配置に合わせて印刷する為に「はがきウィザード」を使ってレポート作成した。が、このウィザードを使ったがために、配置について細かな設定をすることが難しくなった。ウィザードを使わずに自分で一からレポート作成したほうがシンプルに自分の好きなように配置していくことができるはず。だが、そうすると今度は年賀はがきの郵便番号の枠に合うように配置を決めることが難しい。はがきウィザードのVBA以外の「配置」のみをコピーする方法があれば、知りたい。

・設定済みのはがきウィザードを再表示する方法が知りたい。はがきウィザードで設定をしてウィザード画面を閉じて次の作業に入ると、再度設定したはがきウィザードの画面を開きたくても開けない。設定済みの内容を編集したいので、再表示したいのだが...。今回は再表示の方法がわからなかったので、都度新しいはがきウィザードを立ち上げて設定した。

##【VBA習得後チャレンジしたいこと】
・宛名の連名表記について。筆まめだと、1名宛て、2名宛て、3名宛て…と、名前のフォントサイズが自動で変わり、人数に合わせてバランス良く配置される。それを再現したいが、おそらくVBAが必要。VBA学習後、フォントサイズの自動切換えにチャレンジしたい。

#おわりに
「宛名印刷しよう」と決めたときに、作業期間について「1週間くらいでできるかな」と思っていました。が、実際に初めてみると色んなところでつまずき、結局（作業しなかった日も含めてですが）3週間強かかってしまいました。

作業を始めてから、何度も細かな問題が多発して収集がつかなくなり　(リレーションシップがきちんと作動しない、連名や宛名がうまく表示できない、数字(漢数字/アラビア数字)が思ったように表示されない、配置がイメージ通りにできない、...等）、結局、新しいファイルを立ち上げて１から作り直したり、テーブル&クエリ&レポートをいじくりまわしたりして、かなり時間を使ってしまいました。

つまずくたびに手が止まり、調べ、試行錯誤。子の昼寝中に作業し、子が目覚めたら作業中断。夜or早朝の作業再開時には、作業を中断したときの自分の思考に戻り「何につまずいたのか」を思い出してまた試行錯誤。子の夜泣きで作業中断。寝かしつけてまた作業再開。…の繰り返しでした。

振り返ると、この「思い出す」作業に時間がかかっていたように思います。Access全体を使いこなせていないからこそ、自分がつまずいている内容を把握しきられておらず、思い出すのに時間がかかったのだと思います。とにかくAccessを使いこなせるように練習する必要があると感じました。

#参考
・書籍『できるAccess2019』インプレス
・ブログ [はがきウィザードの利用/もう一度学ぶMS-Access](https://www.accessdbstudy.net/entry/20140510/p100000)

#進捗記録
|日付|項目|詳細|
|---|---|---|
|2020/9/15||データベースの学習スタート|
|2020/9/15～9/21|書籍|『マンガでわかるデータベース』オーム社 6章中1～4章|
|2020/9/22～10/9|書籍|『スッキリわかるSQL入門第2版ドリル222問付き！』インプレス 12章中1～9章|
|2020/10/19～11/2|書籍|『できるAccess2019』インプレス |
|2020/11/2～11/4|Udemy|『[【ここから始める】アクセス基礎コース アクセスの初心者でも安心このコースからAccessを始めよう！](https://www.udemy.com/course/access-v/)』|
|2020/11/4～11/6|Udemy|『[誰でもわかるMicrosoft Access 2019](https://www.udemy.com/course/access-2019/)』|
|2020/11/5～11/29|作業（ロードマップ外）|Accessで年賀状用住所録作り＆宛名印刷|
|2020/11/24～11/25|Udemy（ロードマップ外）|『[プログラム学習の一歩目！「壁を階段」にするように学習のコツを解説します。 Part1](https://www.udemy.com/course/study-hack-part1/)』|