こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

accessのフォームで参照しながら入力

access初心者です。教えてください。
今、以下のようなテーブルがあるとします。
TBL_A
ID,名前,TEL,FAX
TBL_B
ID,顧客ID,年月日,メモ

新規でTBL_Bのデータを追加するときにリストボックスから顧客を選び、年月日とメモを入力するフォームを作成しています。
このときにリストボックスより選択後、年月日とメモを入力するテキストボックス等の横に該当顧客の直近(TBL_Bの該当顧客の年月日が最新のもの)のデータを表示したいです。
要するに前回のデータを見ながら入力したいです。
表示はテキストボックスでもラベルでもかまいません。
実際には項目数は20個程度あります。
VBAでもかまいません。どのような方法があるでしょうか?
教えて頂きたいです。

投稿日時 - 2013-08-06 13:26:29

QNo.8208232

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

各[顧客ID]の最新データを、「フォーム上で参照する」だけなら、
必ずしもVBAが必要であるとは限らないですよ。


「サブフォーム」という基本機能を使う方法です。
最初は「かなり面倒臭い」ですが、
実際に「手を動かして、頭を動かして」一緒に操作してみてくださいね。

・・とはいえ、お使いのバージョンがわかりませんし、
肝心の質問文中の説明も不十分なところもあります。
とりあえず、2003を例にとり、不足分は予想を含めて説明していきますので、
以降バージョンをお使いであれば、あるいは予想が間違っていたら、
それはご自身で適宜応用くださいませ。


さて。
まずは、クエリを作り、各[顧客ID]の[最新データ]を先に拾っておきます。
ここで不足に対する予想を一つ。
[TBL_A].[ID]フィールド=[TBL_B].[顧客ID]であると見て話が進みます。
クエリを新規作成し、
テーブルリストから[TBL_A]と[TBL_B]の二つを追加し、デザインビューに戻りましょう。
上記の予想より、[TBL_A].[ID]と[TBL_B].[顧客ID]の間にリレーションを作成、
結合プロパティを「'TBL_A'の全レコードと~~」にしてやりましょう。
コレに「集計クエリ」にし、
クエリのフィールドに[TBL_A]側の[ID]を追加、集計を「グループ化」、
更に[TBL_B]の[年月日]を追加、集計を「最大」にしてやります。
コレで完成。実行すると、各顧客IDに対する最新データ(最新年月日)だけを表示してくれます。
動作を確認したら、保存して閉じておきます(例えば「Q_最新データ」など)。

続いて、メインに使うフォームを準備します。
フォームを新規作成し、レコードソースを[TBL_B]にします。
[顧客ID]を除く入力フィールドを配置しましょう。

リストボックスを配置します。
念のため。リストボックスウィザードで
・テーブルまたはクエリの~~   次へ
・TBL_A を選択    次へ
・ID・名前を選択    次へ
・(好みで)キー列を~~ のチェックを外す    次へ
・IDを選択    次へ
・次のフィールドに保存 [顧客ID]    次へ
・リストボックスに名前を付けて、完了  (ここでは「顧客リスト」とします)
こんな感じで、リストボックスを作ってやりましょう。

さらに、フォームのプロパティから「データ入力用」=「はい」に設定してやると、
常に「新規データ入力」の状態にできますので、これも設定しておきます。
ここまでで一旦保存しておきましょう(名前は「F_メイン」としました)。

[F_メイン]をデザインビューで開いたまま、もう一つ、フォームを作成しましょう。
新規作成し、プロパティシートからレコードソースの右端の「...」をクリックします。
クエリビルダが動きますので、
[Q_最新データ][TBL_B]を追加し、デザインビューに戻ります。
[Q_最新データ]の[ID]と、[TBL_B]の[顧客ID]を、
[Q_最新データ]の[年月日の最大]と、[TBL_B]の[年月日]を、
上記2組にリレーションをそれぞれ設定しておきます。
クエリのフィールドに[TBL_B]の[ID]を追加、
[Q_最新データ]から、[ID]を追加、[年月日]を追加、
[TBL_B]の[メモ]を追加し、
[Q_最新データ]の[ID]フィールドに抽出条件として
    [forms]![F_メイン]![顧客リスト]
と指定しておきます。
クエリビルダを閉じ、デザインビューに戻ります。(保存してくださいね。)

好みのデザインでフォームを仕上げましょう。
ここは「適当」で良いです。見易く作ってくださいませ。
で、「F_サブ」と名前を付けて保存しておきます。

[F_メイン]に戻り、「サブフォーム」を配置します。
「ツールボックス」ツールバーの中に「サブフォーム」のスマートアイコンがありますので、
それをクリックして、フォーム上の任意の場所を選択すると、ウィザードが動きます。
ソースオブジェクトに「F_サブ」を選択して完了しておきましょう。
名前は「SF_最新データ」としました。

先ほどのリストボックスに、もう一手間加えます。
デザインビューで[顧客リスト]のリストボックスを選択、
プロパティシートのイベントタブから更新後処理の右端の「...」をクリック。
マクロビルダを選択してOK、マクロビルダを起動します。
まず、名前を決めます。適当で良いですが、ここでは「M_最新データ更新」としました。
マクロビルダが進みますので、アクションには「再クエリ」を選択。
下にコントロール名を聞いてくるボックスが出てくるので、
そこには先ほどの「サブフォーム」の名前、「SF_最新データ」を指定してやりましょう。
保存して、フォームに戻ります。


で、基本的な作業としては終了です。
テストして、動作を確認しておきましょう。
「リストボックスを選択したら、最新データの表示が更新される」状態なら成功。
仮にそうならなかったら、どこかの設定がうまくいっていない証拠ですので、
手順をよく見直してくださいませ。



上手く動いたら、あとはコレに肉を付けたり皮を付けたりして完成させてくださいませ。

投稿日時 - 2013-08-06 21:53:31

ANo.1

あなたがやりたいと思う処理を実現するための手順を書き出して、それをプログラムにまとめ、VBAプログラムとして入力することになると思います。
なお、そのやりたい処理全体で、いくつか共通する処理が見つかれば、関数等にまとめることで、プログラムは短くなりますし、見通しもよくなります。
「たったこれだけがやりたいのに、思った以上にコードを書かないといけないなあ」ということになるかもしれませんね。

投稿日時 - 2013-08-06 14:24:06

あなたにオススメの質問