過去にも同じような問題で記事を書いていましたが、同じようにやってもどうしてもうまくいきませんでした。
https://pctips.jp/pc-soft/access-convenient-tips2/#%E5%86%8D%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%A7%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E5%85%88%E9%A0%AD%E3%81%AB%E7%A7%BB%E5%8B%95%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86
ココに注意
再クエリをするとレコードが勝手に先頭に移動してしまうという問題
具体的にやりたい事の説明
最初に帳票フォームで一覧表示しているデータがあります。
修正ボタンをクリックすると、編集フォームが起動して編集した後、再び帳票フォームに戻り
ココがダメ
再クエリや再読込をするとレコードが先頭に勝手に移動してしまいます!
勝手に移動されては、データ件数が多くなると、編集した後、再度元のデータを探し出してレコード移動しなければなりません。
これは困ります!
帳票フォームに更新ボタン設置
まずは、帳票フォームに「更新(修正後レコード移動)」ボタンを設置しました。
もちろん、VBA内に、「DoCmd.ShowAllRecords」と記述すると、帳票フォームの画面が更新されて修正したデータが表示されますが、レコードが先頭に移動してしまいます。
参考記事発見!!
さんざん探し回って、やっと見つけました。本当にこのような記事をネット上にあげておいていただけると助かります。
早速、取り入れました!!
Public Sub record_move_Click() Dim headerHeight As Long Dim curTop As Long Dim curRecNum As Long Dim topRecNum As Long 'NOにフォーカスを移す Me.no.SetFocus 'カレントレコードを取得 curRecNum = Me.CurrentRecord 'フォームヘッダー行数を取得 headerHeight = Int(Me.Section("フォームヘッダー").Height / Me.Section("詳細").Height) '現在のセクションの上端からフォームの上端までの距離(twip)を取得 curTop = Me.CurrentSectionTop '現在先頭に表示されているレコード番号を取得 topRecNum = curRecNum - (Int(curTop / Me.Section("詳細").Height) - headerHeight) '再表示 DoCmd.ShowAllRecords '表示位置の復元 DoCmd.GoToRecord acActiveDataObject, , acLast DoCmd.GoToRecord acActiveDataObject, , acGoTo, topRecNum DoCmd.GoToRecord acActiveDataObject, , acGoTo, curRecNum End Sub
フォーカスの部分と、DoCmd.ShowAllRecords以外は丸写しです。
実際に動きを確認しましたが、更新ボタンをクリックしても画面が更新された後、勝手なレコード移動が無くなりました。
別フォームのVBAコードを実行
実際は、編集フォームを閉じた後のタイミングで、自動で更新かけたいところです。
更新する方(動かすVBA)をPrivateからPublic に変更しました。
そうすることで、別フォームからコマンド実行できるようになるようです。
あとは簡単ですね。編集フォームを閉じるタイミングで更新ボタンを自動実行させれば良いという事になります。
DoCmd.Close acForm, "edit", acSaveNo
Form_orderdata_sorting.record_move_Click
参考
Form_フォーム名.プロシージャ名
Form_フォーム名.コマンド名_Click
という書き方になるようです。
自分の場合は、コピペしてつかっていたら、Form_orderdata_sorting.record_move_Click()というようにカッコが入ってしまってエラーになってしまいました。
ちょっとしたことでエラーになるので注意が必要ですね。
帳票フォームでデータ更新後先頭にレコードが移動して苦労したことが何度もありましたが、これで苦労も無くなる事でしょう。