• ベストアンサー

ACCESSのデータシート形式のフォームでのDLookupについて

お世話になります。 以下の様なコードでフォーム上の「bikou」という項目に商品マスタテーブル内の該当する商品コードの「商品名称」を代入しようと思います。 Private Sub 商品コードNo_BeforeUpdate(Cancel As Integer) Me!bikou = DLookup("商品名称", "商品マスタ", "商品コード='" & Me!商品コードNo & "'") End Sub これは単票形式のフォームではうまくいくのですが、データーシート形式ですと商品コードを入力する度にフォーム上に表示されている「bikou」がすべて塗り換わってしまいます。結果として最後に入力して商品コードの商品名称が、表示中のすべてのレコードの「bikou」に代入されてしまいます。そこで、「現在編集中のレコードの項目「bikou」のみに値を代入する(商品名称を代入する)」という指定を 行うプログラムの書き方はあるのでしょうか。 よろしくお願い致します。

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

  • ベストアンサー
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.4

フォームのソースの情報がありませんが >これは単票形式のフォームではうまくいくのですが、 >データーシート形式ですと商品コードを入力する度に >フォーム上に表示されている「bikou」がすべて塗り換わってしまいます。 これは[bikou]が非連結コントロールだからでしょう ソースに[bikou]というフィールドを設けてください もっといえばDLookupの結果を本当にテーブルに書き込む必要があるのか疑問ですね 表示だけでいいのならソースをこのような式フィールドを持ったクエリにすれば いちいち代入する必要もないですね

nakasi99
質問者

お礼

>これは[bikou]が非連結コントロールだからでしょう >ソースに[bikou]というフィールドを設けてください おっしゃるとおりでした。当初非連結コントロールを使うことしか頭に無かったのですが、元のテーブルにその項目を作ってそれに代入するようにしたら目的は達成できました。 >表示だけでいいのならソースをこのような式フィールドを持ったクエ リにすれば これについては試してみます。(現状クエリ使っておらず、フォームからテーブルに直接書き込んでいましたので) ありがとうございました。

その他の回答 (3)

noname#60992
noname#60992
回答No.3

ちょっと質問の意味を勘違いしておりました。 素人で自己流ですのでもっと簡単な方法があるかもしれませんが、私は通常はADOでレコードを検索します。 例 Private Sub 商品コードNo_AfterUpdate() Dim strSQL As String Dim CONN As ADODB.Connection Dim RST As New ADODB.Recordset Set CONN = CurrentProject.Connection strSQL = "SELECT 商品マスタ.商品名称 FROM T1 WHERE 商品マスタ.商品コード= '" & me.商品コード.Value & "';" RST.Open strSQL, CONN, adOpenKeyset, adLockOptimistic If RST.EOF Then MsgBox "該当データがありません" me.bikou.value = "" RST.Close: Set RST = Nothing CONN.Close: Set CONN = Nothing Exit Sub End If Me.bikou.Value = RST!Name RST.Close: Set RST = Nothing CONN.Close: Set CONN = Nothing End Sub とすると、入力したIDの商品名がbikouに入ってくると思います。 (bikouのフィールドは非連結ですよね) 速度的に問題があるなら、インデックスを利用してseekを使ってみるのもよいかもしれません。

参考URL:
http://www.geocities.jp/cbc_vbnet/ADO/find.html
nakasi99
質問者

お礼

プログラムまで書いて頂きましてありがとうございます。 参考にさせて頂き、組み込んでみたいと思います。また、参考URLでADOについて勉強させて頂きます。有益なURLを教えて頂きましてありがとうございました。

noname#22222
noname#22222
回答No.2

ありません!

noname#60992
noname#60992
回答No.1

更新したいフィールドが同じテーブルにあるのか違うテーブルにあるのかよくわかりませんが、 アクセスでは、データの更新をしたい場合は更新クエリを使うと手軽です。 まず、抽出クエリをつくり、対象のデータのみが抽出されることを確認して、 更新クエリに変更、更新する値を指定します。 この際、更新する値が他のテーブルにあるならば、適切なリレーションを作成する必要があります。 このクエリを、更新させたいタイミングで走らせるだけです。 VBAで書きたいのならば、そのクエリをSQLビューに変更して、SQL文をコピーしてADOなどで実行させるのが簡単です。 クエリはわかりますか? SQLは?

nakasi99
質問者

お礼

早々とご回答ありがとうございます。説明不足でしたが、目的は商品の予約データ入力画面フォームを作ることで、そこで商品コードを入力すると商品マスタテーブル上の該当するコードの商品名称をフォーム上のテキストボックスに表示させたいのです。予約データテーブル自体には商品名称が記録される必要はありません。入力者に商品名称を確認させる為です。最初の質問で書きました「bikou」はテキストボックスです。この為、表示のみでデータの更新は必要ありません。エクセルで例えて言いますと、VLOOKUP関数の様なものがあればいいと思います。今まで単票形式のフォームですと私が最初に書きました式で用が足りていました。クエリについてはわかるつもりです。SQLはユニオンクエリで少々書いたことがある程度であまり詳しくありません。(勝手ながらわたしはこれから明日の午前中までPCが使えない環境に行きます。)

関連するQ&A

  • ACCESS 別フォームから別フォームの処理を

    ACCESSでメインフォームから別フォームを 【メインフォーム】 DoCmd.OpenForm "FM_商品検索", , , , , acWindowNormal 【商品検索フォーム】 検索画面でJANコードを選んだらJANコードをセットして、商品マスタの読込等の処理をしたい Forms!F_仕入!F_仕入sub.Form!JANコード = Me.JANコード ↑これは動く Forms!F_仕入!F_仕入sub.JANコード_BeforeUpdate ↑これがエラーになります 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」 でエラーになります。 Forms!F_仕入!F_仕入sub.JANコード_BeforeUpdate Public Sub JANコード_BeforeUpdate(Cancel As Integer) 何がおかしいのでしょうか? 宜しくお願いします

  • access2000表形式フォームから単票形式フォームで開きなおす方法

    access2000でDBをつくっています 表形式フォームのNoフィールドをダブルクリックして、クリックしたレコードのみを 単票形式フォームで開く。ということをしたいのですが、 表形式フォームのほうに Private Sub   No_DblClick(Cancel As Integer) DoCmd.OpenForm "単票形式", acNormal, , [No] = Me![No].Value, , acDialog End Sub とVBAを書いているのですが、 Noの値が3のところをクリックしてもNo=1のレコードが先頭に開けてしまい、 望むような結果が得られません。 本3,4冊調べてもよくわからないので、 アドバイスお願いします。

  • Access DLookUp関数について

    DLookup関数を使用して、フォーム上にテーブルの値を返したいと思い、 試行錯誤をしたのですが、思うように値が返されません。。。 どうかお力添え下さいますようお願い致します。 「得意先&出荷先」テーブルに「得意先コード」「名称」項目を設け、 「詳細入力」フォームの「得意先コード」に値を入力をすると、 「得意先名称」項目に、テーブルの「名称」項目の値を返す動作を設定したいのです。 私は、下記のように書きましたが、「#Type!」と表示され、思うような動作をしません。 =DLookUp("[名称]","[得意先&出荷先]","[得意先コード] = '" & [Forms]![不具合詳細入力フォーム]![得意先名称] & "'") どこがおかしいのでしょうか?? またDLookUp以外でも、もし上記のような動作を実現させる方法がありましたら、ぜひご教授ください! 宜しくお願いいたします。

  • データシート形式のサブフォームでコンボボックスでの入力がうまくいかない

    サブフォームはデータシート形式です。 メインフォームは受注フォーム。サブフォームは受注明細フォームです。 サブフォームのソースは受注明細テーブルです。 サブフォームに商品コードのコンボボックスがあって選択すると 該当する商品名、販売価格を商品マスタテーブルから検索して表示 したいので以下のようにためしてみました。 Private Sub 商品コード_AfterUpdate() ' ' 商品名 = DLookup("商品名", "T_商品マスタ", "商品コード='" & 商品コード & "'") ' 販売価格 = DLookup("販売価格", "T_商品マスタ", "商品コード='" & 商品コード & "'") 商品名 = 商品コード.Column(1) 販売価格 = 商品コード.Column(2) End Sub そうすると、商品コードを選択すると商品名と販売価格が 全行同じものに変わってしまいます。 どうすればよいでしょうか? ご教示していただけませんでしょうか? よろしくお願い致します。

  • Access非連結フォームから複数レコード挿入

    お世話になっております。 Access2003を使用しております。 <テーブル ”商品マスターT”> code   shouhin =========================== 1    チョコ 2    ラムネ 3    ジュース 4    団子 5    ガム <フォーム "商品入力フォーム"(非連結・単票フォーム)>      商品コード       商品名 1行目 [非連結(テキスト0)] [=DLookUp("shouhin","商品マスターT","code=" & [テキスト0])] 2行目 [非連結(テキスト1)] [=DLookUp("shouhin","商品マスターT","code=" & [テキスト1])] 3行目 [非連結(テキスト2)] [=DLookUp("shouhin","商品マスターT","code=" & [テキスト2])] 4行目 [非連結(テキスト3)] [=DLookUp("shouhin","商品マスターT","code=" & [テキスト3])] 5行目 [非連結(テキスト4)] [=DLookUp("shouhin","商品マスターT","code=" & [テキスト4])]  商品コードを入力すると商品マスターTより商品名を引っ張ってきます。 <テーブル "履歴T"> code2   shouhin2 ==============================  データは空です 上記のものがあるときに商品入力フォームで入力した行数分だけ テーブル履歴Tにレコード追加したいのですが・・・ そういったことは可能でしょうか?非連結フォームから複数レコード追加は難しいでしょうか? 以上宜しくお願いします。

  • アクセス DLookUpについて

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

  • Access Dlookup関数について

    Dlookupで悩んでいます。 ExcelのVlookと違い、“数字”のコードでなければ引っ張ってこれないのでしょうか? 以下、がその内容です。 「T_得意先マスタ」の得意先コードフィールドに aaa というコードがあり、得意先名フィールドに ○○商事 とあります。 どうやってもできないのです。 なぜか、aaa ではなく、数字(例. 123)にすると出ます。 教えてください。 Private Sub 得意先コード_AfterUpdate() Dim a As Variant, b As String b = "得意先コード = " & Me![得意先コード] a = DLookup("得意先名", "T_得意先マスタ", b) If IsNull(a) = True Then Me.テキスト1.Value = "該当がありません。": Me![得意先コード] = Null Else Me.テキスト1.Value = a End If End Sub

  • アクセス コンボボックスで全項目表示

    アクセス2000で発注書をつくっています 発注書フォームのサブフォーム「発注書sub」内で 「大項目」「中項目」「小項目」「商品コード」の 4つのコンボボックスを設置し、 絞込み検索で商品明細を入力しています 新規レコードに移動するときに 「大項目」「中項目」「小項目」の値を空白にし、 4つめの「商品コード」コンボボックスで 全商品を表示させたいのですが どう記述していいのかわかりません 現在は Private Sub 商品コード_AfterUpdate() Me.品番 = Me.商品コード.Column(1) Me.商品名 = Me.商品コード.Column(2) Me.色 = Me.商品コード.Column(3) Me.サイズ = Me.商品コード.Column(4) Me.商品単価 = Me.商品コード.Column(5) End Sub Private Sub 小項目_Enter() Me!商品コード.Requery End Sub Private Sub 大項目_AfterUpdate() Me!中項目.Requery End Sub Private Sub 中項目_AfterUpdate() Me!小項目.Requery End Sub Private Sub 小項目_AfterUpdate() Me!商品コード.Requery End Sub 'フォーカスが移ると同時にドロップダウンさせる Private Sub 大項目_GotFocus() Me.大項目.Dropdown End Sub Private Sub 中項目_GotFocus() Me.中項目.Dropdown End Sub Private Sub 小項目_GotFocus() Me.小項目.Dropdown End Sub 'テスト Private Sub 摘要_LostFocus() Me!大項目 = Null Me!中項目 = Null Me!小項目 = Null Me!商品コード.Requery End Sub です。 発注書フォーム(単票フォーム) レコードソース「発注書」 サブフォーム名「発注書sub」(帳票形式) レコードソース「発注書明細」 リンク親フィールド子フィールドともに「発注書コード」 (他に表記が必要なのがあるかもしれませんが。。) テーブル ●発注書明細 「明細コード」「発注書コード」「商品コード」「品番」「商品名」「色」「サイズ」「商品単価」「数量」「摘要」です ●商品マスタ 「商品コード」「品番」「種類」「大項目」「中項目」「色」「商品名」「サイズ」「商品単価」 です。 どなたか ご指導のほどよろしくお願いいたします

  • Access2000 DLookup関数の使い方

    色々試してみたのですがわからないので質問させていただきます。 フォーム/サブフォームを作っています。 サブフォームにある商品コード(コンボボックス)を入力すると、同じサブフォームにある単位、単価に商品台帳テーブルの値(単位、単価)を持ってくるようにしたつもりなのですが・・・。 商品コードの更新処理後に以下のコードを記述したのですが、うまく動きません(エラーは出ない)。 Me![単価] = DLookup("[単価]","商品台帳","[商品コード] = [Forms]![フォーム]![サブフォーム]![商品コード]") どこが悪いか教えていただけないでしょうか?

  • Accessでフォームからテーブルへ書き込む

    Access2000 (初心者) フォームからテーブルへ入力したいのですが、レコードソースが違う為入力出来ません。 DLookup("AA", "BB")で違うレコードから抽出出来る様に、違うレコードへ簡単に入力出来ないでしょうか? Me.CC = DLookup("AA", "BB") DLookup("AA", "BB") = Me.CC みたいに・・・