ACCESS VBA フォームの編集をロックする機能

ACCESSではフォームからデータの入力を行うことができます。

一方で、データを確定して変更したくない場合は、フォームからの編集を禁止する必要があります。
ACCESSでは、VBAを用いて編集ロックを行うことが可能です。

今回は、フォームの編集をロックする機能をご紹介します。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは使いこなすために少しスキルが必要なものの、うまく活用すればExcelよりも業務の効率化が図れます。
この記事ではACCESSで実際に作成したフォームやレポートを、その作成方法と共にご紹介していきます。

フォームの編集をロックする機能の完成形

先に完成形を示しましょう。
以下は請求書を発行するためのフォームです。

通常時はフォームから入力ができますが、請求処理を確定後は発行した請求書の金額が後から変わってしまうことを防ぐために編集不可にしています。

こちらが請求処理後の画面です。
違いが分かりにくいですが、いくつかの箇所がグレーアウトしていることが分かります。

この部分は変更不可に設定してあるのです。
このように、一定の処理後はデータを変更できないようにフォームをロックする機能は、うまく利用できると便利です。

ロック処理を行うVBAのプロシージャ

では、フォームのロックを行うVBAのプロシージャを見てみましょう。


Public ctl As Control
'画面のロック処理をする際にコントールを識別するための変数。

Public form_name As String
'フォームの名前を格納するための変数。

Public Sub form_detail_lock(form_name As String)
'■■■フォームの詳細セクションのロックをする■■■

For Each ctl In Forms(form_name).Section(acDetail).Controls
    
    Select Case ctl.ControlType
    
        Case 109, 110, 111
        '109:テキストボックス、110:リストボックス,111:コンボボックスの場合
        
            ctl.Enabled = False
            ctl.Locked = True
            ctl.BackColor = 15921906
        
        Case 106, 108, 112, 119, 122
        '106:チェックボックス、108:連結オブジェクトフレーム、112:サブフォーム、119:ActiveXコントロール、122:トグルボタンの場合

            ctl.Enabled = False
            ctl.Locked = True
            
        Case 104
        '104:コマンドボタンの場合
        
            ctl.Enabled = False
            
    End Select

Next

End Sub
 

form_detail_lockというプロシージャです。
Detailとあるように、フォームの中でも詳細セクションだけにロック処理をするように作ってあります。

詳細セクションとは、フォームのデザインビューでいう下記の部分です。

では、プロシージャの中身を解説していきます。

最初に全体の構造からです。
このプロシージャでは、フォームの詳細セクションにあるすべてのコントロール(テキストボックスなど)に対して、ロック処理をかけていきます。

しかし、フォーム内にはテキストボックス以外にもチェックボックスやコンボボックス、コマンドボタンなど様々なコントロールが存在します。
コントロールが異なるとロックさせるための処理方法も変わってきます。

そのため、コントロールの種類を判別して適切なロック処理を行うようにしています。

最初の部分です。


 For Each ctl In Forms(form_name).Section(acDetail).Controls
 

ここでは、For Each … Next構文を使って、フォームの詳細セクションにあるすべてのコントロールをループするようにしています。

ctlはコントロールを格納するためのオブジェクト変数で、form_nameは対象のフォームの名前を格納する変数です。
form_nameを変更することで対象フォームを変えることができるため、汎用性の高いプロシージャにしてあります。

次に、変数に格納したコントロールの種類を判別していきます。


 Select Case ctl.ControlType
 

Select Case … End Select構文で判定しています。

コントロールオブジェクトには、コントロールタイプというプロパティがあり、この値でそのコントロールがテキストボックスなのかチェックボックスなのか、コマンドボタンなのかを判断できます。

今回のプロシージャでは以下の主なコントロールの値を使って判定しています。
利用するフォームにこれ以外のコントロールがある場合は、適宜コントロールタイプの値を変更してください。

コントロールタイプ
コマンドボタン104
チェックボックス106
連結オブジェクトフレーム108
テキストボックス109
リストボックス110
コンボボックス111
サブフォーム112
ActiveXコントロール119
トグルボタン122

次にコントロールタイプ別にロック処理を行います。

テキストボックスやコンボボックス、リストボックスの場合は利用不可・編集不可にしたうえで背景色をグレーにしたいので、


            ctl.Enabled = False
            ctl.Locked = True
            ctl.BackColor = 15921906
 

と処理します。

チェックボックスやサブフォームもほぼ同様ですが、背景色の設定が無いので、


            ctl.Enabled = False
            ctl.Locked = True
 

となります。

最後にコマンドボタンは編集ロックの設定もないため


            ctl.Enabled = False
 

としています。
コントロールの種類に対応しないプロパティを変更しようとするとエラーが出てしまいますので、ここは注意してください。

以上で編集ロックを行うことが可能です。

ロック解除を行うVBAのプロシージャ

最後に、ロックを逆に解除するVBAのプロシージャも記載しておきます。


Public Sub form_detail_unlock(form_name As String)
'■■■フォームの詳細セクションのロック解除をする■■■

For Each ctl In Forms(form_name).Section(acDetail).Controls
    
    Select Case ctl.ControlType
    
        Case 109, 110, 111
        '109:テキストボックス、110:リストボックス,111:コンボボックスの場合
        
            ctl.Enabled = True
            ctl.Locked = False
            ctl.BackColor = 16777215
        
        Case 106, 108, 112, 119, 122
        '106:チェックボックス、108:連結オブジェクトフレーム、112:サブフォーム、119:ActiveXコントロール、122:トグルボタンの場合

            ctl.Enabled = True
            ctl.Locked = False
            
        Case 104
        '104:コマンドボタンの場合
        
            ctl.Enabled = True
            
    End Select

Next

End Sub
 

ロック処理を行う際は、ロックを解除する処理もセットで利用することが多いので覚えておきましょう。
プロシージャの考え方はロック処理とほぼ同じです。

以上、フォームの編集をロックする機能をご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。