#694 フォームを開く際にサブフォームの編集権限を切り替えるには? フォーム、VBA

フォームには、データの編集可否に関連した次のようなプロパティがあります。
  • 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"に設定することで、フォームが開かないようにしています。

    ※その設定を行うと、呼び出し側の「DoCmd.OpenForm」でエラーが発生します。今回は無視してよいものですので、「On Error Resume Next」というステートメントを直前に記述してエラーメッセージがユーザーに表示されないようにしています。
    ※必ずしも呼び出された側のフォームでこのような処理をする必要はなく、開く側のフォームで開く処理を行わないようにしてもよいですし、場合によっては[開く]ボタンを使用不可にしておくなど、ケースによってさまざまです。

  • また、「Load/読み込み時」イベントプロシージャでは、呼び出し元フォームの3つのチェックボックスを参照し、それぞれをサブフォームの当該プロパティに設定しています。

    ※チェックボックスはON/OFF(はい/いいえ)のいずれかの状態しかないBoolean型(Yes/No型)です。またプロパティシートを見れば分かるように、「AllowEdits/更新の許可」プロパティなどもみな”はい/いいえ”のいずれかから選択する形となっています。同じデータ型ですので、ここでは「.AllowEdits = frm!chkEdits」といった簡単な式でそのまま値を代入することで可否を設定することができます。
    ※「AllowEdits/更新の許可」プロパティなどは”サブフォームコントロール”のプロパティではなく、”サブフォームコントロールのソースオブジェクトとなっているフォーム”のプロパティです。よって「Me!frm商品マスタ_sub.Form」のように、サブフォームコントロール名の最後に「.Form」を付けることに注意してください。

  • 呼び出し元との選択値の受け渡しについては、「DoCmd.OpenForm」の引数OpenArgsで渡す、標準モジュールのPublic変数を介して渡す、呼び出し元あるいは呼び出される側の「Declarations」セクションのPublic変数を介して渡すなど、さまざまな方法がありますが、今回は「呼び出された側から呼び出し元のフォームのコントロールを参照する」といった形をとっています。その点は、状況に応じて方法を変える必要があるかもしれません。


実行例:
  • 「すべての権限」にチェックマークを付けたとき



        ※スクリーンショットでは分かりませんが、すべての編集が可能です。

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



        ※追加は不許可なので新規レコードの行が表示されません。

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



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved