Access2013 フォームへ更新後の表示と行の固定Ac

Writer: admin Type: ゃべり、雑談 Date: 2018-12-18 00:00
Access2013 フォームへ更新後の表示と行の固定Access2013を使用しています。VBAにて下記の様な操作を希望しています。どうにも思うように動作せず行き詰っています。ご教授くださいm(_ _)m行いたい動作は、、、フォームAに一覧表示 (レコードソースはQデータ)フォームBはレコード内容修正用のフォーム(レコードソースはTデータ)A一覧の中から1個のレコード(例 レコードCD100)を選択(タイミング1)、Bへ表示Bにてレコードを修正し、Tデータを更新(タイミング2)、Bを閉じる(タイミング3)Aが再表示(一番手前のフォームで表示される)(タイミング4)Aにはレコードが沢山表示されるので、タイミング1と同じ状態(順番)に一覧が表示され 尚且つ更新されたレコードを表示したいのです。現状では タイミング4の画面は タイミング1と同じ順番にはなりますが、更新したレコードが表示されません。以下VBAを書きました。----------------------------- 例)フォームBを閉じる時 Dim Ret As Integer Ret = MsgBox("終了しますか?", vbYesNo) Select Case Ret Case vbYes 'Qデータを再クエリする為、クエリを開く DoCmd.SetWarnings False DoCmd.OpenQuery "Qデータ" DoCmd.SetWarnings True 'クエリを閉じる DoCmd.Close acQuery, "Qデータ", acSaveYes (ここでQデータも更新されていました) 'フォームA を前画面へ DoCmd.SelectObject acForm, "A" Dim varBM As Variant '行位置用の変数 Dim varSF As String '列位置用の変数 Me.Painting = False '画面描画をOFFにする varBM = Me.Bookmark '行位置を保存 varSF = Me.ActiveControl.Name '列位置を保存 'フォームAを再クエリさせる If CurrentProject.AllForms("A").IsLoaded Then Forms("A").Requery End If Me.Bookmark = varBM '行位置を復元 Me.Controls(varSF).SetFocus '列位置を復元する Me.Painting = True '画面描画をONにする 'フォームB へ戻る DoCmd.SelectObject acForm, "B" DoCmd.Close acForm, "B", acSaveNo ’更新後なのでSaveNo Case vbNo Me.Undo End Select上記のVBAをフォームBを閉じるタイミング3に書き込むとフォームAのレコードは更新されますが、一覧の一番上のレコードから表示されてしまい、タイミング1と同じ画面の順番(レコードCD100を含む画面)にはなりません。上記VBAの行位置・列位置や再クエリの部分をフォームAのアクティブ時や読み込み時のイベントに書き込んで動きを見るのですが、上記のイベントは通過していない様で、、、どこにどの様にVBAを書き込めば希望の動きが出来るか?ご教授頂けると大変助かります。よろしくお願い致します。共感した0###再クエリーを実行すると、カレントレコードが先頭のレコードに移動する事が問題なのでしょうか?Bookmarkプロパティで解決できるかと思います。詳しい使い方は下記サイトにてご確認ください。https://tsware.jp/tips/tips_163.htmナイス0
###早速のアンサー 有り難う御座います。フォームBを閉じる時のイベントで私のVBA上のBookmarkの所をお教え頂いたサイトのVBAへ書き換えました。結果先頭のレコードには移動しませんでしたが、Me.Requeryでは再クエリがされていないのか?レコードが更新されません。Me.Requeryの所に変わりに下記コードを書いてみるとIf CurrentProject.AllForms("A").IsLoaded ThenForms("A").RequeryEnd If再クエリがされますが、Bookmarkの取得と表示が出来ていない様で、先頭のレコードに移動してしまいます。悩んでいます。。。
###この質問は投票によってベストアンサーに選ばれました!###余計なことをしすぎです。もっとシンプルにできます。フォームAから、フォームBを表示するコードを下記にすればOK。フォームBにはコードは不必要です。DoCmd.OpenForm "フォームB", , , "主キーフィールド名=" & Me.主キーフィールド名, , acDialogMe.RefreshこれでフォームAのカレントレコードと同じレコードがフォームBに表示れます。主キーフィールドのデータ型がテキスト型の場合は、下記のコードになります。DoCmd.OpenForm "フォームB", , , "主キーフィールド名='" & Me.主キーフィールド名 & "'", , acDialogMe.RefreshこれだけでOKです。ダイアログモード(acDialog)で開いてますので、フォームBを閉じるまで次のコードは実行されません。フォームBを閉じると次のコード(Me.Refresh)が実行されます。Refresh はカレントレコードを再読み込みしますので、フォームBでの変更が反映されます。カレントレコードだけなので、レコード移動しません。フォームBを開く前のままです。Requery は全レコードを再読み込みしますので先頭レコードに移動してしまいます。カレントレコードだけを更新したのなら、Refresh で十分です。レコードソースのクエリを別に開いたりしてますが、まったく無意味な処理です。連結フォームのレコードセットと、別にひらいたクエリのレコードセットは別物ですので関連はありません。ナイス0

 

TAG