Access (VBA)

Access VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 11 Pro : Access 2019)
サブフォームの先頭行を変えたくない
投稿日時: 24/04/22 12:55:12
投稿者: kkkc

請求番号を入力したら、サブフォームの該当するレコードにチェックを入れるようにしました。
 
cn.Execute "UPDATE W_入金データー_売上明細 SET 選択 = TRUE WHERE 請求番号 = " & Me!請求番号
 
しかし、サブフォームが変更されないのでRequeryすることにしました。
 
Me!埋め込み121.Requery
 
サブフォームのレコード件数がスクロークするくらい件数が多いと、サブフォームの先頭行が1件目に移動されてしまいます。
 
先頭行を変えたくないのですが、どうすればいいでしょうか?
 
 

回答
投稿日時: 24/04/22 13:27:05
投稿者: sk

引用:
Me!埋め込み121.Requery

Me![埋め込み121].Form.Repaint
 
----------------------------------------------------------
 
とりあえず、以上のように修正してみて下さい。

回答
投稿日時: 24/04/22 13:27:24
投稿者: hatena
投稿者のウェブサイトに移動

Me!埋め込み121.Requery

なら、再クエリしてもスクロールしないはずです。
  
Me!埋め込み121.Form.Requery

 
なら再クエリで先頭行へ移動しますが。

回答
投稿日時: 24/04/22 13:40:29
投稿者: Suzu

更新クエリを発行するのではなく、
 
サブフォーム上のレコードから、
当該レコードを検索し、選択 フィールド の値を更新するのが判りやすいでしょう。
 
 
FindRecordメソッド
https://www.moug.net/tech/acvba/0080046.html
 
を使うのが簡単でしょうか。
 
 
その前に、
DCount関数辺りを使い、指定するレコードが存在する事を確認
サブフォームコントロールにフォーカス移動
サブフォーム内のコントロールにフォーカスを移動してから
Docmd.FindRecord を使用します。
 
 
別案としては
 
BookMarkプロパティーを使います。
 
サブフォームの、カレントレコードのブックマークを取得する
データ更新後、
レコードセットに対し、ReQueryを行い
ブックマークを復元します。
 
https://learn.microsoft.com/ja-jp/office/vba/api/access.form.bookmark
 
 
 
 
Accessの VBA に 慣れて来たら
サブフォームのRecordSetプロパティーを取得
レコードセットから、当該レコードを検索
レコードが在ったら、当該レコードの 選択 フィールドの値を True に書き換える
の方が、確実簡単になるでしょう。
 
検索までは、
 
サブフォーム内の全フィールドを検索するには?
https://tsware.jp/tips/tips_626.htm
が参考になるでしょう。

投稿日時: 24/04/24 08:38:07
投稿者: kkkc

お返事ありがとうございます。
 
その後分かったことがあります。
サブフォームをスクロールして、
特定のレコードをクリックした状態で
Requeryをするとスクロールしません。
 
サブフォームをスクロールして、
特定のレコードをクリックしない状態で
Requeryをすると先頭行にスクロールしてしまいます。
 
これは、1件目がカレントレコードに
なっているからだと思います。
 
Suzu様の方法はまだ試していませんが、
カレントレコードが1件目にあるので、
同じ現象になるかと思います。
 
サブフォームをスクロール、
しかしカレントレコードが1件目のままのとき、
 
cn.Execute "UPDATE W_入金データー_売上明細 SET 選択 = TRUE WHERE 請求番号 = " & Me!請求番号
 
を実行して、
それをサブフォームに反映させる、
しかしサブフォームはスクロールさせない、
ということはできないでしょうか?
 
サブフォームをスクロースさせたとき、
自動的にいちばん上のレコードが
カレントレコードになればいいのですが。
 

回答
投稿日時: 24/04/24 17:58:09
投稿者: hatena
投稿者のウェブサイトに移動

たしかにカレントレコードが表示される位置までスクロールしますね。
ある意味、ユーザーにとっては都合のよい仕様のように思いますが、
ユーザーがデータ操作するのはカレントレコードに対してが普通ですので。
 
どうしてもというなら、スクロールバーの位置を記憶しておいて、再クエリ後に元の位置に戻すという処理になりますね。
Accessの標準ではそのような機能はないのでAPIを使うことになります。
 
下記のページのサンプルでスクロールバーの位置の取得と設定をしていますので、どうしてもというのなら、ダウンロードして解析してみてください。
 
サブフォーム間のスクロールを同期させる方法 - hatena chips
https://hatenachips.blog.fc2.com/blog-entry-497.html

トピックに返信