VBA

【ExcelVBA】許可ユーザーのみがマクロを実行できるよう制限する

こんにちは、もりです!

会社でマクロを作っているみなさん、マクロを実行できる人を制限したい場面ってありませんか?

いろいろな事情で、「不特定多数の人に実行されると都合が悪い」場面ってありますよね。

  • 説明書を読まずに使ってエラーを起こす人がいる…
  • 特定の管理職のみに使用を許可させたい

 

Excelブックのやっかいなところは、誰かひとりに渡すと、それがコピーされて社内に増殖し、今誰が使っているかわからなくなることです。

 

手っ取り早く思いつくのは、InputBoxでパスワード入力を求め、指定の文字列と一致したら後続の処理に進める方法ですが、

InputBoxでパスワード入力
  • パスワードが漏れたら意味ない
  • ユーザーがパスワードを覚えなきゃいけない

などのデメリットがあります。

 

そこで、マクロ実行時に「ユーザーチェック」をすることで、実行制限する方法を紹介します。

マクロ実行時に「ユーザーチェック」をして、管理者が許可したユーザーのみ実行できるように、使用を制限する方法を紹介します。

 

Excelブックを閲覧のみにしたり、パスワードをかけることはせず、Excelブックの編集は誰でもOKで「マクロ実行のみ」制限します。

ユーザー制限

マクロ実行ユーザーの情報を取得する

マクロ実行時に「ユーザー情報」を取得する処理を作ります。ユーザー情報を取得する「WshNetworkオブジェクト」を使用します。

ユーザー名を取得するWshNetworkオブジェクト

「Windows Script Host Object Model」を参照設定します。ライブラリIWshRuntimeLibraryの「WshNetworkオブジェクト」で、ユーザー情報を取得することができます。

【参考】ユーザー名やコンピュータ名を取得する(WshNetworkオブジェクト)

 

サンプルコードです。

自宅PCでの実行結果です(アカウントにドメイン設定をしていれば、UserDomainプロパティにドメインが表示されると思います)

特定ユーザーのみマクロの実行を許可する

それでは、本題の処理を作っていきます。

仕組みはこうです。

許可ユーザーを一覧化した「許可リスト」を作成します。マクロ実行ユーザーの「ユーザー名」を取得し、そのユーザーが「許可リスト」に存在するか否かをチェックします。

  • 存在する → 処理続行
  • 存在しない → 処理中止

とします。

【ポイント】許可リストの作成

「どこにリストを作るか?」がポイントです。

Excelブック内にリストを作成してしまうと、許可ユーザーを追加するたびに、Excelブックを「更新」して配布しなければなりません。

 

そこで、Excelブックとは別のどこか(社内共有フォルダ等)にリストを作成し、そのリストを参照する仕組みにします。こうすれば、Excelブックが知らぬ間にコピーされて増殖しても問題ありません。

許可リストにアクセス

許可リストの作り方や形式は色々ありますが、この記事では、テキストファイルに、1行ずつ列挙することとします。

許可リスト

【注意点】

このマクロを作成するうえでの注意点です。

  • 「許可リスト」の配置場所は、アクセス権が制限されているフォルダではなく、全社員がアクセスできるフォルダにする。ただし、存在は秘密にする。

→許可リストのファイルにアクセスできない場合、ユーザーチェックできず、終了する仕組みにしています。

 

  • ユーザーにコードが見えないよう、プロジェクトにパスワードをかけて保護しておく。

→当たり前ですが、VBAがわかる人にコードを見られたらすぐに無効にされてしまうので、パスワードをかけておきましょう。

【コード】

コードです。

WshNetworkオブジェクトのUserDomainプロパティで、ドメイン単位で実行できる処理を制限することもできますね。

たとえば、社員と協力会社員でドメインが分かれていて「協力会社員の実行は一部制限したい」などの使い方もあると思います。

 

また、「誰でもマクロが実行できる」状況は、おもわぬトラブルを引き起こすこともあります。管理者からきちんと使い方をレクチャーされた人のみが実行できるよう制限することも、利用者の安全を考えれば、それはそれで、一種の優しさかもしれませんね。