タイトルの通りです。 ホームタブにある「更新」「すべて更新」と同じ作業をVBAで行いたいのですが、可能でしょうか? もし可能であれば、どのような記述になるかご教示いただけますでしょうか。
Refresh や Requery かなと思うのですが何か違うような気がします。
よろしくお願いいたします。
そのコマンドは使ったことがないのでよくわかりませんが、 Refresh や Requery だと、どの点がご希望の動作と異なりますか。
説明不足で申し訳ございません、使いたい背景を含め、補足させていただきます。
現在、SharePointのデータをリンクテーブル(T_入力元 とします)として置き、そのAccessファイルを複数人に配布して使用しています。
入力フォームで必要事項を入力後、登録ボタンを押すと「T_入力元」IDフィールドのMAX値+1を取得し、新しいIDで更新されるようにしています。
しかし、たとえばAさんが登録後、タイミングよくBさんが1,2秒後にすぐ登録しようとすると、T_入力元の最新情報がまだBさんのAccessファイル上では反映されておらず、Aさんと同じID番号を取得してしまう現象が起こります。
Aさんが登録直後、Bさんのほうで「すべて更新」をクリックするか、「T_入力元」リンクテーブルを開いて閉じる作業をすれば、すぐに最新の状態になることは確認済みです。
リンクテーブルの情報を最新に更新したいという希望でしたので、Refresh や Requeryではないのかな?という予想でした。
もちろんそれで対応できるなら全く問題ありません。
長くなり申し訳ございません、よろしくお願いいたします。
harePointのリンクテーブルを使ったことがないので、あくまで推測ですが、下記によると、 [ホーム] タブの[レコード]グループで [すべて更新] とマクロの再クエリ 、VBAの Requery は同じ処理のように読めます。
データの更新または再クエリを実行する - Microsoft サポート
ただし、
2人のユーザーがほとんど同時に、 再クエリして最大IDを取得して、それを利用してレコード保存した場合、再クエリとレコード保存のわずかな時間でも重なる場合がありえますので、その時は重複する可能性はあります。
その辺を厳密にするなら、採番用のテーブルを別に用意して、そこに最大ID番号を格納しておきます。 更新処理の最初にその採番用テーブルは排他的に開き(他ユーザーが開けないようにロック)、ID番号に1加算して、それを元にレコード保存して、採番用テーブルを閉じるようにします。 もし、他ユーザーが更新処理に入っていたら、採番用テーブルは開けないので、開けるようになるまでまって更新処理に入るという処理にする、という方法があるようです。
私自身はそこまでしたことはないですが、そういう方法もあるということで状況によってはその必要もあるかもしれません。
ご説明いただきありがとうございます。 Shift + F9 はRerueryと同じ処理なので、そういうことですね。 公式ページの説明にきちんと書いてあるのを見落としていました。申し訳ございません。 ただ仰る通りタイミングによっては重複の可能性がありますね。
採番用のテーブルを別に用意して・・・
こんな方法があるんですね!確かにこの方法であれば重複は回避できるかもしれません。 でも1年に一回あるかないかの話なので(今回も4,5年運用して初めて起こりました)、 あまりにも頻繁に起こるようでしたら、こちらの方法を試してみたいと思います。
「すべて更新」についてのご説明ありがとうございました。おかげさまで腑に落ちました。 また、代替案についても非常に参考になりました。
不適切なコンテンツとして通報するには以下の「送信」ボタンを押して下さい。 現在このグループでは通報を匿名で受け付けていません。 管理者グループにはあなたが誰であるかがわかります。
どのように不適切か説明したい場合、メッセージをご記入下さい。空白のままでも通報は送信されます。
通報履歴 で、あなたの通報と対応時のメッセージを確認できます。
トピックをWIKIWIKIに埋め込む
次のコードをWIKIWIKIのページに埋め込むと最新のコメントがその場に表示されます。
// generating...
プレビュー
Accessのテーブルやクエリのデータを貼り付ける場合は下記で、Markdown書式のテーブルに変換して貼り付けてください。
Markdown Tables generator
ここまでがあなたのコンテンツ
ここからもあなたのコンテンツ
そのコマンドは使ったことがないのでよくわかりませんが、
Refresh や Requery だと、どの点がご希望の動作と異なりますか。
説明不足で申し訳ございません、使いたい背景を含め、補足させていただきます。
現在、SharePointのデータをリンクテーブル(T_入力元 とします)として置き、そのAccessファイルを複数人に配布して使用しています。
入力フォームで必要事項を入力後、登録ボタンを押すと「T_入力元」IDフィールドのMAX値+1を取得し、新しいIDで更新されるようにしています。
しかし、たとえばAさんが登録後、タイミングよくBさんが1,2秒後にすぐ登録しようとすると、T_入力元の最新情報がまだBさんのAccessファイル上では反映されておらず、Aさんと同じID番号を取得してしまう現象が起こります。
Aさんが登録直後、Bさんのほうで「すべて更新」をクリックするか、「T_入力元」リンクテーブルを開いて閉じる作業をすれば、すぐに最新の状態になることは確認済みです。
リンクテーブルの情報を最新に更新したいという希望でしたので、Refresh や Requeryではないのかな?という予想でした。
もちろんそれで対応できるなら全く問題ありません。
長くなり申し訳ございません、よろしくお願いいたします。
harePointのリンクテーブルを使ったことがないので、あくまで推測ですが、下記によると、
[ホーム] タブの[レコード]グループで [すべて更新] とマクロの再クエリ 、VBAの Requery は同じ処理のように読めます。
データの更新または再クエリを実行する - Microsoft サポート
ただし、
2人のユーザーがほとんど同時に、
再クエリして最大IDを取得して、それを利用してレコード保存した場合、再クエリとレコード保存のわずかな時間でも重なる場合がありえますので、その時は重複する可能性はあります。
その辺を厳密にするなら、採番用のテーブルを別に用意して、そこに最大ID番号を格納しておきます。
更新処理の最初にその採番用テーブルは排他的に開き(他ユーザーが開けないようにロック)、ID番号に1加算して、それを元にレコード保存して、採番用テーブルを閉じるようにします。
もし、他ユーザーが更新処理に入っていたら、採番用テーブルは開けないので、開けるようになるまでまって更新処理に入るという処理にする、という方法があるようです。
私自身はそこまでしたことはないですが、そういう方法もあるということで状況によってはその必要もあるかもしれません。
ご説明いただきありがとうございます。
Shift + F9 はRerueryと同じ処理なので、そういうことですね。
公式ページの説明にきちんと書いてあるのを見落としていました。申し訳ございません。
ただ仰る通りタイミングによっては重複の可能性がありますね。
こんな方法があるんですね!確かにこの方法であれば重複は回避できるかもしれません。
でも1年に一回あるかないかの話なので(今回も4,5年運用して初めて起こりました)、
あまりにも頻繁に起こるようでしたら、こちらの方法を試してみたいと思います。
「すべて更新」についてのご説明ありがとうございました。おかげさまで腑に落ちました。
また、代替案についても非常に参考になりました。