質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

4899閲覧

Access サブフォームに条件指定したフォームを表示させたい

access

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2020/06/24 13:00

Access にて 以下のようなテーブルAをつくっています。

個人番号 姓   名
0001 田中  太郎
0002   鈴木  二郎
・   ・   ・
・   ・   ・

個人番号が主キーです。
個人番号を入力するフォームAを用意します。
入力された個人番号の姓名を、"フォームBのサブフォーム" に表示させたいのです。
vbaでもマクロでも構いません。

フォームBはただ表示させるだけのフォームです。

フォームBの中のサブフォームのソースオブジェクトは、フォームCとして用意しており、
フォームCのレコードソースを以下の通り設定しております。

Dim strSQL as string

strSQL = "select * from テーブルA where 個人番号 ='" & kojin_code & "';" 'kojin_codeはフォームAから受け取った値が入ってます
DoCmd.OpenForm "フォームC"
Forms!フォームC.RecordSource = strSQL

そして、フォームBの中のサブフォーム のソースオブジェクトには
Forms!フォームB.サブフォーム.SourceObject = "フォーム.フォームC"

と設定しました。

ところが、サブフォームには何も表示されません。
途中に
Docmd.openform "フォームC"
を入れて、strSQLで正しく抽出できているか確認したところ、きちんと抽出されていました。

どうすれば、サブフォームに表示できるでしょうか。
access触って1週間程度で知識がなく、質問がややこしくなり申し訳ありません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/06/24 13:08 編集

フォームCのレコードソースを設定するタイミングはいつ(何のイベント)行っていますか?
access

2020/06/24 14:05

読んで頂き有難うございます。 >>フォームCのレコードソースを設定するタイミングはいつ(何のイベント)行っていますか? フォームBを読み込み時です。
guest

回答2

0

ベストアンサー

わかりにくいから
フォームA(個人番号を入力するテキストボックス?がある)
フォームB(中にサブフォーム、コントロール名「サブフォーム」の『SourceObject="フォームC"』)
があるってことでOK?

まずフォームBのコントロールである「サブフォーム」内のフォームCは
Forms!フォームCではありません。全く関係がない別物で

vba

1DoCmd.OpenForm "フォームC" 2Forms!フォームC.RecordSource = strSQL

としようとも無意味です。

vba

1Forms!フォームB.サブフォーム.Form.RecordSource = strSQL

として入れないことには変更したことになりません。

投稿2020/06/24 13:40

sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

access

2020/06/24 14:07

有難うございます。 >>わかりにくいから フォームA(個人番号を入力するテキストボックス?がある) フォームB(中にサブフォーム、コントロール名「サブフォーム」の『SourceObject="フォームC"』) があるってことでOK? その通りです! >>Forms!フォームB.サブフォーム.Form.RecordSource = strSQL こういう書き方だったのですか! もう帰宅してしまったのですが、必ず明日試してみます。 有難うございます。
access

2020/06/25 07:50

有難うございます。おっしゃる通り Forms!フォームB.サブフォーム.Form.RecordSource = strSQL このコードでうまくいきました。本当に助かりました。 追加の疑問で恐縮なのですが、フォームBをデザインビューで開き、サブフォームのプロパティ - データをみても ソースオブジェクトというプロパティはありますが、レコードソースというプロパティはありませんでした。 どういうことなのでしょうか・・・ Forms!フォームB.サブフォーム.Form.RecordSource とはAccess上のどこを指しているのでしょか。
sousuke

2020/06/25 08:40

サブフォームのSourceObjectに指定されている『フォームC』のRecordSourceです。 「Access上の」というとややこしい… 「Forms!フォームB.サブフォーム.Form」とかくとサブフォームコントロールに指定されている ソースオブジェクトである『フォームC』を指すことになります。だだし 「Forms!フォームC」というわけではありません。 とにかくサブフォームとして開かれたフォームB内の『フォームC』は Docmd.OpenForm "フォームC"で開いた『フォームC』とは別ものなのです。 デザインビューはもちろん共通していますが別物として実体化しています。 今は『フォームB内のサブフォームにあるフォームC』のレコードソースを変更したいので 「Forms!フォームB.サブフォーム.Form.RecordSource」 こう書いてプロパティにアクセスしている、ただそれだけです。 フォームCのプロパティで「コード保持」を「はい」にすれば Dim frmC as Form_フォームC Set frmC = Forms!フォームB.サブフォーム.Form frmC.RecordSource = strSQL こんな感じで記述できます。 frmC.(ドット)と打てばインテリセンスでフォームCに配置したコントロールも表示されます。
access

2020/06/27 02:50

>>とにかくサブフォームとして開かれたフォームB内の『フォームC』は Docmd.OpenForm "フォームC"で開いた『フォームC』とは別ものなのです。 >>Dim frmC as Form_フォームC Set frmC = Forms!フォームB.サブフォーム.Form frmC.RecordSource = strSQL そういうことだったのですか。 表現が合ってるか分かりませんが、インスタンスのような扱い方でしょうか。本当に困っていたことが解決できて助かりました。 有難うございます。
sousuke

2020/06/27 03:30 編集

インスタンスという認識でほぼ間違いないです。コード上でマルチインスタンス化もできて Private c1 as Form_フォームC Private c2 as Form_フォームC みたいに宣言して set c1 = New Form_フォームC set c2 = New Form_フォームC c1.Visible = True c2.Visible = True みたい別の変数で受ければ同じフォームでも複数開くことができます。 set c1 = Nothingで閉じるというか落とせます。 Docmd.OpenFormとかは糖衣構文みたいな感じですね。 ただForms![フォームC]とかいう指定方法はどう見ても複数前提でないので マルチインスタンス使うならあらかじめ配慮してコードとかクエリ書かないといけませんね。 ちなみにフォームBの読み込み時に「フォームBのサブフォーム」を見る場合は 「Forms!フォームB」は「Me」と等価なので Me.サブフォーム.Form.RecordSource = strSQL こんな感じでいいですよ。
access

2020/06/27 12:40

>>インスタンスという認識でほぼ間違いないです。コード上でマルチインスタンス化もできて Private c1 as Form_フォームC Private c2 as Form_フォームC みたいに宣言して set c1 = New Form_フォームC set c2 = New Form_フォームC c1.Visible = True c2.Visible = True みたい別の変数で受ければ同じフォームでも複数開くことができます。 set c1 = Nothingで閉じるというか落とせます。 そんなこともできるのですね。マルチインスタンスというのですか。 まだ使用する予定はないですが、勉強になります。 >>ちなみにフォームBの読み込み時に「フォームBのサブフォーム」を見る場合は 「Forms!フォームB」は「Me」と等価なので Me.サブフォーム.Form.RecordSource = strSQL これは最近覚えて多用してます。有難うございます。
guest

0

フォームB(サブフォームとしてフォームC)でフォームAを開き、入力された個人番号でフォームBのサブフォームがリフレッシュされる
というイメージでしょうか。

であるなら、フォームAでフォームCを開くのではなくフォームBをリフレッシュしないと駄目です。

Docmd.openform "フォームC"
ではなく、
Forms("フォームB").Requery
としてみて下さい。※(ただしフォームBは開いている前提です)

ただ、個人番号の入力をフォームBで行い、サブフォームのリンクフィールドに設定すれば、フォームAやコードは不要です。

投稿2020/06/24 13:21

編集2020/06/24 13:39
sazi

総合スコア25184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

access

2020/06/24 13:30

こんなややこしい文章を読んで下さり本当に有難うございます。 フォームAで入力した個人番号を元に、フォームBのサブフォームに姓名を出力するイメージです。 フォームAは個人番号を入力してOKボタンを押すと消えて、フォームBが表示されるようにしています。入力された個人番号は、kojin_codeとしてpublic変数として渡しています。 strSQLの kojin_code をテーブルAに実在する個人番号に置き換えたところ、フォームBのサブフォームに正しく表示されました。
sazi

2020/06/24 13:40

えーと、入力する個人番号が間違っていただけという事ですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問