導入:なぜユーザー名やコンピュータ名の取得が重要なのか
実務でExcelマクロを組んでいると、「このファイルを開いているのが誰か?」「どのPCで実行されているか?」を識別したい場面によく遭遇します。例えば、特定の管理者だけが実行できる機能を作ったり、ログファイルに「いつ、誰が、どのPCで」処理を行ったかを記録したりする場合です。これらを自動で取得できれば、セキュリティの向上やトラブル時の原因究明に大きく役立ちます。今回は、Windowsの標準機能であるWshNetworkオブジェクトを使ったスマートな取得方法を解説します。
基礎知識:WshNetworkオブジェクトとは
WshNetworkオブジェクトは、Windows Script Host(WSH)というWindowsの管理用機能の一部です。これを使うと、ネットワークに関連する情報(ユーザー名、コンピュータ名、ネットワークドライブの割り当て状況など)を簡単に取得できます。Excel VBAでこの機能を利用するには、二通りの方法がありますが、実務では配布のしやすさを考慮して、今回紹介する「遅延バインディング」という手法を推奨します。
実装/解決策
VBAでWshNetworkオブジェクトを扱う際、通常は「参照設定」が必要ですが、これを行うと他のPCでファイルを開いた際に「参照エラー」が発生するリスクがあります。そのため、コード内でオブジェクトを作成する「CreateObject関数」を使用するのが、トラブルを避けるためのベストプラクティスです。これにより、特別な設定なしでどの環境でも確実に動作するようになります。
サンプルプログラム
以下のコードは、現在Excelを開いているユーザー名と、そのPCのコンピュータ名を取得してメッセージボックスに表示する実用的なサンプルです。コピー&ペーストしてそのままお使いいただけます。
Sub ShowUserInfo()
‘ WshNetworkオブジェクトを格納する変数を宣言
Dim WshNetwork As Object
‘ WScript.Networkオブジェクトを生成(CreateObjectを使うことで参照設定が不要になります)
Set WshNetwork = CreateObject(“WScript.Network”)
‘ ユーザー名とコンピュータ名を取得してメッセージ表示
‘ .UserName:ログイン中のユーザー名
‘ .ComputerName:コンピュータ名
MsgBox “現在ログイン中のユーザー名:” & vbCrLf & WshNetwork.UserName & vbCrLf & vbCrLf & _
“コンピュータ名:” & vbCrLf & WshNetwork.ComputerName, vbInformation, “システム情報取得”
‘ オブジェクトの解放
Set WshNetwork = Nothing
End Sub
応用・注意点
実務で活用する際のヒントをいくつか共有します。
1. ログ記録への応用
上記のコードで取得した情報を、テキストファイルや専用のログシートに書き込むことで、マクロの利用状況を可視化できます。「誰がいつ実行したか」をセルに自動入力させる処理と組み合わせるのがおすすめです。
2. 特定のユーザーのみ実行させる制限機能
If WshNetwork.UserName <> “管理者名” Then
MsgBox “権限がありません。”
Exit Sub
End If
このように記述すれば、簡易的な実行権限の制御を行うことができます。
3. 注意点
WshNetworkはあくまでWindows環境の情報に依存します。特殊なネットワーク環境や、仮想デスクトップ(VDI)環境では、想定と異なる名前が取得される場合もあります。必ず開発環境だけでなく、実際の運用環境でテストを行ってください。また、変数には必ず「Object型」を使用し、最後に「Set = Nothing」でメモリを解放する習慣を身につけることで、安定したマクロ運用が可能になります。
