gooドクター有料プランが1ヶ月間無料!

宜しくお願いします。

仕様環境:WinVISTA Access2007

別フォームから別フォームへの再クエリの仕方を教えてください。

画像を貼らせて頂きます。
まず、後ろのメインフォームから新規作成ボタンを押して、
別のフォーム(作成画面)を開きます。
そこに新しいデータを入力して、閉じますと、
そのままではメインフォームには反映しません。
(テーブルには反映していますが)

別フォーム(新規の作成画面)に再クエリをかけても
そのフォームが更新させるだけで、メインフォームに変化はありません。

ちなみにメインフォームに作った更新ボタン(中身は再クエリ)を押すと反映されます。

どうしたら別フォームから後ろのメインフォームを再クエリ(更新)できるのでしょうか?


やりたいことは別フォームのOKボタン(画像参照)を押すと
別フォームが閉じると同時にメインフォームが再クエリ(更新)されるとベストです。
(今のところOKボタンの中身は”閉じる”のマクロだけです)

構造は簡単で恐縮ですが、
テーブル:Tメイン
フォーム:メインフォーム
     作成画面フォームetc..

です。
クエリはメインフォーム自体にクエリビルダを使っていますが、
特別な施しなどはしていません、うまく動作しないところがあって、
いろいろ調べていてそうすると改善すると書いてあったので。。

ちなみにテーブルには「日付」の後順で並び替えをかけています。

当方、VBAに弱いのでマクロで操作できるのでしたらお願いします。
マクロで出来ないものでしたらVBAを教えて頂ければ、
イベントプロシージャに書き込みます。

大変恐縮ですがお知恵をお貸しください、宜しくお願いします。

「Access 別フォームへの再クエリ(更」の質問画像
gooドクター

A 回答 (5件)

連投すみません。


・・というか、私も「削除されました」というのを見て一旦中止してました。
(中止した場合も含めて、回答はメモ帳で保存しているので無事でしたが)

> どうしたら別フォームから後ろのメインフォームを再クエリ(更新)できるのでしょうか?

マクロの場合は、「オブジェクトの選択」アクションで対象フォームを選択した後、
「再クエリ」アクションを行えばOkです。
なお、「作成画面」フォームも連結フォーム(レコードソースが指定されたフォーム)と
いう前提で作成しました。

【1行目】
アクション: 閉じる
  オブジェクトの種類: フォーム
  オブジェクト名: 作成画面
  オブジェクトの保存: 確認
  ※今回の内容・順序では、オブジェクトの種類と名前は空白でも可。
   (指定なしの場合、現在のフォームが閉じられるので)
【2行目】
アクション: オブジェクトの選択
  オブジェクトの種類: フォーム
  オブジェクト名: メインフォーム
  データベース ウィンドウ内: いいえ
【3行目】
アクション: 再クエリ
  コントロール名: (空白のままにします)

<解説>
メインフォームを再クエリする前に、作成画面側のデータを保存してやる必要が
あります。
ここでは、「閉じる」アクションによって、実質的なレコード保存を行っています。
順序を逆(オブジェクトの選択→再クエリ→閉じる)では、メインフォームには
反映されないのでご注意下さい。
「Access 別フォームへの再クエリ(更」の回答画像3

この回答への補足

回答ありがとうございます。
(何度か削除してしまいごめんなさい、書き方に納得がいかなかったもので。。)

できました!
自分なりの理解(解釈)ですが、
1行目で作成画面を閉じて、2行目でメインフォームの再クエリの
準備をするわけですね
オブジェクト:
データや操作の集まり。つまりモジュールより大きな枠組みみたいな感じですか、
端的にいうとテーブルやクエリ、フォームといった。
(この場合は再クエリしたいフォーム、つまり、メインフォーム)

そして3行目で、再クエリと。

ありがとうございます!

そしてこの回は何やら、VBAに慣れるのに最適な問いな
気がしますので、もう少し続けます。

何かありましたら宜しくお願いします。
(今日はもう休みます。)

補足日時:2009/10/06 00:39
    • good
    • 0

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に変換してやるという手もありますので、あまり気に
しない方がいいと思います(汗)
「Access 別フォームへの再クエリ(更」の回答画像5
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

読み込み不足についてご指摘いただきありがとうございました。
なにぶん、一人で本を読んだり、ネットで調べたりしてやってるので、
そういう指摘はありがたいです。(怖いのは嫌ですが・笑)

気付かせていただくことが多々あり勉強になります。
今回で言えば「順序」ですね。
「閉じる(自動保存として)」→「再クエリ」
これはマクロであってもVBAであっても同じという風に考えたら、
今まで「仕掛け」関係はマクロで作っていたのですが、
あらためて持っているVBAの本(といってもマクロと込みですが)を
見直すともっと気楽に読めるようになり、頭に入り易くなりました。
簡単な処理なら今でもVBAで作れそう気がしてきました。

また前に作った簡単なデータベースでも保存時の
不具合があって、謎になっていたのですが、少し解明されてきました。
もう一捻りすればそちらも改善に至るでしょう。

丁寧な解説と回答ありがとうございました!

お礼日時:2009/10/08 10:05

#1です。



アクティブ時イベントは呼ばれませんね。

呼ばれないので、再クエリもできないということで、#1は無視してください。
    • good
    • 0

別フォームのOKボタンのイベントプロシージャに(マクロをやめて)


Forms!メインフォーム.Requery
DoCmd.Close acForm, "別フォーム名"
と記載してみてください

この回答への補足

回答ありがとうございます。

しかし残念、できませんでした・・。

ただ、これを気にマクロを深めるのとともに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メイン;

となっているところです。
何か関係があるでしょうか?

何かございましたら宜しくお願いします。
(今日はもう休みます。)

補足日時:2009/10/06 00:42
    • good
    • 0

回答入れようかとしたら消えてたのであせりました。




メインフォームがアクティブになった時に、再クエリしてみてはいかがでしょうか。
(まずは、この状態での動作を確認してみてください)

※メインフォームのアクティブ時イベントで、再クエリします。

※メインと作成画面フォームetcを並列で表示していて、
 変更の都度更新が必要ということになりますか。
 であれば、VBAが簡単かと。。。

この回答への補足

回答ありがとうございます。
(何度か削除してしまいごめんなさい、書き方に納得がいかなかったもので。。)

この回は何やらVBAに慣れるのに最適だと思いますので、
何かご意見がございましたらお付き合いください。

詳細は、kmetuさんのところに書かせて頂きました。
まず、メインフォームに再クエリで作った「更新」ボタンを設置してまして、
これを押すと作成画面で作ったデータが反映されます。
メインフォームのみの状態→これがアクティブな状態ということで
宜しいでしょうか?

そしてコードはクリック時のイベントプロシージャで
---------------------
Private Sub OK_Click()
Forms!メインフォーム.Requery
DoCmd.Close acForm, "作成画面"
End Sub
---------------------
と入力しました。

しかし、ダメでした・・(テーブルには反映したもののフォームには反映されず)。

また「DoCmd.Close」は「閉じる・アクション」ということで理解しましたが
(DoCmd→何かアクションを起こす時に頭につけて使うもの。)
「acForm」というのがいくら調べてもわかりません、
もし宜しければ教えてください、お願いいたします。
(今日はもう休みます)

補足日時:2009/10/06 00:54
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング