フォームには、データの編集可否に関連した次のようなプロパティがあります。
- AllowEdits/更新の許可
- AllowAdditions/追加の許可
- AllowDeletions/削除の許可
また、プロパティにはありませんが、”データをまったく見せないようにする”といった”一切の権限なし”の処理も必要かもしれません。
フォームを開く際に、これらをVBAのプログラムで動的に設定することで、条件に応じたさまざまな編集権限の切り替えを行うことができます。たとえば、事前にログイン画面を作っておき、そこでのユーザーに権限に応じて切り替える、呼び出し元の画面の設定によって切り替える、などです。
ここでは、編集権限を選択する画面から呼び出す手順を例に、そのプログラム例を紹介します。
まず、編集権限を選択する呼び出し元の画面として、次のようなフォーム(名前は”編集権限メニュー”)を作ります。

ここでは、各コントロールの名前を次のようにしています。
- [すべての権限]チェックボックス → chkAll
- [更新の許可]チェックボックス → chkEdits
- [追加の許可]チェックボックス → chkAdditions
- [削除の許可]チェックボックス → chkDeletions
- [表示不可]チェックボックス → chkPrhbtOpen
- [開く]ボタン → cmd開く
一方、開かれる方の画面(名前は”frm商品マスタ”)は次のようなものとします。

ここでは、サブフォームの名前を「frm商品マスタ_sub」、編集権限を表示するテキストボックスの名前を「txt編集権限」としています。
次に、それぞれの画面に下記のようなVBAのコードを記述します。
■「編集権限メニュー」フォームのモジュール
Private Sub chkAll_AfterUpdate()
'[すべての権限]チェックボックスの更新後処理
'ONになったら更新・追加・削除をON、表示不可をOFF
'OFFになったらその逆
Me!chkEdits = Me!chkAll
Me!chkAdditions = Me!chkAll
Me!chkDeletions = Me!chkAll
Me!chkPrhbtOpen = Not Me!chkAll
End Sub
Private Sub chkEdits_AfterUpdate()
'[更新の許可]チェックボックスの更新後処理
'共通プロシージャを実行
cbfSetAuthority
End Sub
Private Sub chkAdditions_AfterUpdate()
'[追加の許可]チェックボックスの更新後処理
'共通プロシージャを実行
cbfSetAuthority
End Sub
Private Sub chkDeletions_AfterUpdate()
'[削除の許可]チェックボックスの更新後処理
'共通プロシージャを実行
cbfSetAuthority
End Sub
Private Sub chkPrhbtOpen_AfterUpdate()
'[表示不可]チェックボックスの更新後処理
If Me!chkPrhbtOpen Then
'ONになったらすべて・更新・追加・削除をOFF
Me!chkAll = False
Me!chkEdits = False
Me!chkAdditions = False
Me!chkDeletions = False
End If
End Sub
Private Sub cbfSetAuthority()
'3つのON/OFFに応じてすべてと不可を切り替え
'3つともONならすべての権限をON(それ以外はOFF)
Me!chkAll = (Me!chkEdits And Me!chkAdditions And Me!chkDeletions)
'3つともOFFなら表示不可をON(それ以外はOFF)
Me!chkPrhbtOpen = (Not Me!chkEdits And Not Me!chkAdditions And Not Me!chkDeletions)
End Sub
Private Sub cmd開く_Click()
'[開く]ボタンクリック時
'frm商品マスタを開く
On Error Resume Next
DoCmd.OpenForm "frm商品マスタ"
End Sub
■「frm商品マスタ」フォームのモジュール
Private Sub Form_Open(Cancel As Integer)
'フォームを開くとき
'表示不可なら開かない
If Forms!編集権限メニュー!chkPrhbtOpen Then
Beep
MsgBox "画面を開く権限がありません!", vbOKOnly + vbExclamation
Cancel = True
End If
End Sub
Private Sub Form_Load()
'フォーム読み込み時
Dim frm As Form
Set frm = Forms!編集権限メニュー
'サブフォームの編集権限を設定
With Me!frm商品マスタ_sub.Form
.AllowEdits = frm!chkEdits
.AllowAdditions = frm!chkAdditions
.AllowDeletions = frm!chkDeletions
End With
'編集権限のテキストボックスを設定
Me!txt編集権限 = IIf(frm!chkEdits, "更新 ", "") & _
IIf(frm!chkAdditions, "追加 ", "") & _
IIf(frm!chkDeletions, "削除 ", "")
End Sub
【プログラムのポイント】
- 「編集権限メニュー」フォームに関しては、基本的には更新の許可/追加の許可/削除の許可/表示不可の4つのチェックボックスだけ配置して、それらに関してはノンプログラムでもよいかもしれません。ここでは「すべての権限」というチェックボックスも配置して、”それをチェックしたら更新/追加/削除もチェックマークを付け、表示不可のチェックマークは外す”といったような、操作性をよくするためのコードも記述しています(モジュール内のコードはほとんどそのためのものです)。
- 呼び出された方の「frm商品マスタ」フォームでは、「Open/開く時」イベントプロシージャで「編集権限メニュー」の「表示不可」チェックボックスの値を確認しています。チェックマークが付いている、つまりその値が”True”のときは開いてはいけないので、イベントプロシージャの引数「Cancel」を”True"に設定することで、フォームが開かないようにしています。
- また、「Load/読み込み時」イベントプロシージャでは、呼び出し元フォームの3つのチェックボックスを参照し、それぞれをサブフォームの当該プロパティに設定しています。
- 呼び出し元との選択値の受け渡しについては、「DoCmd.OpenForm」の引数OpenArgsで渡す、標準モジュールのPublic変数を介して渡す、呼び出し元あるいは呼び出される側の「Declarations」セクションのPublic変数を介して渡すなど、さまざまな方法がありますが、今回は「呼び出された側から呼び出し元のフォームのコントロールを参照する」といった形をとっています。その点は、状況に応じて方法を変える必要があるかもしれません。
実行例:
- 「すべての権限」にチェックマークを付けたとき



- 「追加の許可」のチェックマークを外したとき



- 「表示不可」で[開く]をクリックしたとき
 
|