- ベストアンサー
Accessで重複データを入力できないようにしたい。
Access初心者です。 重複データを入力した際、任意のメッセージを表示して入力をできないようにしたいと考えています。 具体的には、 テーブル1に、「姓」「名」「勤務先」があり、 クエリ1をもとにフォーム1が「姓」「名」「勤務先」のテキストボックスを持っています。 フォーム上で「姓」と「名」を入力した際、「姓」&「名」が重複した場合(同姓同名の場合)に、他のコントロールへの移動やデータ保存ができないようにするにはどうしたらいいでしょうか。 できれば、マクロやVBAを使わずに済ませたいと思いますが、簡単な方法をご存知の方、教えていただければ幸いです。 よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
横レス失礼致します。 > テキストボックスの入力規則欄に「DCount("*","テーブル1"," [テーブル1]![姓]=[姓]")=0」と入力 「"」(ダブルクォーテーション)内に入れた「姓」はテーブル1のフィールドとして判断されてしまうため、 上記の式では意図した動作にはならないものと思います。 (姓がNullでないレコードが1件以上あった時点で、何を入力しても入力規則違反?) とりあえず、フォーム上の入力/編集で『姓』の重複を一切認めない、とする場合の入力規則欄の 式は以下のようになります: DCount("*","テーブル1","[ID]<>" & [ID] & " And [姓]='" & [姓] & "'")=0 『ID』は、レコードを一意に特定できるフィールド(→主キーなど)で、数値型を想定しています。 これを追加しておかないと、「既存データを間違えて上書きしかけたため、同じ姓を入力し直そうと した」ときに、DCount関数の戻り値が「1」となり、弾かれてしまうことになります。 (新規追加時や、一旦別の姓で上書保存してから元に戻した場合は、弾かれませんが) ※上記の式は、テキストボックス名とフィールド名が同一という前提です。 なお、データ型がテキスト型と推測される『姓』についての条件式では、右辺に相当する部分が 「'」(シングルクォーテーション)で括られる形になっていること、また「And」の前後に半角スペースが 入っていることに注意してください。 (『「"」「 」(スペース)、「And」、「 」、「[姓]」、「=」、「'」、「"」』と、『「"」、「'」、「"」』の塊の部分) さらに(注釈が多くて恐縮ですが)、IDは必ず『姓』『名』よりも先に入力しておく必要があります。 (DMax+1で既定値を設定するか、フォームの挿入前イベントで代入するのがよいかと思います) 姓と名が別フィールドで同姓同名を不可とする場合は、『姓』と『名』のテキストボックスの双方で、 入力規則の式を以下のように設定します: DCount("*","テーブル1","[ID]<>" & [ID] & " And [姓]='" & [姓] & "' And [名]='" & [名] & "'")=0 ・・・以上です。 「'」は全部で4つ(→「[姓]」と「[名]」をそれぞれ括る)あるなど複雑ですが、間違いなく入力して下さい。
その他の回答 (4)
#1です。 だとすればVBAを使わざるを得ません。 姓と名を入力するテキストボックスの 更新後イベント・プロシージャにコードを書かなくてはなりません。 従って、 > マクロやVBAを使わずに済ませたい は無理です。
お礼
vizzarさん、ご指摘ありがとうございました。 イベント・プロシージャに、DCountとMsgBoxを使ってコードを記述してみました。 何とかできそうです。
#1です。#2の表記に間違いがありました。 誤: ・ダイアログの板の方の「固有」に「はい」を設定。 正: ・ダイアログの下の方の「固有」に「はい」を設定。
補足
vizzarさん、何度も丁寧にご指導くださりありがとうございます。 インデックスによる方法は最初に試みました。 たしかに重複を避けることはできますが、 (1)重複を避けたいフィールドの入力だけでは足りず、全部のフィールドを入力しなければ、重複かどうかの判断をしてくれないこと(同姓同名の場合に、「名」以降の他のコントロールへの移動やデータ保存ができないようにしたいと考えています)、 (2)「インデックス、主キー、またはリレーションシップで値が重複しているので…」というAccess既定のメッセージボックスが表示されてしまうこと(任意のメッセージを表示させたいと考えています)、 の2点をクリアできません。 また、フォーム上から、テキストボックスの入力規則欄に「DCount("*","テーブル1"," [テーブル1]![姓]=[姓]")=0」と入力する方法を知りましたのでやってみましたが、あらゆる場合にエラーメッセージが出てしまいます。 こちらの方が、上記(1)(2)の点はクリアできるので、できればこの方法によりたいと考えていますが、うまくいかないので頭を抱えています。 どこが悪いのか、問題点についてご指摘いただければ幸いです。
#1です。 複数フィールドを纏めてインデックスをつける方法ですが、 1.そのテーブルを選択して、「デザイン」をクリック。 2.「鍵」アイコンの右にある「稲妻」マークの「インデクス」アイコンをクリック。 3.インデックス・ダイアログの ・インデックス名の1行目に適当な名前(「氏名」など)を入力。 ・フィールド名の1行目をクリックして、「▼」を押して、「姓」のフィルドを選択。 ・ダイアログの板の方の「固有」に「はい」を設定。 ・フィールド名の2行目をクリックして、「▼」を押して、「名」のフィルドを選択。 以下のようになればOK. ┌──────┬─────┬──────┐ │インデックス名│フィールド名│並べ替え順序│ ├──────┼─────┼──────┤ │氏名 │姓 │昇順 │ ├──────┼─────┼──────┤ │ │名 │昇順 │ ├──────┼─────┼──────┤ ・ ・ └──────┴─────┴──────┘ ・ダイアログの「×」を押してダイアログを閉じる。 ・フィールド・リストの「×」を押してフィールド・リストを閉じる。 変更医を存するかどうかを聞かれるので、「はい」をクリック。 これで、複数のフィールドで「重複なしインデックス」が設定されます。
デーブルのインデックスを、姓名での重複なしにすれば可能です。 しかし、このようにしてしまうと、本当に同姓同名の人を追加できなくなってしまいます。 少なくとも、おなじものが無いような項目の組み合わせで、「重複なし」のインデックスをつけるべきです。 「姓+名+電話番号」など。これとて電話番号が解らないとハナシになりませんが.... 重複を避けるのは、思っているほど簡単ではありません。 「VBAはイヤだ」といわれていますが、いろいろなことをしたいと思っていれば、 遅かれ速かれ手をつけなけならない状況になっていきますから、 今から少しづつでも勉強を始められることを強くお勧めします。
補足
vizzarさん、ありがとうございます。 同姓同名の重複登録は不要という前提で結構です。 テーブルのインデックスを、姓名での重複なしにする、という点ですが、テーブルでは「姓」「名」が別フィールドになっています。 この点、どのように対応すればよろしいか、ご教示賜れれば幸いです。 また、インデックスをつける方法では、Accessのエラーメッセージのダイアログが表示されますが、これを表示させずに、他のコントロールへの移動やデータ保存を止めるにはどうしたらよいでしょうか。 フォームの当該テキストボックスのプロパティの入力規則から制限を掛ける方法も試みましたがうまくいきません。 もし、この方法をご存知でしたらこの点につきましてもお知恵を拝借できればと思います。
お礼
DexMachinaさん、レスありがとうございました。 非常に参考になりました。 シングルクォーテーションを使うことなど思いもよりませんでした。感動です。 わかりやすい注釈もたくさん付けていただき、応用する際の勉強にもなりました。 ご指摘の通りテストしてみましたところ、問題なく作動しました。 今後は、教えていただいた点も参考にしつつ、もう少し勉強をしてみたいと思います。 ありがとうございました。