- ベストアンサー
Accessのフォームについて
Accessで、テーブルへのデータ入力を簡易化するための、フォームを作成しています その中で、コンボボックスのなかから項目を入力したら 別に用意されているテーブルから 一致する項目をテキストボックスに 自動的に値を入力できるようにしたいのですが、 どのようにしたらいいのか、わかりません。 ~フォームに入力する項目~ 氏名、年齢、地区(コンボボックス)、地区コード、地区番号、住所、電話番号 等 ~地区テーブル~ 地区コード、地区、地区番号 調べてみたところ、プロパティのコントロールソースというところで、 値を持ってくるための式を作成するということでしたが・・・ 実践してみたのですが、初心者ゆえ、あまりよく理解できませんでした どうかよろしく御願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
地区(コンボボックス)の作成の時に ・元のテーブルは地区テーブルを指定 コンボボックスの表示項目を 3つ指定 (地区、地区コード、地区番号) とします 地区(コンボボックス)のプロパティの中で 更新前処理のところにて イベントプロシジァーを 選択して 右端の ... をクリック 開いたボックスのなかへ Me![TX1] = Me![CB1].Column(1) Me![TX2] = Me![CB1].Column(2) と入力する Me![CB1].Column(1) とは CB1 項目 のなかの 2番目の項目 という意味です (この場合は地区コンボボックスの 2番目の項目*地区コードということになります) CB1 TX1 TX2 は 地区、地区コード 地区番号 のフォームでの 名前です(どんな名前でもいいですが) 各項目のプロパティにおいて1番上に出ている名前です 別の方法としては VBAの DLOOKUP関数を 使用する方法もあります (イベントプロシジァー内にこの命令を入れる)
その他の回答 (4)
- CHRONOS_0
- ベストアンサー率54% (457/838)
>~地区テーブル~ >地区コード、地区、地区番号 こういうテーブルがあるとき、他のテーブルでこのテーブルの値を参照したいときには 地区コードだけを参照キーとして取り込みます その他のフィールドを取り込んではいけません これはリレーショナルデータベースの約束事です 詳しくは参考書で正規化について勉強してください ということで、 やりたいと言っておられることはやってはいけないことです というのが回答になります P.S. 年齢のような日々変わるものもテーブルに格納するのはお勧めできません 一度入力すれば変わることのない生年月日にしましょう
お礼
ご回答有難うございました。
補足: ADO関数でなく DLookup() を使う場合は、NO2さんのカラム情報取得がお勧めです。 Private Sub Form_Current() 地区_ID_AfterUpdate End Sub Private Sub 地区_ID_AfterUpdate() If Len(Me.地区_ID & "") Then Me.地区名 = Me.地区_ID.Column(2) Me.地区番号 = Me.地区_ID.Column(3) End If End Sub
色々と聞きたいことと言いたいことがあります。 そのやり取りを省くために、一つのサンプルを示して回答に代えます。 地区マスター: ID__地区コード__地区名__地区番号 01__E101________東地区_____10101 02__W101________西地区_____20101 顧客名簿: ID__氏名_______年齢__地区_ID__住所______電話番号 01__鈴木 一郎____40________1__東京下町__1111-11-1111 02__中村 主水____50________2__大阪下町__2222-22-2222 ここでは、[地区マスター].[地区コード]の訂正を考慮して[ID]-[地区_ID]で連結しています。 顧客名簿_クエリ: 顧客名簿.ID__氏名_______年齢_地区コード_地区名_地区番号_住所_____電話番号 __________1__鈴木 一郎____40_E101_______東地区____10101_東京下町_1111-11-1111 __________2__中村 主水____50_W101_______西地区____20101_大阪下町__2222-22-2222 SELECT 顧客名簿.ID, 顧客名簿.氏名, 顧客名簿.年齢, 地区マスター.地区コード, 地区マスター.地区名, 地区マスター.地区番号, 顧客名簿.住所, 顧客名簿.電話番号 FROM 顧客名簿 LEFT JOIN 地区マスター ON 顧客名簿.地区_ID = 地区マスター.ID; このように、地区コード、地区名、地区番号は容易に参照することが出来ます。 ですから、フォーム[顧客名簿]では[地区_ID]をコンボボックスで選択すれば事足ります。 <準備> テーブル[顧客名簿].[地区_ID]のルックアップを設定します。 値集合ソース=SELECT * FROM 地区マスター; 連結列=1 列数=4 列幅=0cm;3cm;3cm;3cm <フォーム[顧客名簿]作成> 準備が終れば、フォーム[顧客名簿]作成します。 ID_________[_1] 氏名_______[鈴木 一郎] 年齢_______[40] 地区_ID____[E101_________] <--- コンボボックス 住所_______[東京下町_______] 電話番号___[1111-11-1111] ですから、[地区_ID]を入力するコンボボックスは自動作成されます。 <地区名、地区番号を参照するテキストボックスの作成要領> ・非連結テキストボックス[地区名]、[地区番号]を配置。 ・プロパティ[使用可能]=いいえ <---- 参照するだけだから! ・プロパティ[ロック]=はい <---- 参照するだけだから! ・表示コードを書く。 Private Sub Form_Current() 地区_ID_AfterUpdate End Sub Private Sub 地区_ID_AfterUpdate() Dim lngID As Long If Len(Me.地区_ID & "") Then lngID = Me.地区_ID.Value Me.地区名 = DBLookup("地区名", "地区マスター", "ID=" & lngID) Me.地区番号 = DBLookup("地区番号", "地区マスター", "ID=" & lngID) End If End Sub ここでは、Access の DLookup() ではなく3倍速で処理する ADO関数 DBLookup() を使っています。 この関数は、自作する以外にはありません。 そういうことで、一般には DLookup関数を利用されたらいいです。
お礼
ご回答有難うございました。 今回は、二件目にご回答いただいたかたの方法で 解決することが出来ましたが、 Husky2007さんから投稿いただいた方法につきましても ひきつづき勉強をし、 今後に生かせればと思います。 丁寧なご回答有難うございました。
- htmcr
- ベストアンサー率36% (11/30)
こんにちは。 どのページを参考にして 具体的にどのような値を試してみたのか教えてください。
お礼
ご回答有難うございます。 二件目にご回答いただいた方の方法で解決いたしました。 参考ページは、Access初心者向けのサイトでした
お礼
ご回答ありがとうございました。 教えてくださった方法で試してみたところ、 おかげさまで解決いたしました。 また、同じ処理でも複数個の方法があることを 勉強いたしました。 今後とも、Accessについて勉強を重ねていきたいです。 今回は、本当にありがとうございました。