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のパスワードを設定するよりもセキュリティ高めのいいドキュメントができそうです。

(こんな作りこんだ退職願を使いたくないという声もありそうだけど・・・)

 

ではまた。