office.notes@misora05

本館ブログのうち,Office・Windwsがらみのネタ+@を抜き出したもの.月水金更新予定.

Accessの「AllowEdits/編集の許可」プロパティが効かない場合

今回やりたかったこと

Accessを使ったツールの開発中,次のような要望が上がりました.

👨「ユーザが特定の操作を行うまで,フォーム(連結フォーム)の更新はさせないでほしい」

この要望を満たすのは一見簡単かと思ってました.
なにせ,AllowEdits/更新の許可という,そのまんまのプロパティがありますからね.

問題発生

で,結論から言うと,以下の制限に引っかかって見事に失敗しました.

フィールドの値をプログラムを使用して変更すると、"AllowEdits/更新の許可" プロパティの設定に関係なく、現在のレコードが編集可能になります。

今回はコマンドボタン等のコントロールの操作からVBAで直接値を投入する部分があったため,そちらの処理が優先されてしまい,ユーザの要望を叶えることができませんでした.
さらに,このコントロール操作が行われると,AllowEditsプロパティの値がまるっと無視されるというおまけつきです.もうこれは「敗北」と言っても差し支えないでしょう.

一応上記のサイトには,

"AllowEdits/更新の許可" が No に設定されているレコードをプログラムで変更する場合、そのレコードをユーザーが変更できないようにするには、プログラムでの変更を行った後にレコードを保存してください。変更が保存された後、"AllowEdits/更新の許可" プロパティの設定が再び有効になります。

‥という記述もあるのですが,今回ユーザの要望を満たすには「各コントロールのイベント発生時にAllowEditsの値を見,その値に応じてイベントのコードを切り替える」という処理を複数個書かなければならない状態となりました.これは面倒くさいし正直嫌です――結構イベントの個数が多かったので.

Microsoft Store (マイクロソフトストア)

解決策(その1)

AccessのフォームにはRecordsetType/レコードセットというプロパティも存在します.

こちらは既定値が 0/ダイナセット ですが,2/スナップショット に設定すると,

  • VBAのコードによる値投入が阻止できる*1
  • 上記の「プロパティの値がまるっと無視される」という問題点も発生しない.

‥という状態になります.こちらの方が多分容易に制御ができるんじゃないかと思います.

解決策(その2)

今回のユーザの要望は以下の通りでした.

👨「ユーザが特定の操作を行うまで,フォーム(連結フォーム)の更新はさせないでほしい」

なので,「編集を許可」というボタンをフォーム上に配置しておき,そこで上記の スナップショット/ダイナセット の切り替えを行うようにしました.

ただし,注意すべき点として,スナップショット・ダイナセットの切り替えを行うと,フォームのカレントレコードが先頭のレコードに変更されてしまいます

なので,上記の切り替えを行う前に予めカレントレコードの位置を覚えておき,切り替え後にDoCmd.GoToPage/GoToPageマクロ・アクションを実行するとよいでしょう.

これで今回のユーザの要望はすべて達成することができました.めでたい.

Microsoft Store (マイクロソフトストア)

*1:行おうとすると実行時エラーが発生する.