こんにちは、もりです!
会社でマクロを作っているみなさん、マクロを実行できる人を制限したい場面ってありませんか?
いろいろな事情で、「不特定多数の人に実行されると都合が悪い」場面ってありますよね。
- 説明書を読まずに使ってエラーを起こす人がいる…
- 特定の管理職のみに使用を許可させたい
Excelブックのやっかいなところは、誰かひとりに渡すと、それがコピーされて社内に増殖し、今誰が使っているかわからなくなることです。
手っ取り早く思いつくのは、InputBoxでパスワード入力を求め、指定の文字列と一致したら後続の処理に進める方法ですが、
- パスワードが漏れたら意味ない
- ユーザーがパスワードを覚えなきゃいけない
などのデメリットがあります。
そこで、マクロ実行時に「ユーザーチェック」をすることで、実行制限する方法を紹介します。
マクロ実行時に「ユーザーチェック」をして、管理者が許可したユーザーのみ実行できるように、使用を制限する方法を紹介します。
Excelブックを閲覧のみにしたり、パスワードをかけることはせず、Excelブックの編集は誰でもOKで「マクロ実行のみ」制限します。
マクロ実行ユーザーの情報を取得する
マクロ実行時に「ユーザー情報」を取得する処理を作ります。ユーザー情報を取得する「WshNetworkオブジェクト」を使用します。
ユーザー名を取得するWshNetworkオブジェクト
「Windows Script Host Object Model」を参照設定します。ライブラリIWshRuntimeLibraryの「WshNetworkオブジェクト」で、ユーザー情報を取得することができます。
【参考】ユーザー名やコンピュータ名を取得する(WshNetworkオブジェクト)
サンプルコードです。
自宅PCでの実行結果です(アカウントにドメイン設定をしていれば、UserDomainプロパティにドメインが表示されると思います)
1 2 3 4 5 6 7 8 9 10 11 |
'参照設定:Windows Script Host Object Model Sub getUserInfo() Dim obj As IWshRuntimeLibrary.WshNetwork Set obj = New IWshRuntimeLibrary.WshNetwork Debug.Print obj.UserDomain 'DESKTOP-XXXXXXX Debug.Print obj.UserName 'morip Debug.Print obj.ComputerName 'DESKTOP-XXXXXXX End Sub |
特定ユーザーのみマクロの実行を許可する
それでは、本題の処理を作っていきます。
仕組みはこうです。
許可ユーザーを一覧化した「許可リスト」を作成します。マクロ実行ユーザーの「ユーザー名」を取得し、そのユーザーが「許可リスト」に存在するか否かをチェックします。
- 存在する → 処理続行
- 存在しない → 処理中止
とします。
【ポイント】許可リストの作成
「どこにリストを作るか?」がポイントです。
Excelブック内にリストを作成してしまうと、許可ユーザーを追加するたびに、Excelブックを「更新」して配布しなければなりません。
そこで、Excelブックとは別のどこか(社内共有フォルダ等)にリストを作成し、そのリストを参照する仕組みにします。こうすれば、Excelブックが知らぬ間にコピーされて増殖しても問題ありません。
許可リストの作り方や形式は色々ありますが、この記事では、テキストファイルに、1行ずつ列挙することとします。
【注意点】
このマクロを作成するうえでの注意点です。
- 「許可リスト」の配置場所は、アクセス権が制限されているフォルダではなく、全社員がアクセスできるフォルダにする。ただし、存在は秘密にする。
→許可リストのファイルにアクセスできない場合、ユーザーチェックできず、終了する仕組みにしています。
- ユーザーにコードが見えないよう、プロジェクトにパスワードをかけて保護しておく。
→当たり前ですが、VBAがわかる人にコードを見られたらすぐに無効にされてしまうので、パスワードをかけておきましょう。
【コード】
コードです。
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
Sub 許可ユーザのみマクロ実行を許可する() Dim result As String result = checkUser() Select Case result Case "OK" MsgBox "あなたは許可ユーザーです", vbInformation 'ここに処理を記述 'Call xxxx Case "NG" MsgBox "あなたは許可ユーザーではありません", vbCritical Case "ERROR" MsgBox "ユーザーチェックができません。管理者にお問い合わせください", vbExclamation End Select End Sub '許可ユーザであるか判定する '参照設定:Windows Script Host Object Model Function checkUser() As String Dim obj As IWshRuntimeLibrary.WshNetwork Set obj = New IWshRuntimeLibrary.WshNetwork Dim UserName As String UserName = obj.UserName '何らかの理由でファイルが開けない場合 On Error GoTo myError '「許可リスト」のフルパスを記述 Const TargetFile As String = "C:\Users\morip\OneDrive\work\userlist.txt" Open TargetFile For Input As #1 Do Until EOF(1) Dim AuthorizedUser As String Line Input #1, AuthorizedUser '許可ユーザと判定できれば、処理終了 If UserName = AuthorizedUser Then checkUser = "OK" Close #1 Exit Function End If Loop checkUser = "NG" Close #1 Exit Function myError: checkUser = "ERROR" End Function |
WshNetworkオブジェクトのUserDomainプロパティで、ドメイン単位で実行できる処理を制限することもできますね。
たとえば、社員と協力会社員でドメインが分かれていて「協力会社員の実行は一部制限したい」などの使い方もあると思います。
また、「誰でもマクロが実行できる」状況は、おもわぬトラブルを引き起こすこともあります。管理者からきちんと使い方をレクチャーされた人のみが実行できるよう制限することも、利用者の安全を考えれば、それはそれで、一種の優しさかもしれませんね。