ACCESS 起動時にログインする機能(VBAコード公開)

起動時にログインする機能

ACCESSでは、売上管理や顧客管理など、重要なデータを扱うことが多々あります。
そんなデータを誰でも参照でき、変更できる状態にしておくのは情報セキュリティ上の問題があると考えるケースも少なくないでしょう。

そういった場合には、ACCESSの起動時にユーザー名とパスワードでログインさせる機能を作成すると効果的です。
更に、ログインしたユーザーによって機能に制限をかけたり、ログインの履歴を残すことも可能です。

今回は、VBAを使ってACCESS起動時にログインする機能の作成方法をご紹介します。


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

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

完成形

最初に完成形を提示しましょう。

ACCESS起動時に下記のログイン画面がポップアップ表示されます。

この画面でログインするまでは、他の操作ができないように制御します。

更に、ログインの履歴が別フォームで参照できます。

上記が完成形になります。

作成するACCESSオブジェクト

上記の機能を実現するために必要なACCESSオブジェクトは以下の通りです。
テーブルやフォームの名称は自由ですが、今回はサンプルとしてこの名称で作成します。

テーブルMST_アカウントアカウントとパスワードを管理するテーブル
TRN_ログイン履歴ログイン履歴を記録するテーブル
クエリSORT_アカウントログイン画面でアカウントをプルダウン表示するためのクエリ
LIST_ログイン履歴ログイン履歴をフォーム表示するためのクエリ
フォームT_ログインログイン時にアカウントとパスワードを入力するフォーム
T_ログイン履歴ログイン履歴を一覧表示するフォーム

テーブルの作成

では、作成方法を見ていきましょう。
まずはテーブルの作成です。

アカウントとパスワードを管理するテーブル

初めに、アカウントとパスワードを管理するテーブルを作成しましょう。

テーブルのレイアウトは以下の通りです。

権限によって機能を制御するために、アカウントごとに管理者権限、制限権限のフラグを付けられるようにしておきます。

サンプルでは以下のアカウントを作成しておきました。

ログイン履歴を記録するテーブル

次に、ログイン履歴を管理するためのテーブルです。

こちらも、テーブルレイアウトは下記の通りです。

アカウントIDが、先ほど作成したMST_アカウントテーブルのアカウントIDと紐づけられます。
こちらは自動入力されるテーブルですので、テーブルさえ作っておけばOKです。

この2つでテーブルの作成は完了です。

クエリの作成

続いてクエリの作成です。
クエリは2種類作成しますが、どちらもあとで作成するフォームで表示するために作成します。

ログイン画面でアカウントをプルダウン表示するためのクエリ

このクエリは、MST_アカウントのレコードの内、削除されていないアカウントのみを表示するクエリです。

クエリの設定は以下の通りです。

ログイン履歴をフォーム表示するためのクエリ

こちらのクエリは、ログイン履歴を表示する際に、アカウントIDと紐づいたアカウント名を表示するためのものです。

そのため、MST_アカウントとTRN_ログイン履歴の二つのテーブルをリレーションさせて作成します。

フォームの作成

ここまでで、テーブルとクエリの準備はできました。
いよいよ、フォームを作っていきましょう。

ログイン時にアカウントとパスワードを入力するフォーム

ログイン画面です。
フォームのデザインビューでは下記のようになります。

非連結のコントロールが2つあるだけの、比較的単純なフォームです。

上段のIDの部分はプルダウンで作成しています。
プルダウンを作成する際は、非連結のテキストボックスを作成後、右クリックして「コントロールの種類の変更」→「コンボボックス」を選択します。

作成したコントロールのプロパティは以下のように設定します。

値集合ソースに「SORT_アカウント」を設定して、アカウント一覧がプルダウン表示されるようにします。

コンボボックスの詳しい作成方法は以下の記事をご覧ください。

ACCESS テーブルを元にコンボボックスを作る方法

さらに、このフォームは起動時に最前面に表示されないといけません。
そうしないと他のフォームなどを操作できてしまうためです。

そのため、フォームのデザインビューで以下のように設定します。

ポップアップは、フォーム型のフォームと同じタブに入らず、最前面に出てくる設定です。
作業ウィンドウ固定は、このウィンドウが表示されている間は他のウィンドウの操作ができなくなる設定です。

この2つの設定がログイン画面には必須です。

その上で、このログインフォームを起動時に表示されるようにします。

ACCESSメニューのファイルからオプションを選択し、表示されたACCESSのオプション画面で「現在のデータベース」タブを表示します。

そこでフォームの表示に、今回作成したログインのフォームを設定します。

VBAプログラミング

さて、ログイン画面を作成したので、ログイン処理をVBAで作成しましょう。

ログインフォームで、ログインボタンのクリック時イベントを設定します。

設定されているイベントプロシージャは下記の通りです。


 Private Sub ログイン_ボタン_Click()

    'アカウント未選択
    If Me!アカウントID = 0 Then

        MsgBox "アカウントを選択してください。", vbCritical + vbOKOnly, "アカウント未選択"
        Exit Sub
        
  'パスワード未入力
    ElseIf IsNull(Me!パスワード) = True Or Me!パスワード = "" Then

        MsgBox "パスワードを入力してください。", vbCritical + vbOKOnly, "パスワード未入力"
        Exit Sub

    'パスワードチェック
    ElseIf Me!パスワード <> DLookup("パスワード", "MST_アカウント", "アカウントID = " & Me!アカウントID) Then

        MsgBox "パスワードが間違っています。", vbCritical + vbOKOnly, "パスワード間違い"
        Exit Sub

    End If
    
    '権限確認
    kanri_kengen = DLookup("管理者", "MST_アカウント", "アカウントID = " & Me!アカウントID)
    seigen_kengen = DLookup("制限", "MST_アカウント", "アカウントID = " & Me!アカウントID)

    'ログイン履歴記録
    Call login_rec(Me!アカウントID)

    DoCmd.Close
    DoCmd.OpenForm "F_メインメニュー"

 End Sub

コードを解説します。

まず、最初はアカウント未選択やパスワード未入力時のエラー処理です。

こちらは、IF文でアカウントID、パスワードそれぞれのコントロールの値を判定して、入力されていない場合はエラーメッセージをMsgBox関数で表示します。
そして、Exit Subでプロシージャを終了させて、ログイン画面に戻ります。

このあたりのエラー処理を作っておかないと、起動後に何もできなくなる可能性があるのでご注意ください。

そして、パスワードのチェックです。

パスワードチェックは、コントロールに入力されたパスワードと、MST_アカウントに記録されているパスワードをDLookup関数で突合してチェックします。

こちらも、間違っていた場合はExit Subでプロシージャを終了させて、ログイン画面に戻ります。

そして、ここまでにエラー処理でExit Subされていなければ、IF文を終了させて通常処理に入ります。

まず、権限の確認です。

権限は入力されたアカウントIDに付与されている権限をDLookup関数でチェックします。
その上で、管理権限であればkanri_kengen、制限であればseigen_kengenの変数に値を入力します。

この2つの変数は、ACCESSの操作中に他のフォームで権限によって操作の可否を制御したい場合に使用します。
そのため、標準モジュールで以下のように変数の宣言をしておきます。


 Public keiri_kengen As Boolean
 Public seigen_kengen As Boolean

ACCESS全体で使用するので「Public」で宣言していることにご注意ください。
また、値は「True」「False」が入りますので、変数のデータ型はBoolean型にします。

さて、コードの解説に戻りましょう。

権限の確認後はログイン履歴の記録を行います。

こちらはサンプルでは「login_rec」という別プロシージャを作成して呼び出すようにしています。
login_recの内容は以下の通りです。


Public Sub login_rec(login_id As Long)

'変数にADOオブジェクトを代入
Set cnn = CurrentProject.Connection
Set rst1 = New ADODB.Recordset
rst1.CursorLocation = adUseClient

'レコードセットを取得
rst1.Open "TRN_ログイン履歴", cnn, adOpenKeyset, adLockOptimistic

rst1.AddNew

    rst1!アカウントID = login_id
    rst1!ログイン日時 = Now

rst1.Update

'終了処理
rst1.Close: Set rst1 = Nothing
cnn.Close: Set cnn = Nothing

End Sub

ADOを利用して、TRN_ログインテーブルにレコードを追加する処理をしています。

ADOの使い方についてはこちらの記事をご覧ください。

ADOを使ったレコード操作

処理内容を解説します。

まず、login_recは引数として login_id を指定するように設定しています。
このため、元のプロシージャから呼び出す際に


 Call login_rec(Me!アカウントID)

と記載して、アカウントIDの値を渡しているわけです。

後の処理は比較的簡単で、


    rst1!アカウントID = longi_id
    rst1!ログイン日時 = Now

で、アカウントIDと現在の時間(Now)を指定して、rst1.Updateでレコードを追加しています。

このログイン履歴の記録処理は必須ではありませんので、不要であれば削除してかまいません。

元のコードの解説に戻りますと、最後に

 
   DoCmd.Close
    DoCmd.OpenForm "F_メインメニュー"

で、ログインのフォームを閉じ、本当のメインメニューを表示する、という処理をしてログイン処理が完了します。

それほど難しい機能ではないのですが、解説すると長いですね。

ログイン履歴を一覧表示するフォーム

最後にログイン履歴を一覧表示するフォームです。

こちらは、作成したクエリ「LIST_ログイン履歴」をレコードソースにして、帳票フォームでフォームを作成します。

デザインビューでは下記のようになります。

以上、起動時にログインする機能についてご紹介しました。


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

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

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

サービス一覧

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