ACCESS VBAを学習しています。
今回はVBAを使ったについて学びます。
この記事では、使い方と使用例を掲載しています。
使い方については、よく使う部分だけを抜粋してご紹介しています。
詳細は公式のドキュメントをご覧ください。
説明
ネットで調べるとログイン機能を付与する方法がたくさんありますが、
この記事では、ACCESSの起動時にWindowsのユーザ名を自動で取得し、データベース内に登録されていればOK、登録されていなければNGという動作を試すことにします。
手順
- Windowsのユーザ名をEnviron関数で取得
- 取得したユーザ名を「社員マスタ」テーブルの「社員名」列で検索し、一致したら変数に格納
- 取得したユーザ名と「社員マスタ」テーブルから取得した名前が一致したら認証成功、不一致なら認証失敗とする
- 以上を起動時に自動実行するAutoExecとしてマクロを設定
後述しますが、良くない処理だと思います。いずれ修正します。
使用例(コード)
実装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
'ユーザ名の取得 Public Function Get_UserName() #変数userを用意 Dim user As Variant #変数userにEnviron関数でユーザ名を取得 user = Environ("USERNAME") #変数userで取得したユーザ名から、氏名の間にある空白を除外。(山田 太郎→山田太郎にする) user = Replace(user, " ", "") #戻り値として変数userの値を指定 Get_UserName = user End Function '起動時の処理 Public Function Activation_Process() #変数user_registerdを用意(社員マスタとしてもともと登録されている方) Dim user_registered As Variant #変数userを用意(今ログインをしようとした方) Dim user_trying As Variant #Get_UserNameプロシージャを実行して、ユーザ名を変数user_tryingに代入 user_trying = Get_UserName #DlookUp関数を実行して「社員マスタ」テーブルの「担当者名」列内で変数user_tryingと一致するレコードの「担当者名」の値を取得 user_registered = DLookup("担当者名", "社員マスタ", "担当者名 = '" & user_trying & "'") #変数user_tryingと変数user_registeredの値が一致している場合 If user_trying = user_registered Then #認証成功とメッセージボックスで表示 MsgBox "認証成功", vbOKOnly #変数user_tryingと変数user_registeredの値が一致していない場合 Else #認証失敗とメッセージボックスで表示 MsgBox "認証失敗。未登録のユーザーです。", vbOKOnly End If End Function |
処理の流れはコード内のコメント書いてある通りです。
ログインしようとしている方のユーザ名が、社員マスタに登録されている社員名に一致するかを確認し、一致した場合と不一致の場合で処理を分けてしまう考え方です。
この後、不一致のユーザなら強制的にファイルを閉じてしまうといった方法もあります。
※この方法は少し乱暴ですし、テストとして自分の名前が不一致になるようにして試すと、自分が開けなくなってしまいます。この場合でも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関数の書き方
※Dlookupの書き方
※If文の書き方
※VBA内での引用符(「”」、「’」、「&」)の使い分け
備考
いちいちログイン機能を用意して、利用者ごとにIDとパスワードを付与しなくても良いので楽かと当初は感じました。そのようなメリットはありますが、よく考えてみるとデメリットもいくつかあり、実用上はあまりお勧めできない気がします。
メリット
- 利用者側にとってパスワードを覚える必要がない
- ログインの操作をする必要がない
デメリット
- 端末ベースの認証になるため、利用権限を持つ社員の業務端末が盗まれてしまうと誰が使ったとしても認証をパスしてしまう
- WindowsのPCでしか使えない
- 端末変更と併せてユーザ名が変わった場合、社員情報を登録しているテーブルでも修正が必要
※マスタ側でのユーザ管理が必要なのはログイン機能を実装した場合でも同じ
参考
公式ドキュメントです。
Application.DLookup メソッド (Access) | Microsoft Learn
ACCESSの記事を一覧にしています。ACCESS VBAの正式な情報は公式ドキュメントを読むべきですが、このサイトでは実際に使う場面を想定して紹介しているので、公式ドキュメントと併せて読んでいただくと理解が深まると思います。
コメント