Microsoft Access 掲示板

他のフォームに値代入後更新させたい

6 コメント
views
4 フォロー

初級レベルの者です。フォームAはメイン・サブの構成になっておりサブに配置のコンボボックス絞り込みをメインの非連結テキストボックスに含まれている文字列をLikeで抽出させています。そのフォームに特定の選択(オプションボタン)をするとフォームB(リスト型)が開き、リストから選ぶとフォームAの非連結テキストボックスに所定の文字列を代入させています。代入はすることまでは出来ているのですがサブのコンボボックス絞り込みには反映できていません(更新されていない)。
フォーカスセットをしておくと更新するとネット情報で見たので下記にコード記述しております(フォームBに)
[Forms]![フォームAMain]![txボックス].SetFocus
[Forms]![フォームAMain]![txボックス] = "所定文字列"
 DoCmd.Close acForm, "フォームB"

別フォームからだと何か不足しているのでしょうか?

KiKi
作成: 2024/02/01 (木) 11:59:24
通報 ...
1
hiroton 2024/02/01 (木) 13:56:37 59551@f966d

そもそも

コンボボックス絞り込みをメインの非連結テキストボックスに含まれている文字列をLikeで抽出させています。

を、具体的にどのように行っていますか?

コンボボックスはそのコントロールソースに従って表示内容が決定されますが、もう少し具体的には、コントロールソースの内容を読み込むタイミングで決定されます。

そのタイミングの一つは、もちろん、「フォームを開いたとき」です。このタイミングでは特に気にすることなく自動で行われます。逆に言えば、通常これで十分なので、その他のタイミングで更新したい場合は「コントロールソースの読み込み直し処理」を自前で組まなければなりません

なので、上記指摘が「できている」のであれば「同じようにやればいい」です


フォーカスセットをしておくと更新するとネット情報で見た

こんな仕様はhirotonは知らないですね
(今回組んだシステムは)フォーカスセットをしておくと更新する(ように作ったのでフォーカスをセットすればいい)とかなら作れるかもしれません。(よくあると思います)
ならば、重要なのは、フォーカスをセットする方法ではなく、その時にどのような処理が行われるか?の方です。そこに「コントロールソースの読み込み直し処理」があると思います

2
hatena 2024/02/01 (木) 14:02:14 修正

フォーカスセットをしておくと更新するとネット情報で見たので下記にコード記述しております

正確には、フォーカスをセットしておいて、Textプロパティに代入すると、更新イベントが発生します。

 [Forms]![フォームAMain]![txボックス].SetFocus
 [Forms]![フォームAMain]![txボックス].Text = "所定文字列"
 DoCmd.Close acForm, "フォームB"

下記もご参考に。

値の代入で更新イベントを発生させる - hatena chips


ただし、hirotonさんも指摘されているように、コンボボックスのリストの絞り込みをどのようにしているかによります。
サブフォームが帳票フォームだったりするとさらに複雑な要因がでてきます。

上記の方法でうまくいけばいいですが、そうではない場合は、
絞り込みをどのようにしているのかと、コンボボックスは連結なのか、非連結なのか、サブフォームが帳票フォームなのか、、、などの情報が必要になります。

3
勉強中の男 2024/02/01 (木) 14:59:51 ddfe5@72804

色々と説明不足してました(すみません)。フォームAのサブフォームにあるコンボボックスの値集合ソースに Like "" & [Forms]![フォームAメイン]![tx文字] & "" としており絞り込みさせています。
フォームBが開かない場合には[tx文字]の更新後イベントに [サブフォーム].Form![コンボ].Requeryとしています。
要はこのRequeryをさせたいのです(フォームBからVBコードでフォームAメインの[tx文字]に代入)。

4
hiroton 2024/02/01 (木) 17:09:54 59551@f966d

悩ましいですねぇ

>> 2のhatenaさん提示の方法でいいと思いますが、個人的にはあまりSetFocusを使いたくないので別解も載せておきます

ACCESS VBA 別フォームのイベントを呼び出す方法(VBAコード公開)(たすけてACCESSさん)

(デフォルトで生成されるあれこれを弄るといろいろと混乱するので、publicなそれ用のプロシージャを作るというのが、「hirotonならこうする」ですかね)


要はこのRequeryをさせたい

の観点からなら

Froms!フォームAメイン.Form!サブフォーム.Form!コンボ.Requery

という方法もあります。が、プログラミング的な観点から同じ処理を別々な場所に記述するのは良くないので、今回の形なら「[tx文字]の更新後イベント」を発生させる方向が良いのでは、と思います


その他の方法として、「コンボボックスのリストが表示されるのはコンボボックスを使うとき」なので、コンボボックスのフォーカス取得時イベントでMe!コンボ.Requeryを行うなんて手法もあります

5
勉強中の男 2024/02/02 (金) 09:36:40 ddfe5@72804

色々ありがとうございます。大変参考になりました。シンプルにサブフォームのコンボボックスに”Me!コンボ.Requery”でしまして上手くいきました。
参考にまで教えて欲しいのですが、この場合のフォーカスイベントは取得時の方がいいのでしょうか?取得後でも同じでしょうか? これの使い分けがよく分かってないもので。

6

今回の場合はどちらでもいいでしょう。

例えば、特定の条件の場合はフォーカスさせずに別のコントロールにフォーカスさせたいというような場合は、取得時でないとだめですね。ただ、このような設計はたいてい悪手ですね。

特定の条件を満たすまで使用不可にしておくとか、、、ほかの方法を検討した方かいいです。