• ベストアンサー

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が使えない環境に行きます。)