• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Access 別フォームへの再クエリ(更新)がしたい。)

別フォームから別フォームへの再クエリ(更新)の方法とは?

このQ&Aのポイント
  • WinVISTAのAccess2007環境で、別フォームから別フォームへの再クエリの方法を教えてください。
  • メインフォームに反映されないまま別フォームでのデータ入力が行われる場合、別フォームに再クエリをかけるとフォームが更新されますが、メインフォームは変化しません。
  • 別フォームのOKボタンを押すと、別フォームが閉じると同時にメインフォームが再クエリされるようにしたいです。

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

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

連投すみません。 ・・というか、私も「削除されました」というのを見て一旦中止してました。 (中止した場合も含めて、回答はメモ帳で保存しているので無事でしたが) > どうしたら別フォームから後ろのメインフォームを再クエリ(更新)できるのでしょうか? マクロの場合は、「オブジェクトの選択」アクションで対象フォームを選択した後、 「再クエリ」アクションを行えばOkです。 なお、「作成画面」フォームも連結フォーム(レコードソースが指定されたフォーム)と いう前提で作成しました。 【1行目】 アクション: 閉じる   オブジェクトの種類: フォーム   オブジェクト名: 作成画面   オブジェクトの保存: 確認   ※今回の内容・順序では、オブジェクトの種類と名前は空白でも可。    (指定なしの場合、現在のフォームが閉じられるので) 【2行目】 アクション: オブジェクトの選択   オブジェクトの種類: フォーム   オブジェクト名: メインフォーム   データベース ウィンドウ内: いいえ 【3行目】 アクション: 再クエリ   コントロール名: (空白のままにします) <解説> メインフォームを再クエリする前に、作成画面側のデータを保存してやる必要が あります。 ここでは、「閉じる」アクションによって、実質的なレコード保存を行っています。 順序を逆(オブジェクトの選択→再クエリ→閉じる)では、メインフォームには 反映されないのでご注意下さい。

23tomo-u
質問者

補足

回答ありがとうございます。 (何度か削除してしまいごめんなさい、書き方に納得がいかなかったもので。。) できました! 自分なりの理解(解釈)ですが、 1行目で作成画面を閉じて、2行目でメインフォームの再クエリの 準備をするわけですね オブジェクト: データや操作の集まり。つまりモジュールより大きな枠組みみたいな感じですか、 端的にいうとテーブルやクエリ、フォームといった。 (この場合は再クエリしたいフォーム、つまり、メインフォーム) そして3行目で、再クエリと。 ありがとうございます! そしてこの回は何やら、VBAに慣れるのに最適な問いな 気がしますので、もう少し続けます。 何かありましたら宜しくお願いします。 (今日はもう休みます。)

その他の回答 (4)

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

No.3です。 > 1行目で作成画面を閉じて、2行目でメインフォームの再クエリの > 準備をするわけですね   (中略) > そして3行目で、再クエリと。 おおすじで、それでOKなのですが、No.3の末尾に書いた「<解説>」部分の読み 込みが不足されているようです。 No.2の方のVBAと、No.3のマクロとでは、「閉じる/Close」と「再クエリ/Requery」 の順序が逆になっています。 そのため、レコードが保存されていない状態でOkボタンを押すと、No.1・2の補足 欄に書かれたように、「Requeryをしても反映されない」という結果になります。 (ちなみに、作成画面のOkボタンを押す直前の状態でテーブルを見てもらえば、  そこではまだテーブルにも反映されていないことを確認できます) ※作成画面に保存ボタンを設置して押すか、可能なら別のレコードに移動した  場合は、「Requery→Close」の順でも反映されます。 「1行目で閉じることによって、再クエリ実行時にはレコードが保存済みになる」、 このことが重要です。 ですので、VBAの場合でも、マクロと同様に、先にCloseを行ってからRequeryと してやれば、「作成画面」で登録しようとしたレコードがメインフォームに反映される ようになります。 Private Sub Ok_Click()   DoCmd.Close acForm, "作成画面"   Forms!メインフォーム.Requery End Sub また、別のやり方として、閉じる/Closeによる自動保存に頼る代わりに、明示的に レコードを保存する、というのもあります。 これであれば、RequeryをCloseの前においても、メインフォームに新規レコードを 反映させることができます。 こちらの場合は、Requeryの前に「DoCmd.RunCommand acCmdSaveRecord」 を追加します。 Private Sub Ok_Click()   DoCmd.RunCommand acCmdSaveRecord   Forms!メインフォーム.Requery   DoCmd.Close acForm, "作成画面" End Sub > 「acForm」というのがいくら調べてもわかりません マクロで「閉じる」アクションを選択してみると、画面左下に、「オブジェクトの種類」 という欄があり、そこのリストに「テーブル」「フォーム」などが並んでいると思います。 「acForm」というのは、そこの「フォーム」と同じ意味です。 実際には、「DoCmd.Close 0」ならテーブルを、「DoCmd.Close 2」ならフォームを それぞれ閉じる、という意味になるのですが、ただの数値では非常に覚えにくいし 後から見直してもわかりにくい、ということで、VBAの中で「0」や「2」の代わりに 使える定数として、「acTable」や「acForm」などが予め組み込まれています。 (MsgBoxで表示ボタンの種類を指定で使用する「vbOkOnly」(=0・Okボタンのみ)や、  MsgBoxで選んだボタンを返す「vbCancel」(=2・キャンセルボタンを選択)等の  組み込み定数などもあります:  頭が「ac」のものはAccessで、「vb」のものは(Excel等も含めた)VBAで、  それぞれ定義されているもの)   ・・・この辺りの定数は、全てを覚えるとなると大変ですが、VBA内にそれを補助する 機能(→添付画像:「Close」の後に半角スペースを入力すると表示)もありますし、 相当するマクロアクションをVBAに変換してやるという手もありますので、あまり気に しない方がいいと思います(汗)

23tomo-u
質問者

お礼

回答ありがとうございます。 読み込み不足についてご指摘いただきありがとうございました。 なにぶん、一人で本を読んだり、ネットで調べたりしてやってるので、 そういう指摘はありがたいです。(怖いのは嫌ですが・笑) 気付かせていただくことが多々あり勉強になります。 今回で言えば「順序」ですね。 「閉じる(自動保存として)」→「再クエリ」 これはマクロであってもVBAであっても同じという風に考えたら、 今まで「仕掛け」関係はマクロで作っていたのですが、 あらためて持っているVBAの本(といってもマクロと込みですが)を 見直すともっと気楽に読めるようになり、頭に入り易くなりました。 簡単な処理なら今でもVBAで作れそう気がしてきました。 また前に作った簡単なデータベースでも保存時の 不具合があって、謎になっていたのですが、少し解明されてきました。 もう一捻りすればそちらも改善に至るでしょう。 丁寧な解説と回答ありがとうございました!

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

#1です。 アクティブ時イベントは呼ばれませんね。 呼ばれないので、再クエリもできないということで、#1は無視してください。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

別フォームのOKボタンのイベントプロシージャに(マクロをやめて) Forms!メインフォーム.Requery DoCmd.Close acForm, "別フォーム名" と記載してみてください

23tomo-u
質問者

補足

回答ありがとうございます。 しかし残念、できませんでした・・。 ただ、これを気にマクロを深めるのとともにVBAに慣れるのに 挑戦したいと思います、もし宜しければお付き合いください。 状況はといいますと、 まず、メインフォームの標題は「メインフォーム」という名前で 別フォームの標題が「作成画面」という名前で OKボタンの標題・名前ともに「OK」です。 クリック時にイベントプロシージャに選択して VBエディターを開き、コード作成画面の 一番上の太文字には「OK」と「Click」とあります。 そしてその下に、 --------------------- Private Sub OK_Click() Forms!メインフォーム.Requery DoCmd.Close acForm, "作成画面" End Sub --------------------- と入力しました。 が、テーブルには反映しましたが、 フォームには反映しませんでした。 ちなみにメインフォームには再クエリマクロで作った 「更新」ボタンがありますので、それを押すと 作成画面で作ったデータが反映されました。 気になるところと言えば、 メインフォームのレコードソースが、 SELECT Tメイン.ID, Tメイン.顧客番号, Tメイン.名前, Tメイン.住所, Tメイン.日付 FROM Tメイン; となっているところです。 何か関係があるでしょうか? 何かございましたら宜しくお願いします。 (今日はもう休みます。)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

回答入れようかとしたら消えてたのであせりました。 メインフォームがアクティブになった時に、再クエリしてみてはいかがでしょうか。 (まずは、この状態での動作を確認してみてください) ※メインフォームのアクティブ時イベントで、再クエリします。 ※メインと作成画面フォームetcを並列で表示していて、  変更の都度更新が必要ということになりますか。  であれば、VBAが簡単かと。。。

23tomo-u
質問者

補足

回答ありがとうございます。 (何度か削除してしまいごめんなさい、書き方に納得がいかなかったもので。。) この回は何やらVBAに慣れるのに最適だと思いますので、 何かご意見がございましたらお付き合いください。 詳細は、kmetuさんのところに書かせて頂きました。 まず、メインフォームに再クエリで作った「更新」ボタンを設置してまして、 これを押すと作成画面で作ったデータが反映されます。 メインフォームのみの状態→これがアクティブな状態ということで 宜しいでしょうか? そしてコードはクリック時のイベントプロシージャで --------------------- Private Sub OK_Click() Forms!メインフォーム.Requery DoCmd.Close acForm, "作成画面" End Sub --------------------- と入力しました。 しかし、ダメでした・・(テーブルには反映したもののフォームには反映されず)。 また「DoCmd.Close」は「閉じる・アクション」ということで理解しましたが (DoCmd→何かアクションを起こす時に頭につけて使うもの。) 「acForm」というのがいくら調べてもわかりません、 もし宜しければ教えてください、お願いいたします。 (今日はもう休みます)

関連するQ&A