Excel VBA 逆引き集 | 実行者名取得

Excel VBA
スポンサーリンク

実行者名取得

「誰がマクロを実行したか」を記録できると、監査・トレーサビリティ・権限確認がグッと楽になります。初心者でも迷わないように、取得方法の選び方とコードテンプレを丁寧に解説します。要点は「Windowsのログオン名」「Excelの表示名」「ドメイン+PC情報」の使い分けです。


実行者名の種類と使い分け(重要ポイントの深掘り)

  • Windowsログオン名(推奨):
    • PCにログインしているアカウント名(監査用途に適合)。
    • 例: “tanaka.taro” や “taro”。
  • Excelユーザー名:
    • Excelの「ユーザー名(オプションで設定)」で、表示用。自由に変更できるため監査には不向き。
  • ドメイン+ユーザー名:
    • 企業環境で「DOMAIN\username」を記録すると一意性が増す。
  • 補足情報:
    • コンピューター名、IP、メール(Outlookから)などを併記すると追跡がさらに明確。

重要な見極めは「変えられる名前か、変えられない名前か」。監査には「変えにくい情報(Windowsログオン名+ドメイン+PC名)」を使い、画面表示にはExcelユーザー名がカジュアルで便利です。


テンプレ1:最小・高速(環境変数でWindowsユーザー名)

Sub GetExecutor_Environ()
    Dim userName As String
    userName = Environ$("USERNAME") ' Windowsログオン名
    MsgBox "実行者(Windows): " & userName
End Sub
VB
  • メリット:
    • 軽い・速い・依存なし。 ほぼ全環境で使える標準手段。
  • 注意点(深掘り):
    • 環境変数は変更可能性がゼロではないため、厳密監査では「ドメイン併記」がおすすめ。

テンプレ2:WScript.Network(ドメイン/コンピューター名も取得)

Sub GetExecutor_WScriptNetwork()
    Dim net As Object
    Set net = CreateObject("WScript.Network")
    
    Dim userName As String, domain As String, computer As String
    userName = net.UserName
    domain = net.UserDomain
    computer = net.ComputerName
    
    MsgBox "実行者: " & domain & "\" & userName & vbCrLf & _
           "コンピューター: " & computer
End Sub
VB
  • メリット:
    • DOMAIN\usernamePC名 を同時に取得。監査・ログに最適。
  • 注意点(深掘り):
    • 企業環境でドメインに参加していないPCは、ローカル名(WORKGROUPなど)になることがある。

テンプレ3:Excelのユーザー名(表示用)

Sub GetExecutor_ExcelUserName()
    Dim displayName As String
    displayName = Application.UserName ' Excelの表示名(オプション)
    MsgBox "Excelユーザー名: " & displayName
End Sub
VB
  • メリット:
    • 見やすい表示名。 画面表示や注釈に便利。
  • 注意点(深掘り):
    • ユーザーが自由に編集できるため、監査には不向き。

テンプレ4:ブックの「作成者」プロパティ(ドキュメント証跡)

Sub GetWorkbookAuthor()
    Dim author As String
    author = ActiveWorkbook.BuiltinDocumentProperties("Author")
    MsgBox "ブック作成者: " & author
End Sub
VB
  • 用途:
    • 「このブックを最初に作ったユーザー」を確認。
  • 注意点(深掘り):
    • 作成後に変更される場合あり。実行者名とは別物。

テンプレ5:一括ログ出力(推奨セットで記録)

Sub LogExecutorInfo()
    Dim net As Object: Set net = CreateObject("WScript.Network")
    Dim userWin As String: userWin = Environ$("USERNAME")
    Dim userDom As String: userDom = net.UserDomain & "\" & net.UserName
    Dim pcName As String: pcName = net.ComputerName
    Dim excelName As String: excelName = Application.UserName
    
    ' シートへ一行記録(Logシート想定)
    Dim ws As Worksheet: Set ws = Worksheets("Log")
    Dim r As Long: r = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
    
    ws.Cells(r, 1).Value = Format(Now, "yyyy-mm-dd HH:NN:SS")
    ws.Cells(r, 2).Value = userDom          ' DOMAIN\username(監査用の主列)
    ws.Cells(r, 3).Value = userWin          ' Windowsユーザー名
    ws.Cells(r, 4).Value = pcName           ' コンピューター名
    ws.Cells(r, 5).Value = excelName        ' Excel表示名(参考)
    
    MsgBox "実行者ログを記録しました。Row=" & r
End Sub
VB
  • 重要ポイント(深掘り):
    • 監査の主キーは「DOMAIN\username」。Excel名は補助的に扱う。
    • 時刻とPC名を併記すると、誰のどの端末で実行されたかが一目で分かる。

テンプレ6:関数化してどこでも使えるように(再利用)

Public Function GetExecutorDomainUser() As String
    Dim net As Object: Set net = CreateObject("WScript.Network")
    GetExecutorDomainUser = net.UserDomain & "\" & net.UserName
End Function

Public Function GetExecutorWinUser() As String
    GetExecutorWinUser = Environ$("USERNAME")
End Function

Public Function GetExecutorExcelName() As String
    GetExecutorExcelName = Application.UserName
End Function

Public Function GetComputerName() As String
    Dim net As Object: Set net = CreateObject("WScript.Network")
    GetComputerName = net.ComputerName
End Function
VB
  • 使い方例:
    • LogWrite LOG_INFO, "Run by " & GetExecutorDomainUser() のようにログ基盤へ統合。

例題で練習(貼って試せる)

  • 例1:メッセージ表示で確認
    • Environ と WScript.Network の違いを実際の値で確認する。
  • 例2:Logシートに記録
    • 実行した日時・DOMAIN\username・PC名を追記し、履歴を残す。
  • 例3:処理ログ連携
    • 共通ログ基盤に「開始・終了」と「実行者」を一行で出力して監査可能にする。

実務の落とし穴と対策(重要ポイントの深掘り)

  • 落とし穴1:Excelユーザー名のみで監査
    • 対策: 監査には必ず Windowsアカウント(できれば DOMAIN\username)を使う。
  • 落とし穴2:ローカルPCでドメインがない
    • 対策: Environ(“USERNAME”)+ComputerName を併記し、端末識別で補完。
  • 落とし穴3:国際化・日本語名の文字化け
    • 対策: ログ保存をUTF-8(ADODB.Stream)やシート保存にして文字化けを避ける。
  • 落とし穴4:権限で取得不可
    • 対策: WScript.Network は通常ユーザー権限で動く。制限環境では Environ をフォールバックに設定。
  • 落とし穴5:情報の使い過ぎ(プライバシー)
    • 対策: 必要最小限に絞る。監査要件に合わせてフィールドを選定。

最小スターター

  • まずは Environ(“USERNAME”) を使って簡単に実行者名を取得。
  • 必要に応じて WScript.Network で DOMAIN\username と PC名を追加。
  • ログに残すテンプレ(テンプレ5)を貼って「いつ・誰が・どの端末で」実行したかを一行で記録。
タイトルとURLをコピーしました