VBAでファイルサーバー上のフォルダにアクセス権を付与するツールを作成していたときに、自分自身のユーザの権限付与を忘れてしまう事件がありました。
こんなことにならないように、Windowsのログインユーザを取得して、ログインユーザ名(自分自身)を設定してしまえばいいじゃないかと考えた私はWindowsのログインを取得する処理を追加しました。
思ったより使えるコードでしたので、備忘として残しておきます。ぜひ使ってみてください。
利用するライブラリについて
ExcelのVBE画面のリボン内、ツールタブより、参照設定をクリックします。
産所う可能なライブラリファイルの一覧より、「Windows Script Host Object Model」にチェックを入力し、OKをクリックします。
ログインユーザを取得するコード
以下のコードを使用します。
変数 loginUser にログインユーザ名が入ります。サンプルコードでは、メッセージメッセージボックスにログインユーザ名を表示させるコードになっています。
Private Sub Get_LoginUser() Dim loginUser As String Dim WshNetworkObject As IWshRuntimeLibrary.WshNetwork Set WshNetworkObject = New IWshRuntimeLibrary.WshNetwork loginUser = WshNetworkObject.UserName MsgBox loginUser End Sub
このコードに関してはそのままコピペしてしまえば使うことが可能です。参照設定をした後に試してみてください。
シートに記載されているログインユーザと一致すればファイルを起動する実例
シートにログインユーザ名を記載しています。(orang はわたしのPCのユーザ名です)
設定するコードは以下です。
ログインユーザ名が一致したら無条件に開けるように、一致しなければ、開けないようにする(パスワード入力を促す)というコードです。
Private Sub Workbook_open() On Error Resume Next Application.ScreenUpdating = False Dim loginUser, msg, password As String Dim WshNetworkObject As IWshRuntimeLibrary.WshNetwork Set WshNetworkObject = New IWshRuntimeLibrary.WshNetwork loginUser = WshNetworkObject.UserName Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("Sheet1") ' セルC2内のがログインユーザと一致していれば開く If loginUser = ws.Range("C2").Value Then Application.ScreenUpdating = True Exit Sub End If ' 一致していなければ、パスワードの入力を求める msg = "見知らぬユーザが本ファイルを開こうとしています。" & vbCrLf & _ "本ファイルを開くためにはパスワードを入力してください。" password = InputBox(msg) If password <> "123456789" Then MsgBox "入力されたパスワードに誤りがあります。ファイルを開くことができません。" ThisWorkbook.Close SaveChanges:=False End If Application.ScreenUpdating = True End Sub
実際に起動してみると、問題なく開くことができました!
C2の名称を変更してみます。
ログインユーザと名前が異なるため、以下のメッセージボックスが表示されました!
(見知らぬって…笑)
さいごに
会社でレスペーパー化の流れがあり、直近でこのロジックを使って退職願をExcelで作成しました。
退職願の中で作成者・回付ルートにあらかじめユーザ名を入力しておき、Excelを開いたタイミングでログインユーザと退職願内のユーザ名を比較し、一致していなければ、開けないというロジックを考えました。これなら、退職願に関係ないユーザが開こうとしても開けないという仕組みを作ることができます。
人事が確認するときは、もちろんパスワードを入力して、開けるような仕組みにしてみました。
上記プログラムで注意しなければならないのは、マクロをあらかじめ有効化していないと開いたタイミングと同時に処理することができないということです。
この解決方法もあるのですが、これはまた別の機会で。。
普通にExcelのパスワードを設定するよりもセキュリティ高めのいいドキュメントができそうです。
(こんな作りこんだ退職願を使いたくないという声もありそうだけど・・・)
ではまた。