Microsoft Access 掲示板

ホームタブの「更新」「すべて更新」をVBAで行いたい

4 コメント
views
4 フォロー

タイトルの通りです。
ホームタブにある「更新」「すべて更新」と同じ作業をVBAで行いたいのですが、可能でしょうか?
もし可能であれば、どのような記述になるかご教示いただけますでしょうか。

Refresh や Requery かなと思うのですが何か違うような気がします。

よろしくお願いいたします。
画像1

mae
作成: 2022/12/13 (火) 14:37:02
最終更新: 2022/12/13 (火) 14:38:31
通報 ...
1

そのコマンドは使ったことがないのでよくわかりませんが、
Refresh や Requery だと、どの点がご希望の動作と異なりますか。

2

説明不足で申し訳ございません、使いたい背景を含め、補足させていただきます。

現在、SharePointのデータをリンクテーブル(T_入力元 とします)として置き、そのAccessファイルを複数人に配布して使用しています。

入力フォームで必要事項を入力後、登録ボタンを押すと「T_入力元」IDフィールドのMAX値+1を取得し、新しいIDで更新されるようにしています。

しかし、たとえばAさんが登録後、タイミングよくBさんが1,2秒後にすぐ登録しようとすると、T_入力元の最新情報がまだBさんのAccessファイル上では反映されておらず、Aさんと同じID番号を取得してしまう現象が起こります。

Aさんが登録直後、Bさんのほうで「すべて更新」をクリックするか、「T_入力元」リンクテーブルを開いて閉じる作業をすれば、すぐに最新の状態になることは確認済みです。

リンクテーブルの情報を最新に更新したいという希望でしたので、Refresh や Requeryではないのかな?という予想でした。

もちろんそれで対応できるなら全く問題ありません。

長くなり申し訳ございません、よろしくお願いいたします。

3

harePointのリンクテーブルを使ったことがないので、あくまで推測ですが、下記によると、
[ホーム] タブの[レコード]グループで [すべて更新] とマクロの再クエリ 、VBAの Requery は同じ処理のように読めます。

データの更新または再クエリを実行する - Microsoft サポート

ただし、

しかし、たとえばAさんが登録後、タイミングよくBさんが1,2秒後にすぐ登録しようとすると、T_入力元の最新情報がまだBさんのAccessファイル上では反映されておらず、Aさんと同じID番号を取得してしまう現象が起こります。

2人のユーザーがほとんど同時に、
再クエリして最大IDを取得して、それを利用してレコード保存した場合、再クエリとレコード保存のわずかな時間でも重なる場合がありえますので、その時は重複する可能性はあります。

その辺を厳密にするなら、採番用のテーブルを別に用意して、そこに最大ID番号を格納しておきます。
更新処理の最初にその採番用テーブルは排他的に開き(他ユーザーが開けないようにロック)、ID番号に1加算して、それを元にレコード保存して、採番用テーブルを閉じるようにします。
もし、他ユーザーが更新処理に入っていたら、採番用テーブルは開けないので、開けるようになるまでまって更新処理に入るという処理にする、という方法があるようです。

私自身はそこまでしたことはないですが、そういう方法もあるということで状況によってはその必要もあるかもしれません。

4

ご説明いただきありがとうございます。
Shift + F9 はRerueryと同じ処理なので、そういうことですね。
公式ページの説明にきちんと書いてあるのを見落としていました。申し訳ございません。
ただ仰る通りタイミングによっては重複の可能性がありますね。

採番用のテーブルを別に用意して・・・

こんな方法があるんですね!確かにこの方法であれば重複は回避できるかもしれません。
でも1年に一回あるかないかの話なので(今回も4,5年運用して初めて起こりました)、
あまりにも頻繁に起こるようでしたら、こちらの方法を試してみたいと思います。

「すべて更新」についてのご説明ありがとうございました。おかげさまで腑に落ちました。
また、代替案についても非常に参考になりました。