• 締切済み

アクセスで重複と該当なしコードは入力不可にしたい

アクセス97で顧客管理をしています。 まだなかなか使いこなせないでいるところがあるのですが、どなたかわかりましたらよろしくお願いします。 テーブルAに1000件以上のレコードがあります。主なフィールドはコードと顧客名と住所などの情報です。そのテーブルにレコードを追加していくのに、フォームから行っています。フォームプロパティのデータ入力を「はい」に設定してるだけです。 ここで問題が2つあります。 (1)例えばフォームからコードを入力する際に、正しいコードであれば良いのですが、間違ったコードを入力してしまってもテーブルに追加されてしまうのです。今はその都度テーブルを開いてその行を削除しています。 正しいコードかコードでないかの判断はテーブルBに存在するコードによって決定します。テーブルBになければ全てエラーにしたいのです。 (2)コードが重複してもいけないのですが、テーブルAのコードのプロパティを重複なしにしているのですが、フォームに一度重複したコードを入力してしまうと、一度開いたフォームを強制終了しなければ先に進めません。 (1)においても(2)においても、例えばメッセージボックスが開いて「正しいコードを入力して下さい」のようなものが開いて、OKをクリックしたら、またコードの入力から始まるような方法はないものでしょうか? ちなみにその顧客コードを入力したら、顧客名が自動的に開く下記VBAをフォームに組んでいます。 Private Sub 店番_AfterUpdate() Me![名前] = DLookup("顧客名", "テーブルB", "顧客コード=" & Me![コード] & " ") End Sub 何卒よろしくお願いします。

noname#20309
noname#20309

みんなの回答

  • ducati
  • ベストアンサー率29% (308/1062)
回答No.3

どーも話の感じですと、ADOなどで接続はしていないようですね。 それ以外となると、クエリを作成してそれを呼び出す形という方法もあるでしょうが、処理速度と作る大変さからもADOなりDAOなりでDBに接続してSQLを投げるというプログラムを作ったほうが速くて簡単だと思います。 この辺のことは参考書なりで勉強してください。 ここではとても説明しきれませんので。

noname#20309
質問者

お礼

ありがとうございました。何とか頑張ってみます。

  • ducati
  • ベストアンサー率29% (308/1062)
回答No.2

#1です。 もっと簡単に出来ますね。 カウントとってあげてそれを判断すれば良いと思います。 SQLを「SELECT Count(*) AS カウント数 FROM テーブルB WHERE コード=Text1;」にして If rst!カウント数 = 0 Then 'データなし Else 'データあり End If にしてあげればいいと思います。

  • ducati
  • ベストアンサー率29% (308/1062)
回答No.1

コード入力フォームに入力されたらテーブルBをそのコードを条件に見に行くSQLを作ってあげればよいと思います。 こんな感じでいいですか? Private Sub 店番_AfterUpdate() Dim cn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim strSql As String Dim i As Integer Set cn = New ADODB.Connection cn.ConnectionString = "接続するMDB" cn.open 'SQLを作成し、CommandTextプロパティに代入 strSql = "SELECT * FROM テーブルB WHERE コード=Text1;" 'コマンド実行 Set rst = cn.Execute(strSql) Do While Not rst.EOF i = i + 1 rst.MoveNext Loop Debug.Print i If i < 1 Then MsgBox "コードがありません", vbCritical 'この後にテキストボックスをクリアしてセットフォーカス 'してあげたらよいでしょう。 Exit Sub Else '存在したら処理を走らせる Me![名前] = DLookup("顧客名", "テーブルB", "顧客コード=" & Me![コード] & " ") End If rst.Close cn.Close Set rst = Nothing Set cn = Nothing End Sub ざっと作っただけですので、これはあくまで参考に細かい部分は修正してやってみてください。

noname#20309
質問者

お礼

早速のご回答ありがとうございます! でも、ちょっと私のレベルではついていけないような・・・(^^;) そのままコピーペーストさせていただいて、テーブルAとBを実際の名前に変更などしただけですが、コードを入力した後、リターンすると Dim cn As New ADODB.Connection においていきなりエラーが出てしまい、私では修正不可能です。 実際に行いたいのは、フォームで新規顧客コードを入力したい場合、テーブルBで既にそのコードを取得してからの作業になるのですが、 ・テーブルBから顧客名を引き出す ・テーブルAと顧客コードが重複していたら何かメッセージを出してやり直しさせる。 ・テーブルAにもBにも顧客コードがなければ何かメッセージを出してやり直しさせる。その際にそのエラーの顧客コードはテーブルに追加しない。 この3つを同時進行させる方法はありますでしょうか? お忙しいところ申し訳ありません。何卒、よろしくお願いします。

関連するQ&A

  • access2000での重複不可項目の入力

    access2000,WIN98SEの環境です。 顧客コード・・・テキスト型、主キー、重複不可 顧客名・・・テキスト型 住所・・・テキスト型 というテーブルを作成し、そこへ登録するフォームを作成しています。 顧客コードは修正時は入力不可としており、追加というボタンを押すとそこへ移動できるようにしています。 追加時に顧客コードで既に登録してあるコードを入れると、Dcount関数を用いて重複レコードがあった時はエラーメッセージを出しています。 その後、カーソルは顧客コードの末尾に移り(100|という感じです)、backspaceキーで100を消して再度入れ直そうとすると再び重複エラーのメッセージが出てしまいます。 Escキーを押すと、コード自体がシロ抜きになり入力することができるのはわかったのですが、Escキーを押すという行為をVBAで現すことはできるのでしょうか? よろしくお願い致します。なお、マクロは使用しておらずVBAでのコーディングで処理をしています。

  • Access97で自動入力と反映が違うテーブルの場合

    こんにちは、前の質問などでフォームへの自動入力は何とかできるようになったのですが、今度はその入力したデータを他のテーブルBに反映させたいのですが、どうしたら良いのでしょうか? テーブルA 店舗コード 店舗名 ※テーブルAの管理者は私ではなく、ネットワークで私のPCと「テーブルのリンク」でつながっています。 テーブルB 店舗コード 店舗名 商品番号 他に店の情報フィールドをいくつか作成 フォームC 店舗コード 店舗名 商品番号 他に店の情報テキストボックスをいくつか作成 フォームCで、店舗コードを入力したら店舗名が自動的に入力される方法は、フォームCのレコードソースをテーブルAにして、店舗コードの更新後処理をイベントプロシージャにして、下記イベントコードを設定しました。 Private Sub 店舗コード_AfterUpdate() Me![店舗名]=DLookup("店舗名","テーブルA","店舗コード=" & Me![店舗コード] & " ") End Sub そして、フォームの残りのテキストボックスに、店と商品に関するデータを入力し、入力した全てのデータをテーブルBに反映させたいのですが、どうしたら良いのでしょうか? 自動入力の方法でDLookupを使用したのがいけなかったのでしょうか? また、できればテーブルBは商品番号順に並びかえられているのですが、入力したら商品番号のリストの一番下に挿入されるという形にしたいのです。 どうかよろしくお願いします。

  • アクセス2010 ナンバーリングのコードについて

    アクセス2010で取引台帳テーブルに連結した入力フォームを作り、件名を入力すると契約NOを自動で採番するように 下記のコードにして使っていました。 しばらくはちゃんと採番されていたのですが、分類をする時に使う、 2個あった区分を3個に追加して、 コードも2個から3個に追加しました。それから変になった気がします。 契約NOの最大値+1だと前回作られたNOと重複するようになってしまい、 契約NO+2だと、最後の最大値の次のNOが作れます。 なぜ突然こうなったのかが分かりません。 VBのコードをきちんと学んだ事がなく、本でサンプルを見たりしながら作っています。 わかりやすく教えていただきたく、お願いいたします。 契約NOは R-KS1305-0055 Rが区分 KSがコード 1305が年月2013/05 0055が連番で採番しています。 Private Sub 物件名_AfterUpdate() Me![契約NO] = Me![区分] & "-" & Me![コード] & Format(Me![入力日], "yymm") & "-" & Format(DCount("契約NO", "取引台帳") + 1, "0000")

  • 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 よろしくお願いします

  • アクセス DLookUpについて

    職員番号入力後、自動で部署コードを入力できるようにしたいのですが、このアクセスのフォームで、正常に動くフォームと動かないフォームがあり困っております。どこが悪いか御教示お願いできませんでしょうか。 -------------------------------------------------------- 使用テーブル T_職員名簿 : ID、氏名漢字、氏名カナ、部署コード、部署名 イベントプロシ―ジャ内容 Private Sub 職員番号_AfterUpdate() Me.[部署コード] = DLookup("部署コード", "T_職員名簿", "職員番号= " & Me![職員番号] & "") End Sub エラー内容 イベントプロパティに指定した式更新後処理でエラーが発生しました。 --------------------------------------------------------

  • Accessでのフォーム入力エラー

    顧客管理を 顧客マスタ 受注明細 入金明細のテーブルを作成し、リレーションシップの設定をしてあります。テーブルには、この形で入力できるのですが、フォームをウィザードを使って作成(サブフォームのリンクされたフォーム)しました。 新規入力することができません。「テーブル’顧客マスタ’にリレーションシップが設定されたレコードが必要なので、レコードの追加や変更をおこなうことはできません。」のメッセージが出ます。 どうしていいのか、わかりません。教えてください。

  • クエリーから入力フォームの作成

    access2000を使って簡単な注文用のフォームを作っています。VBAは初心しゃです。 テーブルとしては、納品伝票(伝票番号、顧客コード)、顧客管理(顧客コード)を作り( )ないのものでリレーション組んでます。 クエリーでリレーションを組み、それを元にフォームを作りました。 希望としては(1)伝票番号の重複がないようにする。 (2)顧客コードから住所を表示させる、顧客コードが登録されていないときにはメッセージを出し、正しい顧客コード(顧客コードのみ)を入力させる。 (1)はクエリーでテキストのデータを条件にし、フォームのVBAで Private Sub 伝票番号_AfterUpdate() If DCount("伝票番号", "Q_納品伝票") >= 1 Then MsgBox "すでに登録されています" Me.Undo DoCmd.GoToControl "顧客名" DoCmd.GoToControl "伝票番号" End If End Sub で上手くできましたが、同じクエリーで(2)も(1)と同様なVBAを組んだところ(顧客デーブルの顧客コードに重複があるときをチェックさせる)、(1)の重複をチェックしなくなってしましまいました。 うまく説明できたが心配ですが、根本的に何か違っていますでしょうか?

  • 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 上記の式を入れておりますが、別の方法(式)にて上記と同じ内容にてチェック出来る式があれば教えていただきたいと思いますので、宜しくお願い致します。

  • ACCESS フォームの入力で

    フォームの入力でコード番号を入力すると項目が自動入力出来るようにしたくて 2つ目のテキストボックスのコントロールソースに=DLookUp("[商品名]","テーブル2","[商品コード] = [コード] ")と入力したのですが 1つ目のテキストボックスに入力すると そのときは2つ目のテキストボックスは白紙で 一度フォームを閉じてから立ち上げると2つ目のテキストボックスにも入力されています。 これは閉じないと入力されないのでしょうか? 1つ目を入力した後に表示されるようにしたいのですが・・・。 よろしくお願いします。

  • ACCESSでフォーム入力内容から自動で表示させる

    顧客の口座を管理するものをAccessで作成しています。 顧客テーブルに氏名等の情報があり、別に銀行マスタテーブルとして金融機関の情報がID、銀行コード、銀行名、支店コード、支店名、と入力されているものがあります。 銀行マスタテーブルは以下の形です 銀行コード 銀行名 支店コード 支店名 1 みずほ 1 東京営業部 1 みずほ 4 丸の内中央 1 みずほ 5 丸の内 5 UFJ 5 大阪 あらかじめ、氏名等の情報は入力してあり、これから口座情報を登録していくのですが、フォームに銀行コード、支店コードを入力した際に、その下に配置したテキストボックスに銀行名、支店名を表示させたいと考えています。 銀行コードの方は値が重複しても対応する銀行名は同じなので =DLookUp("[銀行名]","銀行マスタ","[銀行コード] = " & [Forms]![H25]![銀行コード]) でなんとかできたのですが、支店コードは各金融機関毎に割り振られ、重複するものがあるため最上段のものが表示されてしまいます。(UFJの支店コード5を表示させたいのに、みずほの支店コード5が出てきてしまう。) そこで、複数条件で検索できるよう以下のようにしてみたのですが、うまくいきませんでした。 =DLookUp("[銀行名]","銀行マスタ","[銀行コード] = " & [Forms]![H25]![銀行コード]' And 支店コード = #" & [Forms]![H25]![支店コード] "#") イメージとしては、そのフォームに入力した銀行コードかつ支店コードが一致する銀行マスタテーブルの支店名を、フォームに配置したテキストボックスへ表示させれればいいのかなと考えてみたのですが。(上の例で言うと、銀行コードが5で支店コードが5だからテキストボックスに「大阪」と出したい。) 関数でもVBAでも構いませんので、どなたかご教示ください。 よろしくお願いいたします。

専門家に質問してみよう