Page 110 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼重複を防ぐ機能(コマンド) 重複 02/10/29(火) 9:09 ┣Re:重複を防ぐ機能(コマンド) yu-ji 02/10/29(火) 10:06 ┃ ┗Re:重複を防ぐ機能(コマンド) 重複 02/10/29(火) 15:27 ┃ ┗Re:重複を防ぐ機能(コマンド) yu-ji 02/10/30(水) 10:13 ┃ ┗Re:重複を防ぐ機能(コマンド) 重複 02/11/6(水) 15:37 ┃ ┣Re:重複を防ぐ機能(コマンド) yu-ji 02/11/6(水) 18:12 ┃ ┗Re:重複を防ぐ機能(コマンド) ゆき 02/11/19(火) 16:03 ┗Re:重複を防ぐ機能(コマンド) イケガミ 02/10/29(火) 16:35 ─────────────────────────────────────── ■題名 : 重複を防ぐ機能(コマンド) ■名前 : 重複 ■日付 : 02/10/29(火) 9:09 -------------------------------------------------------------------------
どなたか教えてください。 データの重複を防ぐ機能(コマンド)をつけたいのですが、そういう機能はあるのでしょうか。Dcountを使ってみたのですが、今ひとつちがうようです。 希望としては; (例)データ「A」を入力、登録しようとしてそのデータがすでに存在していたら「そのデータは存在します」みたいなメッセージを表示させたい If データ「A」がテーブル「B」に存在したら Then msgbox "そのデータは存在します。” になるのかな、と思うのですがどうでしょうか??? vbはじめたばかりなのでここまでしかわかりません どなたかよろしくお願いします。。 |
▼重複 さん: >希望としては; >(例)データ「A」を入力、登録しようとしてそのデータがすでに存在していたら「そのデータは存在します」みたいなメッセージを表示させたい > >If データ「A」がテーブル「B」に存在したら Then >msgbox "そのデータは存在します。” 重複を防ぐには、重複しないキーを割り当ててれば重複データを入力しようとしたら エラーが出ると思いますが、とりあえずそれ以外の機能(コマンド)はないと思います。 なので、それ以外だとVBAでプログラムしないとダメだと思います。 手順としては、 1.テーブルを開く 2.データを検索する です。 SQLはご存知でしょうか? SQLを使えば、必要な情報だけ絞り込んで開いて、レコードがなければOK という感じでプログラムしています。 #その1な感じ。 SQLが難しければ、OpenRecordsetでテーブルを開いて、対象フィールド (仮にフィールドC)にAがないかをIfでチェックし、チェックに引っかかるか EOFになるまでLoopで回すというやり方になります。 #その2な感じ。 ちなみに下記プログラムはDAOを使ってます。 Access2000以降を使われてれば、DAOを参照設定にいれるか、プログラムを ADOに修正しないとだめです。 ************** その1: Function test() Dim dbs As Database Dim rds_rd As Recordset Set dbs = CurrentDb Set rds_rd = dbs.OpenRecordset("Select * From テーブルB Where フィールドC = '" & データA & "'") If Not rds_rd.EOF Then MsgBox "そのデータは存在します。" End If End Function P.S データAの型が不明なので、いちおう文字型として作ってます。 ************** ************** その2: Function test() Dim dbs As Database Dim rds_rd As Recordset Set dbs = CurrentDb Set rds_rd = dbs.OpenRecordset("テーブルB") If Not rds_rd.EOF Then 'テーブルBにデータが入っているか rds_rd.MoveFirst 'テーブルBの最初のレコードに移動 Do Until rds_rd.EOF 'レコードを全部チェックするまで If rds_rd!フィールドC = データA Then 'データAが存在しているか Exit Do '存在していたら途中でチェック終了 End If rds_rd.MoveFirst '次のレコードに移動 Loop If Not rds_rd.EOF Then '全部チェックしたか MsgBox "そのデータは存在します。" End If End If End Function |
yu-jiさん、ありがとうございます。 教えていただいた「その2」を使って、ずっと試しているのですが、どうもテスト用に入力した重複データがうまくひっかかってくれません。。。 ちなみにMS ADOも追加してやってみたのですが、やっぱり作動しません。。 これはもしや「データA」と特定するのではなく、(例えば)「フィールドB」に入力したデータが「テーブルC」上の「フィールドB」に存在していないか、というコードの方がいいのかも・・ その場合は、教えていただいた「その2」の If rds_rd![IP] = データA Then 'データAが存在しているか 「データA」部分を”’”にすればよいのでしょうか?? (しても重複データは相変わらずひっかからないのでやっぱり違うようです・・) たびたびすみませんがお手すきのときにご指示いただければ幸いです |
▼重複 さん: >教えていただいた「その2」を使って、ずっと試しているのですが、 >どうもテスト用に入力した重複データがうまくひっかかってくれません。。。 んー、どうしてでしょう(^^; 「データがひっかからない」だけでは、対応しようがないです。 ちなみに、ブレイクポイントなどを使ってデバッグしたり、その時の変数などの 値をウォッチウィンドウでチェックする方法はご存知ですか? とりあえず、チェックがかかるはずのデータのレコードの時に、IF文で ブレイクさせて、[IP]とデータAがどういう値になっているかを確認してみて ください。 あと、話を戻すようですが、[IP]に対してキーを設定することはできないの でしょうか?重複してもOKな場合があるとか? >ちなみにMS ADOも追加してやってみたのですが、やっぱり作動しません。。 これは、意味がないですね(^^; >これはもしや「データA」と特定するのではなく、(例えば)「フィールドB」 >に入力したデータが「テーブルC」上の「フィールドB」に存在していないか、 >というコードの方がいいのかも・・ これも重複を防ぐ方法で、実際にデータを入力した後にチェックするパターン ですね。 データを入力時にチェックして入力するのか、データを入力した後にチェックして 削除するのか、方法は状況にあわせて使いわければいいと思います。 ただプログラムにミスがあるだけなので、どちらかの方法でないとチェックでき ないというわけではないです。 #ツールの使用環境で、どちらかの方法でないと、「使えない」ということは #あると思いますが。マルチユーザー環境で、一瞬たりともデータが重複してしまう #と困る場合とか。 >その場合は、教えていただいた「その2」の >If rds_rd![IP] = データA Then 'データAが存在しているか > >「データA」部分を”’”にすればよいのでしょうか?? ?? それだとIPと(文字)'を比較しているだけですよ? 重複を削除する方法もいろいろあります。 どのやり方が、作られてるものに合うのか分からないですが、 まず、どちらの方法(入力時にチェックか、入力後に削除か)を取りたいのか 決めてください。 |
お世話になります。 「データがひっかからない」というのは、試験的にすでに存在しているデータを意図的に入力しても、「重複してます」メッセージボックスが出ない、ということです。 構成としては、いくつかのフィールドがあり、すべて入力後「登録」ボタンを押したら「どこそこのフィールドに重複してるデータがあります。確認してください」というメッセージがでるようにしたいのですが・・ |
>>重複を削除する方法もいろいろあります。 >>どのやり方が、作られてるものに合うのか分からないですが、 >>まず、どちらの方法(入力時にチェックか、入力後に削除か)を取りたいのか >>決めてください。 >構成としては、いくつかのフィールドがあり、すべて入力後「登録」ボタンを >押したら「どこそこのフィールドに重複してるデータがあります。確認して >ください」というメッセージがでるようにしたいのですが・・ 登録ボタンのクリックイベントで重複するデータが入力される前にはじきたい ということだから、データが入る前のチェックが必要ですね。 ということで、今までの流れのままで。 >「データがひっかからない」というのは、試験的にすでに存在しているデータを >意図的に入力しても、「重複してます」メッセージボックスが出ない、という >ことです。 えっと。それは、理解できてました(^^; が、それだけでは原因が判断できないので、「データがひっかからない」という 言葉の補足ではなく、状況の補足をして欲しかったのですが(^^; 前の書き込みで書いた点については、もうチェックされました? もしくは前の書き込みについて、意味が分かりませんでした? とりあえず、前の書き込みに対するレスをください。 |
私はいつも質問する立場なので的外れかもしれませんが 重複チェックなら私はこういうふうに作りましたので参考にしてください。 入力するテキストボックスの更新前処理に以下のソースを書きました。 Private Sub テキスト1_BeforeUpdate(Cancel As Integer) Dim ret As String '「テーブル1」テーブルの「フィールドa」フィールドに 'フォーム上の「テキスト名1」テキストボックスの入力した値が登録されているか調べる If Not IsNull(DLookup("フィールドa", "テーブル1", "テキスト1 ='" & Me![テキスト1].Value & "'")) Then Beep ret = MsgBox(Me!テキスト1 & " は登録ずみです。よろしいですか。", vbOKCancel + vbQuestion, "入力検査") Select Case ret Case vbYes Case vbCancel MsgBox ("変更してください。") Cancel = True 'レコード追加をキャンセル Me!テキスト1.SelStart = 0 Me!テキスト1.SelLength = Len(Me!テキスト1) End Select End If End If End Sub |
>データの重複を防ぐ機能(コマンド)をつけたいのですが、そういう機能はあるのでしょうか。 >Dcountを使ってみたのですが、今ひとつちがうようです。 どのように使われて、どこが違っているのでしょうか? |