ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3856227 Access 2000で顧客データ入力する際に氏名の重複入力チェックを行いたいのですが・・・。よろしくお願いします。
質問者:rirakuma7 Access 2000で顧客データ入力の業務をしております。フォームにて入力する際に、氏名の重複入力チェックを行いたいのですが・・・。VBAの式を使用する方法があるところまでは分かったのですが、肝心の式が分かりません。よろしくお願いします。
困り度:
  • すぐに回答を!
質問投稿日時:
08/03/12 15:30
この質問に対する回答は締め切られました。

回答良回答20pt

ANo.6 #2、#4です。

>重複クエリでテーブルを作成するのでしょうか?
>具体的な方法をご指導いただけると、大変助かります!

#2でも書いたように

1.チェック用テーブルを作成する
2.チェック用フィールドを1.のテーブルに作り、プライマリーインデックスか、重複を許さないインデックスを付ける
3.このテーブルに追加クエリーかADOなどでチェックしたいデータを追加する
4.重複していればエラーが発生するので、これをトラップする

具体的コードを提示できればよいのですが、VBAはとうの昔に忘れたので残念ながらできません。もし具体的コードが必要であれば、新しい質問として投稿した方が良いでしょう。
回答者:fuuten_no_neko
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
08/03/20 07:06
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.5 どのような作業をなさっておられるのか、
どのくらいの顧客レコードがあるのか、
どのくらいの規模で運用するのかにもよりますが、

実データ入力時に、カナ検索などを行えるようにしておき
該当レコードが見つからなかったときに、新規登録というフローも
ありえます。
回答者:noname#60992
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/03/15 10:33
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.4 #2です。
>通常の顧客テーブルに別で氏名チェック用のテーブルを作成するということでしょうか?
その通りです。
データが重複する欠点は有りますが、楽です。たとえば「氏」+「名」+「都道府県」の重複をチェックなども簡単にできます。

ところで他者の回答を批判するのは気が引けますが
>確認するまでもない重複ですので告知して削除するのみです。
全部のフィールドを入力させて、それから「告知して削除する」って随分意地悪ではないでしょうか?
名前の重複時点で全フィールドを表示し、入力オペレーターに警告する方が親切だと思います。
回答者:fuuten_no_neko
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
08/03/14 16:40
この回答へのお礼返信ありがとうございます!
ご回答に下記のようにありますが、

>データが重複する欠点は有りますが、楽です。たとえば「氏」+「名」+「都道府県」の重複をチェックなども簡単にできます。

重複クエリでテーブルを作成するのでしょうか?
具体的な方法をご指導いただけると、大変助かります!

回答

ANo.3 Custtomer:

ID__KName_______ZipCode_____Address1__Address2__Address3________Building___________TEL________________FAX
01__鈴木 一郎___101-1111__東京都____葛飾区_____一丁目一番地__新日本ビル1F__111-111-1111__111-111-1112
02__中村 主水___101-1111__東京都____葛飾区_____一丁目一番地__新日本ビル1F__222-111-1111__111-111-1112
03__鈴木 一郎___102-2222__大阪府____枚方市_____一丁目一番地__西日本ビル1F__333-111-1111__111-111-1112
04__鈴木 一郎___101-1111__東京都____葛飾区_____一丁目一番地__新日本ビル1F__111-111-1111__111-111-1112

この場合、3番目のレコード入力が完了した時点では重複の警告は出さないでしょう。
この場合、4番目のレコード入力が完了した時点のみ重複の警告を出すでしょう。
しかも、[ID]から[FAX]までの全ての列が重複していれば確認の警告は無用かと思います。
その場合は、確認するまでもない重複ですので告知して削除するのみです。
だが、[ID]から[Building]まで重複している場合、[TEL」、[FAX]列の確認の意味合いで確認が必要です。
現実のデータを考えると、このようであると思います。

Private Sub KName_AfterUpdate()
  Dim Answer  As Integer
  Dim strWhere As String
  
  Answer = vbYes
  strWhere = "KName ='" & Trim(Me.KName) & "' AND ID<>" & Nz(Me.ID)
  If DBLookup("ID", "Customer", strWhere, 0) <> 0 Then
    Answer = Verify("同姓同名の新規顧客として追加登録しますか?")
  End If
  If Answer = vbYes And Nz(Me.ID) = 0 Then
    Me.ID = DBMax("ID", "Customer") + 1
  End If
End Sub

このように列[Kname]入力後に DLookup()、Dcount() を用いて重複チェックするなんてのは通常はしないです。
ただ、この場合、カレントレコードをチェック対象から外しておかないととんでもないことになるので注意が必要です。
回答者:Husky2007
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/03/12 16:36
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.2 条件が曖昧ですが、一応
1.同姓同名はあり得る
2.「氏」「名」は別フィールド
3.氏名登録時に重複チェック、警告、後に詳細登録
だとします。アイディア的には

氏名チェックテーブルを作り、氏名フィールドにプライマリインデックスを設定

氏名登録時に登録ボタンを押すと、「氏」+「名」で氏名を作成し、氏名チェックテーブルの氏名フィールドに追加登録する。この際にエラーが出れば警告を発生。
こんな感じで如何でしょうか?
回答者:fuuten_no_neko
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
08/03/12 16:13
この回答へのお礼早速のご回答ありがとうございます!

1.同姓同名はあり得る→ありえます
2.「氏」「名」は別フィールド→同一フィールドです
3.氏名登録時に重複チェック、警告、後に詳細登録→はい

の条件で入力できればと思います。

『氏名チェックテーブルを作り、氏名フィールドにプライマリインデックスを設定』とは、通常の顧客テーブルに別で氏名チェック用のテーブルを作成するということでしょうか?
初心者の質問で大変恐縮ですが、よろしくお願いします。

回答良回答10pt

ANo.1 単にフィールドがテーブルにリンクしているなら、テーブル側で
「インデックス」を「はい」にしてしまう、という姑息な手段が
無いわけじゃないんですが。

それより、氏名入力の「氏」「名」は同一フィールドですか?
氏名の中間空白の有無を嫌って往々にして別フィールドにしますが
別フィールドになってると同一人のチェックは一筋縄じゃ行きませんよ。

おまけに入力中にVBAを処理させると、「チェックボタンを押す」という
一動作が余計にかかったり、リアルタイムで処理させると処理が遅くて
入力に追いつかなかったりするんですけど、それDめおいいんですか?

また「同姓同名」は本当にいないんですか? 入力時に弾いてしまうと
同姓同名データが来た時に入力できなくなりますよ?

そういった問題がありますので、通常は「後でチェックする」んですが。
「後でチェックする」場合は、テーブルをExcelに吐き出して、ソート
する方が簡単で良いです。ソートしておいて、「1つ上の氏名と同じ
ならば1、さもなければ0」というIF文で一気にチェックすれば一発です。
回答者:FEX2053
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:
08/03/12 15:43
この回答へのお礼早速のご回答ありがとうございます!
『氏』『名』は同一フィールドです。
FEX2053さんの文頭にありました、インデックスを『はい』にしてしまう方法は単純ですが、同姓同名の場合の登録が不可能なんですよね・・・。

宛名ラベルなどを作成する際に、エクセルにインポートして、重複チェックをしていますが、関数のIF文を使用した検索方法以外でチェックしていましたので、参考にさせていただきました。ありがとうございました!

VBAの式は難解で他の方の回答をもとに試行錯誤しています(*。*)
アクセス初級者が扱うにはなかなか大変ですね。他の方法もあるようなので、もう少し頑張ってみます!!