【ACCESS VBA】ユーザ認証を行う【業務システム開発】

この記事は約4分で読めます。

ACCESS VBAを学習しています。

今回はVBAを使ったについて学びます。

この記事では、使い方と使用例を掲載しています。

使い方については、よく使う部分だけを抜粋してご紹介しています。

詳細は公式のドキュメントをご覧ください。

説明

ネットで調べるとログイン機能を付与する方法がたくさんありますが、

この記事では、ACCESSの起動時にWindowsのユーザ名を自動で取得し、データベース内に登録されていればOK、登録されていなければNGという動作を試すことにします。

手順

  • Windowsのユーザ名をEnviron関数で取得
  • 取得したユーザ名を「社員マスタ」テーブルの「社員名」列で検索し、一致したら変数に格納
  • 取得したユーザ名と「社員マスタ」テーブルから取得した名前が一致したら認証成功、不一致なら認証失敗とする
  • 以上を起動時に自動実行するAutoExecとしてマクロを設定

後述しますが、良くない処理だと思います。いずれ修正します。

使用例(コード)

実装

 

処理の流れはコード内のコメント書いてある通りです。

ログインしようとしている方のユーザ名が、社員マスタに登録されている社員名に一致するかを確認し、一致した場合と不一致の場合で処理を分けてしまう考え方です。

この後、不一致のユーザなら強制的にファイルを閉じてしまうといった方法もあります。

※この方法は少し乱暴ですし、テストとして自分の名前が不一致になるようにして試すと、自分が開けなくなってしまいます。この場合でもShiftを押しながらACCESSを開くと起動時の処理(AutoExec)を無視できるので対処はできます。

DlookUp関数内での最後の部分「”担当者名 = ‘” & user_trying & “‘”」はややこしいと思いますので、後述の「VBA内での引用符(「”」、「’」、「&」)の使い分け」の記事をご覧ください。

 

ご紹介した後になってからですが、この書き方は良くないと思います。user_tryingとuser_registeredの値が一致するかを最後のIf文内で確認しようとしているのに、その手前のDlookUpで実質同じことをしてしまっています。

社員マスタテーブルにuser_tryingと同じ値があれば、user_registeredには社員名が入りますし、社員マスタテーブルにuser_tryingと同じ値がなければ、user_registeredはNullになります。

If文をIs_Nullを使って照合するか、DlookUp関数の部分を考え直す必要があります。

 

※戻り値のあるプロシージャの書き方

※変数宣言の方法

※Replace関数の書き方

Windowsのユーザ名を取得する

※Dlookupの書き方

※If文の書き方

MsgBoxでポップアップメッセージを表示する

※VBA内での引用符(「”」、「’」、「&」)の使い分け

備考

いちいちログイン機能を用意して、利用者ごとにIDとパスワードを付与しなくても良いので楽かと当初は感じました。そのようなメリットはありますが、よく考えてみるとデメリットもいくつかあり、実用上はあまりお勧めできない気がします。

メリット

  • 利用者側にとってパスワードを覚える必要がない
  • ログインの操作をする必要がない

デメリット

  • 端末ベースの認証になるため、利用権限を持つ社員の業務端末が盗まれてしまうと誰が使ったとしても認証をパスしてしまう
  • WindowsのPCでしか使えない
  • 端末変更と併せてユーザ名が変わった場合、社員情報を登録しているテーブルでも修正が必要

※マスタ側でのユーザ管理が必要なのはログイン機能を実装した場合でも同じ

参考

公式ドキュメントです。

Application.DLookup メソッド (Access) | Microsoft Learn

ACCESSの記事を一覧にしています。ACCESS VBAの正式な情報は公式ドキュメントを読むべきですが、このサイトでは実際に使う場面を想定して紹介しているので、公式ドキュメントと併せて読んでいただくと理解が深まると思います。

ACCESS記事一覧

コメント