ACCESSの重複チェック方法とは?

このQ&Aのポイント
  • 顧客データをACCESS2003にて作成しています。フォームにてVBAを用いて重複チェックを行っていますが、件数が多いために処理時間がかかっています。別の方法(式)にて効率的な重複チェックをする方法を教えてください。
  • ACCESS2003で顧客データを作成し、フォームでVBAを使用して住所の重複チェックを行っています。ただし、入力データが10万件以上あるため、処理に時間がかかっています。別の式を使用して効率的な重複チェックを行う方法を教えてください。
  • ACCESS2003を使用して顧客データを管理しています。フォーム内で住所の重複チェックを実施していますが、データが10万件以上あるため、処理に時間がかかってしまいます。別の式を使用してスムーズな重複チェックを行う方法を教えてください。
回答を見る
  • ベストアンサー

ACCESSの重複チェックについて

顧客データをACCESS2003にて作成しています。 フォームにてVBAを用いて重複チェックをしているのですが、件数が多いせいかチェックに時間が掛かっております。(入力済件数は10万は超えております。) テーブル(T_顧客管理)よりチェック出来るようにしており、チェックのフィールドは「住所」にしております。 Private Sub 住所_BeforeUpdate(Cancel As Integer) If DCount("住所", "T_顧客管理", _ "住所='" & Me!住所 & "'") > 0 Then Beep MsgBox "既存のデータと同じ住所が入力されました! " & _ "別の値を入力してください。", _ vbOKOnly + vbExclamation, "重複エラー" Cancel = True Me.Undo End If End Sub 上記の式を入れておりますが、別の方法(式)にて上記と同じ内容にてチェック出来る式があれば教えていただきたいと思いますので、宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

D系の定義域集計関数は遅いので テーブルのデザインビューでインデックスを「住所」フィールドに設定する。 FindFirst メソッドの方がD系より少しは早かったような気がします。 リンクテーブルで無ければの話ですが、インデックスを設定したうえで Seek メソッドが一番早いハズです。(ちょっと昔のですが・・) 実験:index、FindFirst、Seekの検索速度 http://www.geocities.jp/masa7251/tips/access/acs00009.html あと、インデックスあり重複なしに設定しておくとか。 その際に重複データの場合には無愛想なメッセージが出ますので ユーザーは驚くかもしれません。 それの対処には、下記の 30246kiku さんの回答が助けてくれるでしょう。 http://okwave.jp/qa/q6557323.html Private Sub Form_Error の処理に注目

gala2000
質問者

お礼

ありがとうございます。 インデックスを設定していなかったので、まずは設定してやってみます。 リンクもありがとうございます。早速参考にしてみたいと思います。

関連するQ&A

  • ACCESS重複のチェック

    ACCESSで重複チェックをしたいと思います。 現在は電話番号テーブルだけしかありません。 電話番号のテーブルを主キーを使って重複している場合エラーメッセージを出すというものです。保存ボタンもありません。 Private Sub text電話番号_BeforeUpdate(Cancel As Integer) If IsNumeric(text電話番号) = False Then '数字チェック。 MsgBox "電話番号は数字で入力して下さい。", vbCritical Cancel = True ' 処理を取り消します。 Me.Undo End If Dim strmsg As String strmsg = "重複しています" If Not IsNull(DLookup("[電話番号]", "ダブリチェックテーブル", "[電話番号] = [text電話番号]")) Then MsgBox strmsg, 16, "ダブリチェック" Cancel = True '処理を取り消します。 Me.Undo '元に戻します。 Else Cancel = False '処理を続行します。 End If End Sub これに、企業名と出発日という項目を増やしたいと思います。 ですが、何万とある電話番号を一気に入力して調べているので、一回一回企業名と出発日を入れていると生産性が落ちます。 ですので、企業名と出発日は最初の入力だけで次のレコードに移動してを継続させたいのです。そして電話番号以外にカーソルを行かないようにしたいです。 何か良い方法があればご教授お願いします。 ちなみにいろいろ自分なりに試したのですが、重複してエラーを出した場合に企業名にカーソルが飛んだししてうまくいきませんでした。

  • フォームで顧客データ入力の際に、氏名の重複データの検索を更新前処理する式を教えて下さい。

    飲食をチェーン展開している会社の本部で顧客管理の仕事をしております。 店舗数は6店舗あり、多い店舗で現在7000件、少ない店舗で300件ほどのデータを管理しております。 フォームにて、氏名を入力時に重複データを検索する方法を試行錯誤しておりますが、 このサイトでのご回答やWEB検索などで、なんとか下記の式を記述し、重複チェックを完了するまでに至りました。 チェック後の処理に『リンク元の顧客テーブルを開く』(←(1)です)式を記入しておりますが、『重複データを検索した結果を表示する (テーブルもしくはフォームにて)』式に変更したいのです。 重複チェックの方法は『氏名+郵便番号+住所』でチェックしたいと考えています。 そのような処理が出来る具体的な式を、どなたかご指南お願い致します! ----------------------------------------- Private Sub 氏名_BeforeUpdate(Cancel As Integer) Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("顧客A", dbOpenDynaset) rs.FindFirst ("氏名 = '" & Me!氏名 & "'") If Not rs.NoMatch Then If MsgBox("重複しています。詳細データを参照しますか?", vbOKCancel) = vbOK Then DoCmd.OpenTable "顧客A" ←(1) End If End If End Sub

  • ACCESSで重複チェック後にフォーカスを移動したい

    Private Sub 会社名_AfterUpdate() ACCESS2003です。 フォーム上で入力後(更新後処理)に重複チェックをしています。 重複したときにエラーメッセージを出してフォーカスさせたいのです。 エラーメッセージまでは上手くいくのですが、フォーカスが移動してくれません。 どこが悪いのでしょうか? Private Sub 会社名_AfterUpdate() Dim i As Integer i = DCount("*", "tbl取引先", "会社名 ='" & Me.会社名 & "'") If i = 1 Then MsgBox [会社名] & " は登録済みです。" Me![会社名].SetFocus Cancel = True End If End Sub よろしくお願いします

  • Access2000での重複チェック

    前回も質問させていただきましたがどうしてもわからないので質問させていただきます。 DCount("規定金額", "ワークテーブル", "規定金額= '" & Me!txt規定金額.Value & "'") <> 0 Then 歩合入力フォームにsub歩合入力サブフォームが張り付いてます。ワークテーブルのフィールドは規定金額、歩率です。規定金額が重複してるかどうか調べたいのですが、上のコードではエラーがでてしまいます。間違ってるのでしょうか?sub歩合入力のForm_BeforeUpdateに書いています。エラーの内容は「抽出条件でデータ型が一致しません」です。よろしくお願いします

  • Access2000でレコードの重複チェックをするとエラーに

    ボタンをクリックすると、「品名」「色番」「ロット」「枝番」「巾」の重複が無いかチェックして、重複があればエラーテキストを表示させたいのです。 下記のコードで動かすと、 「エラー'91':オブジェクト変数またはWithブロック変数が設定されていません」と出ます。 どこが問題でしょうか? 教えて頂けると幸いです。 Private Sub 重複チェックボタン_Click() Dim Rs As ADODB.Recordset Dim strSQL As String strSQL = "" strSQL = strSQL & " Select * From 変更ロットテーブル " strSQL = strSQL & " Where 品名 = '" & Forms!変更ロット入力チェックフォーム!品名 & "'" strSQL = strSQL & " And 色番 = '" & Forms!変更ロット入力チェックフォーム!色番 & "'" strSQL = strSQL & " And ロット = '" & Forms!変更ロット入力チェックフォーム!ロット & "'" strSQL = strSQL & " And 枝番 = '" & Forms!変更ロット入力チェックフォーム!枝番 & "'" strSQL = strSQL & " And 巾 = '" & Forms!変更ロット入力チェックフォーム!巾 & "'" Rs.Open strSQL, CurrentProject.Connection If Rs.EOF = False Then If MsgBox("重複ロットが存在します!", vbOKCancel) = vbOK Then Cancel = True End If End If End Sub

  • ACCESSのフォーム

    ACCESSのフォームでデータを入力しています。 既に入力したデータを誤って上書きしないように、更新前処理で下記のコードを入れました。 Private Sub 単価_BeforeUpdate(Cancel As Integer) If MsgBox("変更を保存しますか?", vbYesNo) = vbNo Then Me.Undo End If End Sub 入力済のデータを上書きする時はこの方法で良いのですが、新規に入力する時にも同じように確認メッセージが出てしまいます。 新規入力の時には確認メッセージを出さない方法があったら教えて下さい。 よろしくお願いします。

  • アクセスにてテーブル内の重複チェックについて

    下記の様なテーブル構成になっています。 大分類マスタ 大分類 長整数型 分類見出し 文字列 このテーブルにフォームから入力をさせているのですが重複チェックの時にvercheckのデータ形式が違いますと出てエラーが出ます。色々とデータ形式を変えたのですがうまくいきません。 どの様にすれば宜しいのでしょうか?ご教授頂きます様お願い致します。 尚、テーブルの数値を文字形式にすれば動作するのは分かっているのですが数値形式の場合の やり方を教えてください。 Dim str大分類 As String Dim str分類見出し As String Dim vercheck As Variant If IsNull(大分類) = False Then str大分類 = 大分類 vercheck = DLookup("大分類", "T大分類マスタ", "大分類='" & str大分類 & "'") If Not IsNull(vercheck) Then MsgBox ("同じ大分類番号があります") Exit Sub Cancel = True Else End If Else Exit Sub End If If IsNull(分類見出し) = False Then str分類見出し = 分類見出し vercheck = DLookup("分類見出し", "T大分類マスタ", "分類見出し='" & str分類見出し & "'") If Not IsNull(vercheck) Then MsgBox ("同じ分類見出しがあります") Exit Sub Cancel = True Else End If Else Exit Sub End If -------ここからフォームから直にテーブルに書いています。--------- Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = Application.CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "T大分類マスタ", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs![大分類] = Forms!F大分類マスタ登録画面!大分類 rs![分類見出し] = Forms!F大分類マスタ登録画面!分類見出し rs.Update End Sub

  • 重複チェック

    あるシートに値を入れた時、そのシートのA1:Z80の範囲内で重複する値が既存するかどうか調べたいです。 下記のコードを試すと、どの値を入れても既存すると帰ってきます。 入力した値自身を見つけて重複だと言っている気がするのですが、どのように対処すればいいのか教えてほしいです。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myCell As Range For Each myCell In Sheets("居場所").Cells If Target.Value = myCell.Value Then MsgBox "この名前は既に存在しています。", vbOKOnly + vbExclamation Exit Sub If myCell.Address = "$Z$80" Then Exit Sub End If Next End Sub

  • accessフォームチェックボックス→トルグ文字

    (access 2003) (メインとサブがあり、メインフォームです。) フォームのチェックボックス(yes/no型)をコントロールの種類変更よりトルグボタンに変更し、 トルグボタンで入力しています。 yesなら、「仮」 noなら「普通」としたいと思い、下記の式を試して見ましたが、下記のようになります。 ページ移動ごとに凸凹は変わるのですが、トルグボタンに表記させている文字が「仮」から変わりません。 ボタンを押した時だけ「普通」に変わるのですが、ページを移動すると今度は「普通」ばかりの表記になってしまいます。 よろしくお願い致します。 Private Sub T2伝票仮_AfterUpdate() If Me![T2伝票仮].Value = True Then Me![T2伝票仮].Caption = "仮" Me![T2伝票仮].ForeColor = 255 Else Me![T2伝票仮].Caption = "普通" Me![T2伝票仮].ForeColor = 16711680 End If End Sub

  • ユーザーフォーム データ消去の時の処理

    環境:Excel2002です ユーザーフォームのテキストボックスの入力チェックをしています Rem**************** Rem TextBox5 Check Rem**************** Private Sub TextBox5_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox5.Text) = 0 Then '未入力Check If IsNumeric(Me.TextBox5.Text) = False Then '数値入力Check MsgBox "数値で入力してください", _ vbExclamation, "納品書作成ツール" Me.TextBox5.SetFocus Exit Sub End If MsgBox "入力してください", _ vbExclamation, "納品書作成ツール" Me.TextBox5.SetFocus Exit Sub End If Me.TextBox5.Text = Format(Me.TextBox5.Text, "#,##0") End Sub 入力したデータを消去して Enterキーを押すか、マウスでクリックした時のいずれでも Len(Me.TextBox5.Text) = 0 と認知されて "数値で入力してください"のメッセージが表示されてしまいます このメッセージが出ないようにするにはどうしたらいいのでしょうか ご教示願います

専門家に質問してみよう