こんにちはmasalifeです。
今回はwebフォームでよく見かける
「郵便番号を入力したら、住所が自動で入力される機能」
をAccessで作る方法を紹介します。
作るイメージは次のとおりです。
郵便番号という値から、その郵便番号に対応する住所の値をマスタ(テーブル)のフィールドから取得するにはDLookup関数を使用します。
こんにちはmasalifeです。 Accessの力を最大限に発揮させるためには、関数の知識が必要不可欠です。 僕が多くのシステム構築をしてきた経験から、 この関数は覚えといた方がいい というものを順[…]
自動で該当のデータが入力される機能は
データ入力の効率化
データの完全性
の観点からもとても重要なので、ぜひ感覚を掴んで、入力フォームに機能を取り入れてもらいたいなと思います。
*方法(VBAコード)のみを知りたい方は【目次2.2: 住所を自動で入力するVBAコードを設定する 】のみを読んでください。
・DLookup関数
・DCount関数
・If文
・値の代入(VBA)
準備するもの
郵便番号と住所が格納されているマスタテーブル(T_住所マスタ)
郵便番号と住所が入力されているテーブルを作成します。
入力した郵便番号に該当する住所を取得するためのテーブルとなります。
住所を検索するフォーム(F_住所検索)
郵便番号を入力するテキストボックス(txt郵便番号)と該当の住所を表示するテキストボックス(txt住所)を配置した簡単なフォームを作成します。
郵便番号入力後、自動で住所を入力する機能を実装する
郵便番号を入力するテキストボックスのVBE画面を起動する
郵便番号入力後、データが確定したら自動で住所を入力するので、郵便番号を入力するテキストボックス(txt郵便番号)の更新後処理イベントにVBAを設定します。
(コマンドボタンを作成し、クリック時イベントにVBAを設定しても同様の結果が得られます。)
テキストボックスのプロパティシートを出して、
【イベント】タブの更新後処理の【…】アイコンをクリックします。
【コードビルダー】を選択し、【OK】ボタンをクリックします。
VBE画面が起動します。
・イベントは、オブジェクト(今回の場合はテキストボックス)に対してユーザーが行う操作などで発生します。
・更新後処理イベントはデータが入力され、データが確定した後に発生するイベントです。
・値がテキストボックスに入力された後にイベントプロシージャ(VBAコード)を実行するようにします。
住所を自動で入力するVBAコードを設定する
起動したVBE画面に次のコードを設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Private Sub txt郵便番号_AfterUpdate() Dim jyusyo As String 'マスタから取得した住所を格納 Dim i As Integer '取得件数を格納 i = DCount("*", "T_住所マスタ", "郵便番号=[Forms]![F_住所検索]![txt郵便番号]") If i > 0 Then jyusyo = DLookup("住所", "T_住所マスタ", "郵便番号=[Forms]![F_住所検索]![txt郵便番号]") txt住所 = jyusyo Else MsgBox "該当データがありません!!" End If End Sub |
*取得するデータがない場合のエラーに対応
VBAコードを読み解く
変数の中身
3 4 |
Dim jyusyo As String 'マスタから取得した住所を格納 Dim i As Integer '取得件数を格納 |
文字列を入れられる型(String型)の変数「jyusyo」には取得した住所フィールドの値が格納されます。
桁数の少ない数値を入れられる型(Integer型)の変数「i」にはDLookup関数で取得したレコードの件数が格納されます。
条件に合致したレコード件数を取得
6 |
i = DCount("*", "T_住所マスタ", "郵便番号=[Forms]![F_住所検索]![txt郵便番号]") |
郵便番号に合致したレコード件数をT_住所マスタから取得し、変数iに代入します。
例えば、郵便番号に5152305と入力した場合は、
レコード件数が1となり、変数iに1を代入します。
一方、郵便番号にT_住所マスタにない郵便番号を入力した場合はレコード件数が0となり、変数iに0を代入します。
変数iの値で条件分岐
8 9 10 11 12 13 14 15 16 17 18 |
If i > 0 Then jyusyo = DLookup("住所", "T_住所マスタ", "郵便番号=[Forms]![F_住所検索]![txt郵便番号]") txt住所 = jyusyo Else MsgBox "該当データがありません!!" End If |
【目次3.2: 条件に合致したレコード件数を取得】で変数iには入力した郵便番号に合致したレコード件数が入っていることを確認しました。
その変数iの値を使って、入力した郵便番号に合致したレコードがある場合とない場合の処理をIf文を使って分岐しています。
8 9 10 11 12 |
If i > 0 Then jyusyo = DLookup("住所", "T_住所マスタ", "郵便番号=[Forms]![F_住所検索]![txt郵便番号]") txt住所 = jyusyo |
i >0(入力した郵便番号に合致したレコードがある)の場合は郵便番号に対応する住所を変数jyusyoに代入する。
住所が表示されるtxt住所に変数jyusyoの値(嬉野一志町)を代入する。
これが郵便番号を入力して、該当する住所があった場合に自動で表示する仕組みとなります。
14 15 16 |
Else MsgBox "該当データがありません!!" |
i >0以外( 入力した郵便番号に合致したレコードがない)の場合は「該当データがありません!!」のメッセージボックスを出しています。
なぜ、このような条件分岐をするのかというと、エラー対応のためです。
もし、条件分岐をせず、
1 2 3 4 5 6 7 8 |
Private Sub txt郵便番号_AfterUpdate() Dim jyusyo as String jyusyo = DLookup("住所", "T_住所マスタ", "郵便番号=[Forms]![F_住所検索]![txt郵便番号]") txt住所 = jyusyo End Sub |
とした場合、入力した郵便番号に合致したレコードがないと、
Nullの使い方が不正です
というAccessのエラーメッセージが出ます。
このエラーメッセージが出たときに、
郵便番号の入力を誤ったのかな
と思える想像力お化けの人はまれだと思うので、はっきりと分かるメッセージを出してあげましょう。
さいごに
汎用性の高いコードなので、様々な入力フォームで活用できると思います。
少しでも効率化につながり、Accessって便利かもって感じていただけたら幸いです。
最後まで読んでいただきありがとうございました。