プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。
Accessにて顧客管理システムを作成しています。掲題について、連結サブフォームでの入力項目の郵便番号には入力支援として住所の自動入力は設定しています。
ただ、その郵便番号入力後 住所を入力者が変えた時、郵便番号と異なる場合のチェックを保存処理のボタンを押したタイミングでDBに予め用意したフラグフィールドに付けたいです。
このチェック方法をVbaのコードで示して頂けると助かります。どうかよろしくお願いいたします。

※住所から郵便番号を自動入力で変えるということは考えてません。郵便番号と住所、どちらが正しい情報なのか区別するため、ただ一致しないという判別をつけるだけであとで入力者本人に確認する運用にします。

A 回答 (4件)

【訂正】[住所X_控え]は不要!



添付図通りに[住所1_控え]、[住所2_控え]を用意し、もって比較し[住所不一致]を更新するコードを書いてみました。そして、実際に試した場合、一旦、別のレコードに移動した場合に[住所1_控え]、[住所2_控え]を再現する必要があることに気付きました。そうしないと、新たな[住所1]、[住所2]との正しい比較が出来ないからです。

Private Sub Form_Current()
  If Me.NewRecord Then
    Me.住所1_控え = ""
    Me.住所2_控え = ""
  Else
    Me.住所1_控え = ZipConv(Me.郵便番号, zcKen)
    Me.住所2_控え = ZipConv(Me.郵便番号, zcCty1) & ZipConv(Me.郵便番号, zcCty2)
  End If
End Sub

そこで、某サイトのZipConv()を利用して[住所1_控え]、[住所2_控え]を再現。でも、そんなことをする位ならば・・・

Public Sub 住所不一致_Update()
  Dim isNotAgree As Boolean
  
  If Len(Me.郵便番号 & "") Then
    isNotAgree = CBool(Me.住所1 <> ZipConv(Me.郵便番号, zcKen))
    isNotAgree = isNotAgree + CBool(Me.住所2 <> ZipConv(Me.郵便番号, zcCty1) & ZipConv(Me.郵便番号, zcCty2))
    Me.住所不一致 = isNotAgree
  End If
End Sub

と、ZipConv()をもって比較すれば済む話。そういうことで、コメントアウトしている行は不要。つまり、[住所1_控え]、[住所2_控え]は不要。そういうことになるようです。

Option Compare Database
Option Explicit

Private Sub Form_Current()
  'If Me.NewRecord Then
  '  Me.住所1_控え = ""
  '  Me.住所2_控え = ""
  'Else
  '  Me.住所1_控え = ZipConv(Me.郵便番号, zcKen)
  '  Me.住所2_控え = ZipConv(Me.郵便番号, zcCty1) & ZipConv(Me.郵便番号, zcCty2)
  'End If
End Sub

Private Sub 住所1_AfterUpdate()
  住所不一致_Update
End Sub

Private Sub 住所2_AfterUpdate()
  住所不一致_Update
End Sub

Private Sub 郵便番号_AfterUpdate()
  Me.住所不一致 = False
End Sub

Public Sub 住所不一致_Update()
  'Me.住所不一致 = CBool((Me.住所1 <> Me.住所1_控え) + (Me.住所2 <> Me.住所2_控え))
  
  Dim isNotAgree As Boolean
  
  If Len(Me.郵便番号 & "") Then
    isNotAgree = CBool(Me.住所1 <> ZipConv(Me.郵便番号, zcKen))
    isNotAgree = isNotAgree + CBool(Me.住所2 <> ZipConv(Me.郵便番号, zcCty1) & ZipConv(Me.郵便番号, zcCty2))
    Me.住所不一致 = isNotAgree
  End If
End Sub

さてさて、問題は、[住所1]と[住所2]とを変更すべき事態の発生頻度です。事実上はゼロではないでしょうか?いずれにしろ、私の当初アイデアには致命的な問題点があったので撤回します。
「Access-郵便番号と住所の整合チェッ」の回答画像3
    • good
    • 0
この回答へのお礼

試したところ動きました。意図した処理も難なくできました。
本当にありがとうございます。
実際の処理説明を記載いただきました、回答3にベストアンサーを付けさせていただきます。

お礼日時:2014/10/13 01:52

なお、テーブルに列[住所不一致]列がなくても、クエリにて回答3と同じ方法で不一致レコードは抜き出せます。

それが、最適解かも知れませんね。

この回答への補足

試したところ動きました。意図した処理も難なくできました。
本当にありがとうございます。
実際の処理説明を記載いただきました、回答3にベストアンサーを付けさせていただきます。

補足日時:2014/10/13 01:50
    • good
    • 0
この回答へのお礼

案、ありがとうございます。親身に考えてくださっているのが伝わり感動しています。

最適解のクエリにしても、コーディングにしても以下のサイトにあるような
ZipConvをまず標準モジュールに設定することが前提ですね?
APIの呼び出しに明るくないので、ACCESS2010-2013での動作確認からになってしまいますが
試してみます。

http://www.f3.dion.ne.jp/~element/msaccess/AcTip …

お礼日時:2014/10/12 23:58

× 3、入力用の非表示のテキストボックスにも住所を代入する。


〇 3、入力用の表示中のテキストボックスにも住所を代入する。
    • good
    • 0

まず、アイデアの確認が必要です。



1、郵便番号を入力する。
2、非表示のテキストボックスに住所を代入する。
3、入力用の非表示のテキストボックスにも住所を代入する。
4、で、非表示と入力用との違いをチェックする。
5、ただし、住所1、住所2、住所3、ビル等とし変更は不要とする。

こういう風にするのか?

>保存処理のボタンを押したタイミングで・・・

非連結フォームの場合、保存処理のボタンは必要ないかと・・・。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!