【Excel VBA】Excelファイルにアクセス制御を実装してみた
はじめに
初めまして。我々カミカツキは、IT等を活用した総合的なソリューションを提供しております。
今回のテーマは、「Excelファイルにアクセス制御を実装してみた」です。
Excelは汎用的なツールで、出来ることには限りがあり、一定以上の複雑な仕組みの実装や、信頼性の確保などは難しいです。
そのため、用途としては、便利ツールを作成して業務効率化を実現するなどに限られやすいです。
しかし以前、多数のExcelファイルが連携し合って、さらに他のシステムともデータのやり取りをするような仕組みの構築が必要になったことがあり、その際に権限制御の仕組みも実装する必要が出てきました。
本来はそこまで行くともうシステムを開発しないとどうにもならないですが、システム構築前の検証として、そしてシステムが出来上がるための暫定運用として、Excelでも開発しようということになったのです。
そういう経緯で開発した際の知見として、ネットにも転がってない情報だったので有意義かと思い、是非ここでお伝えさせていただきたいと思います。また、応用して個人的な用途にも使い道があるものかと思います。
それでは、本文に入らせていただきます。
それぞれの目的に応じて使っていただくために、汎用的な部分だけにはなりますが、ご説明と、コードを記載した実際のxlsmファイルの提供をさせていただきます。
考え方のご説明
本来、どのユーザーにどの情報へのアクセスを許可するかというのは、別の仕組みで管理されているかと思います。そして、ユーザー情報は、環境変数で識別することが出来ます。環境変数USERNAMEとして社員番号を用いていて、それで識別しているという企業が多いかもしれません。
ですので、Excel VBA側で、自ファイルへのアクセス権はどのユーザーが持っているかという情報をそのアクセス権管理の仕組みから持ってきて、自ファイルを開いているユーザーの情報と比較することで、簡易的ですがアクセス制御を実装することが出来ます。
初め、ワークブックを開いたときにマクロを自動で動かして、アクセス権が無かったら強制終了する仕組みを実装しようとしていたのですが、実装する上で問題だったのが、ワークブックを開いた際はマクロが有効になっていない場合があり、そもそもマクロが実行されない場合があるということでした。
なので、ファイルを開いた際には表紙のみ表示しておき、中身を見るにはユーザーがボタンを押してマクロを起動する(そのためにはマクロを有効にする)必要がある実装にしました。
また、許可されたユーザーが実行した場合のみ中身のシートの表示をするマクロを実装していたのですが、中身のシート名が判明しているときは、以下のようにVBAエディタのイミディエイトウィンドウからコード手打ちで無理矢理表示状態にできてしまいます。さらに厄介なのは、このイミディエイトウィンドウは、エディタにパスワードを掛けるなどしても、無効化することが出来せん。
これは、中身のシートをアクティブにした際にも権限判定をさせ、権限がなければ再度非表示にすることで、権限のないユーザーに中身を見ることを出来なくしています。
最後に、ファイルを閉じる際ですが、この中身のシートを再度非表示にすることで、次回開いた際も初めは表紙のみが表示されるようにしています。
しかし、これはファイルが強制終了した場合には対応できません。そのような場合には、再度ファイルを開いてから閉じるというように、運用で対応します。
以上を踏まえて、次のような流れで、アクセス制御を実装しています。
少し正規のフローチャート図とは表記が違う部分もありますが、青い部分がアプリの動きで、カッコで囲まれた文章がユーザーの動きだと思っていただければ分かるかと思います。
xlsmファイルの紹介
簡単にですが、xlsmファイルのご紹介です。
ダウンロードページ(以下、有料部分)
もしこのVBAを使ってみたいと思っていただけた方は、ぜひ記事の購入をよろしくお願いいたします!
このようなプログラムは他人から見られないように、VBAコードエディタもパスワード保護したほうがいいですが、今回は勉強のためや書き換えて自分の目的に合ったアプリを作るために、コードも見られるようにしてあるので、ご自由にお使いください。
※動作確認は、Windows11で行っております。Macなどでの動作は保証できませんので、何卒よろしくお願いいたします。
ここから先は
この記事が気に入ったらチップで応援してみませんか?