• ベストアンサー

ACCESSでデーフル作成入力フォームで入力しながら、クエリのデータを参照したい

ACCESSで売上明細テーブルを作成し、入力用のフォームを作成しました。他に顧客マスタテーブルがあります。売上明細には顧客CDフィールドがありますが、顧客名等はマスターに存在するため設けてません。しかし売上明細入力時に顧客CDを入力した時点で顧客名の確認がしたいのです。そこで入力フォームの顧客CDの隣に非連結でテキストボックスを作り、そこに顧客名を表示したいのです。売上明細には顧客名のフィールドは追加したくありません。ただ参照したいだけです。顧客マスタと売上明細で顧客CDをキーにクエリを作成し、明細に対応する顧客情報は顧客情報検索というクエリで作成済みです。入力フォーム画面の非連結のフィールドのプロパティのコントロールソースに =DLookup("[顧客名]","顧客情報検索","[顧客CD] =" _ & Forms![売上明細入力Form]![顧客CD]) と表記しましたがエラーになります。 最初はコントロールソースに直接顧客情報検索クエリの顧客名フィールドを表記し、フォーカス取得時にクエリを開くマクロを実行していました。でもやはり表示されませんでした。 顧客名の設定をどのように設定すればいいのですか? コントロールソースでの設定だけでは無理なのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.4

ご質問の件では、アンダーバー「_」は無用です。 (VBAの編集画面上であれば、一群の文字列の改行表示のために使用することもありますが、  コントロールソースへの直接記述には使用できません) 従って、以下のようにすれば、とりあえず今現在起きているエラーは解消するかと思います: 現在: =DLookup("[顧客名]","顧客情報検索","[顧客CD] =" _ & Forms![売上明細入力Form]![顧客CD]) 修正後: =DLookup("[顧客名]","顧客情報検索","[顧客CD] =" & Forms![売上明細入力Form]![顧客CD]) または: =DLookup("[顧客名]","顧客情報検索","[顧客CD] =" & [顧客CD]) *「顧客情報検索」がフォームのレコードソースで、もしも「顧客マスタ」に相当するテーブルがあるの  でしたら、ここの式にはそちらを使用した方がよいはずです。 なお、もしも「顧客CD」のデータが数値型ではなくテキスト型などの場合は、 =DLookup("[顧客名]","顧客情報検索","[顧客CD] ='" & [顧客CD] & "'") のように、Where条件式の右辺がシングルクォーテーションで括られるようにする必要があります。 ※演算コントロール(=コントロールソースが関数のコントロール)で誤作動というのは、私には経験が   ありません。   但し、VBAでは、「Me」で、コードを記述しているフォームそのものを参照することができますが、   コントロールソースなど、プロパティシートに直接記述する関数では「Me」は使用できない、   といった制限はあります。   ------------------------------------ なお、演算コントロールでは、検索や並べ替えができないといった制約があります。 同じDLookupを使うのであれば、フォームではなくクエリで演算フィールドを作成してコントロール ソースとして使用した方が、検索・並べ替えが行えるので使い勝手はよいと思います。 (「売上明細には顧客名のフィールドは追加したくありません」とのことですが、テーブルではなく  クエリのみへのフィールド追加なので、問題ないのではないかと) 演算フィールドは、クエリのデザインビューの「フィールド:」欄に、 顧客: DLookup("[顧客名]","顧客マスタ","[顧客CD]=[顧客マスタ]![顧客CD]") といったように入力します(「テーブル:」欄は空白のまま)。 *上記の式は、「顧客情報検索」がクエリで、「顧客CD」フィールドが「顧客マスタ」テーブルの  「顧客CD」フィールドに拠っている、という前提で作成しました。

viva123
質問者

お礼

毎度的確な回答をありがとうございます!DexMachinaさんを師匠と呼びたいくらいです!VBAで_(アンダーバー)は改行するときに使用するといったことはEXCELのVBAで実際使っていました。ACCESSって別物のような感があって、これはACCESSのHELPで参照したものをそのまま使ってしまいました。少し考えるとわかりそうなのに・・・単純なことですみません。それからクエリで演算フィールドを作成してみます。本当に細かなところまで説明とてもありがたいです!

その他の回答 (4)

noname#140971
noname#140971
回答No.5

お詫びと訂正: あたかもレコードセットでは関数を利用できないかの回答をキャンセルします。 これは、よくよく考えれば、正しくないです。 10年前のごくごく一部のバージョンのバグが根拠でしかないのですから。 クエリに関数を仕組むとフリーズするというのも今や昔のことかも知れません。 「VBAで書かないと何が起きてもおかしくない」-これは、もはや謬論かも知れません。 訂正しておきます。

viva123
質問者

お礼

わざわざ訂正までしていただいて恐縮します!重ねて感謝いたします!!

noname#140971
noname#140971
回答No.3

補足: コントロールソースに関数を使うとバージョンでは誤動作することが確認されています。 私は、そういうことで、敢えて、VBA で記述しています。

noname#140971
noname#140971
回答No.2

<得意先マスター> ID___顧客名 1____鈴木 一郎 2____中村 主水 <売上明細> ID___伝票番号___得意先マスター_ID 1____101________1 2____102________2 こういうテーブル構造を仮定します。 当然にフォーム<売上明細>には非連結の[得意先名]を配置して確認。 この場合は、質問者が予定しているように DLookup関数を使います。 が、それは VBA にてです。 Private Sub Form_Current()   Me.顧客名 = DLookup("顧客名", "得意先マスター", "ID=" & Me.得意先マスター_ID) End Sub Private Sub 得意先マスター_ID_AfterUpdate(Cancel As Integer)   Me.顧客名 = DLookup("顧客名", "得意先マスター", "ID=" & Me.得意先マスター_ID) End Sub コントロールソースには含まれていないので、これは当然のこと。 また、Form_Current()と得意先マスター_ID_AfterUpdate()の両方に[顧客名]更新のコードを書くのも当然。 さて、問題は、ここで使っている DLookup関数が実にトロイ。 1クッションを置いて表示が更新されるので実に始末に悪いです。 そこで、ここは代行関数を自作するということになります。 次の DBLookup関数を利用すると DLookup関数の難点も解消されると思います。 Public Function DBLookup(ByVal strField As String, _              ByVal strTable As String, _              Optional ByVal strWhere As String = "", _              Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup    Dim DataValue    Dim strQuerySQL As String    Dim rst     As ADODB.Recordset    Set rst = New ADODB.Recordset    strQuerySQL = "SELECT " & strField & " FROM " & strTable    If Len(strWhere) > 0 Then      strQuerySQL = strQuerySQL & " WHERE " & strWhere    End If    With rst           .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then        .MoveFirst        DataValue = .Fields(0)      End If    End With Exit_DBLookup: On Error Resume Next    rst.Close    Set rst = Nothing    DBLookup = Nz(DataValue, ReturnValue)    Exit Function Err_DBLookup:    MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"    Resume Exit_DBLookup End Function

viva123
質問者

お礼

ご丁寧な回答ありがとうございます。VBAをこれから学習したいと思っていて、参考書を読み始めているところです!なので今はできる限りマクロやクエリーのみで処理しようとしていました。でもこれからやっていく上でとても参考になりました!本当にありがとうございました!

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

いろんな方法がありますがDLookupは一番まずい方法ですね 一番簡単なのはフォームのソースを両テーブルを結合したクエリにすることです これで顧客マスタの全フィールドを確認することができます ただし、顧客マスタのフィールドには編集ロックを書けておかないと このフォームからいじれてしまいます 他には顧客CDをコンボから選ぶようにする方法です 顧客CD以外の値はこんぼのColumnプロパティーで求められます

viva123
質問者

お礼

回答ありがとうございます!Dlookupはまずいのですか・・・でもこの方法だと本当に簡単ですね!編集ロックをかけるといいのですよね!ありがとうございます!

関連するQ&A

  • access フォーム間で情報が引き継がれない

    初心者です、よろしくお願いします。 仕様環境 WinXP Access2002 請求管理のシステムを作っています。 テーブルには 顧客マスタ(主キーは顧客番号でテキスト型 例:0001等) 請求マスタ(主キーは請求番号でテキスト型 例:A0001等) 明細マスタ(主キーは明細番号でオートナンバー ダミーみたいな感じで使っています。) そしてリレーションシップで顧客マスタ(1)→(多)請求マスタ(1)→(多)明細マスタになっています。 顧客マスタを元にしたフォーム(顧客入力フォーム)に顧客情報を入れて、 「請求書作成ボタン」を作り、そのボタンを押すと別のフォーム(請求書作成フォーム)に 飛ぶようにしているのですが、その際に顧客入力フォームに入力した情報を 引っ張っていくようにしたいのですが、うまくいきません。 ちなみに顧客マスタと請求マスタのリレーションは”顧客番号”でつなげています。 請求書作成フォームは請求書作成クエリから成り、 その中で顧客番号(テーブル:顧客マスタ)の抽出条件に[Forms]![顧客入力フォーム]![顧客番号]と 入れて”顧客番号つながり”で飛ぶようにしているのですが、 請求書作成フォームは開くのですけど、項目はすべて空白です。 またいろいろレコードを追加している内に、請求番号が既にあるものに対しては顧客情報も引き継がれることが判明しました。 構文が間違っているのでしょうか? 混乱しています、お助けください。

  • Access2000 フォームでのデータ入力について

    質問させていただきます。 Access2000で、あるフォームを作りました(帳票フォーム)。フォームの基になるレコードソースはクエリーです。このクエリーは原料伝票テーブルから在庫数が特定の数量を下回った原料を抽出しています。 フォームは以下イメージです。 原料コード 原料名  在庫数  発注数 原料コード~在庫数をクエリーから、発注数を手入力 にしました(発注数のコントロールソースは非連結です)。 で・・・発注数に値を入力すると全部の行が同じ値になってしまします。これを改善したいのですが・・・。 このやり方は根本的に間違っているのでしょうか?

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

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

  • ACCESSで複数条件でデータ抽出するフォームの作成

    ACCESS2000で複数の条件を入力し、該当するデータを抽出するフォームを作成しています。どんな方法がありますか?簡単に出来る方法をお教えください。 具体的には、売上明細データを検索します。あらかじめ テーブル:売上明細データ をいろいろなマスタを参照している クエリ:売上明細クエリ を元に抽出します 条件は売上日付の日付1と日付2の項目と、伝票区分の項目です。 フォームの頭にテキストボックスを3つ作成し、日付1~日付2までの売上日付で 入力された伝票区分のもののみを表示させたいのです。 検索というコンボボタンを配置し、クリック時にその下にクエリからの必要な表示項目を売上明細クエリから配置しています。 抽出する方法(条件の与え方)を教えてください。よろしくお願いいたします。

  • access クエリ 検索フォームの作り方

    よろしくお願いします。 やりたいこと: フォーム上で、テキストボックスに入力した値を検索して表示したい。 本やウェブで調べて、なんとか一度はやっと出来たのですが、 誤って何かを変更してしまい、使えなくなってしまいました。 今となってはどの資料を見て作れたのかわからなくなりました。 やったこと: クエリ :クエリA   条件にforms!フォームA!txt0を入力 フォーム:フォームA ヘッダーに非連結のテキストボックスtxt0を作成 txt0の更新後処理:docmd.requeryを入力 しかし、txt0に入力しても検索されません。 フォームのプロパティのレコードソース欄にクエリAを選択するようですが、 選択するクエリ名が表示されないので、クエリ名を入力しましたがダメでした。 どこか間違っているのでしょうか。VBAまでは勉強できないので上記範囲内でお願いします!

  • ACCESSでクエリ作成時複数のフィールドを同じマスタ項目から抽出する方法

    ACCESSでクエリを作成しています。テーブルは”売上明細”と”社員マスタ”があります。売上明細には”担当者CD”と”加工者CD”というフィールドがあって、それぞれのフィールドが、同じ社員マスタの”社員CD”をキーに”社員名”を抽出したいのですが、「あいまいな外部結合が含まれているので、SQLステートメントを実行できません。第一次結合を実行する分割クエリを作成し、SQLステートメントにそのクエリを含めてください」とメッセージが出ます。どこにどのように設定すればいいのでしょうか?優先順位は特にありませんが、最初に設定されている担当者CDを第一次結合とする場合どうすればいいのでしょうか?この第一次・第二次はどのような意味があるのでしょうか?まだVBAは手付かずで、初心者です!これから学習しようとしているところです。よろしくお願いいたします。

  • Accessデータ並べ替えをハイブリッドにしたい

    [使用しているツール] Access 2007 PROFFESSONAL [やっていること(現状)] 1つのテーブルで複数のクエリ(複数のフィールドの並べ替えが必要な為)と複数(クエリと同数)のフォームを作成して、フォームの数だけコマンドボタンを作成してフォームを一覧表示で開いています。 [やりたいこと] 1つのテーブルで「1つのクエリ」による複数のフィールド(名)を切替えて、「1つのフォーム」で表示(一覧)させたいと思っています。 例えば、テーブル名:顧客名簿(取引先、県名、商品名、入庫日)、クエリ名:顧客名簿クエリ、フォーム名:顧客名簿一覧としたとき、(取引先、県名、商品名、入庫日)をコンボボックス等で切り替えることで、指定したフィールド(名)で並び替えられたデータを「フォーム名:顧客名簿一覧」に表示させられないでしょう。 [考えたこと] コンボボックス(名前:コンボ1)を作成し値集合ソースに「”取引先”;”県名”・・・・。」と入力、クエリ「顧客名簿クエリ」の抽出条件欄にビルダを起動させて「・・・コンボ1」を指定、フォーム「顧客名簿一覧」のレコードソースにクエリ「顧客名簿クエリ」を選択しました。しかし、フォーム「顧客名簿一覧」を開いても、データは抽出できずデータなしの表示で先へ進めていません。 以上ですが、宜しくお願いします。

  • Accessのフォームにて

    Accessの配達管理のフォーム(表形式、ある条件にて抽出済み)にて ●日付 ●顧客ID  ・  ・ ●配達者CD 上記のフィールドがあるとします。 このフォームのヘッダー部分に非連結のテキストボックスA、Bを作成し、 テキストボックスAに配達者CDを入力すると、 テキストボックスBに配達者名が表示される。 フッター部分に「印刷」ボタンを作成し、これをクリックすると、 フォーム一覧の配達者CDにヘッダー部分のテキストボックスAの 配達者CDが入力されるというシステムを作りたいのですが、 テキストボックスAの配達者CDを参照させて、テキストボックスBに 配達者名を表示させるというのがうまくいきません。 テーブルにて、配達者マスタ ●配達者CD ●配達者名 は、作成しています。 よろしくお願いいたします。

  • access 入力フォームにクエリを表示させたい

    ある物件を管理しています。 T_物件情報 物件ID(オートコレクト)/物件名 T_水道検針 検針No(オートコレクト)/物件ID/検針日 T_検針明細 明細No(オートコレクト)/検針No/部屋番号/検針値 このようなテーブルがあり、F_水道検針で入力できるフォームを作りました。 T_検針明細はサブフォームになっています。 入力の際の見た目として、前回の検針値、使用量(今回から前回を引いたもの)を表示させたいと思っています。 一応クエリで前回の検針値を出すものQ_前回検針値を作りました。 それぞれ対応するものにリレーションを設定しています。 抽出条件として 物件ID [forms]![F_水道検針]![cmb物件ID] 前回検針日 [forms]![F_水道検針]![前回検針日] ←フォーム上で非連結テキストボックスです 部屋番号 [forms]![F_水道検針]![部屋番号] を設定しています。 サブフォーム上に非連結テキストボックスを2つ設置し、先ほど書きました前回の検針値、使用量を表示できればと思っています。フォーム自体のコントロールソースがT_水道検針、T_検針明細ですのでクエリをソースには持ってこれないですよね。どうすれば表示できるのかご教授いただければと思います。 とりあえずこのフォームを入力する際には見た目だけわかればいいので、このような質問をさせていただきました。 VBAは始めたばかりで参考書をみながらひとつずつやっている状況です。 マクロについても同じです。 また、後々請求書で計算をすることを考えるとテーブルの構築などから見直したほうがいいのかもしれません。 もっとよりよい方法がありましたらそれでもいいので宜しくお願い致します

  • Accessについて。フォームでデータ入力

    超基本的な質問ですみません。 仮に下記のような構造のデータベースがあったとします。 テーブル 都道府県名 フィールド 都道府県 テーブル 住所    フィールド 都道府県 市町村 テーブル 顧客    フィールド 都道府県 市町村 顧客にデータを入れていくために"顧客情報入力"というフォームを作ります。 "都道府県"をコンボボックスで選択しました。 市町村のコンボボックスに上の"都道府県"で選択した都道府県の"市町村"だけを表示させるためにはどうしたら良いのでしょうか。 クエリについてはある程度理解していたつもりなのですが、頭が真っ白になってしまいました。