Excel VBA 逆引き集 | PC名取得

Excel VBA
スポンサーリンク

ねらいと使い分け

PC名(コンピューター名)は「どの端末で実行したか」を記録するための必須情報です。監査や障害調査、権限確認に役立ちます。初心者でも迷わないように、最短の取得方法から、企業ネットワーク向けの安定手法、ログ連携まで丁寧に解説します。

  • PC名の用途: 監査ログ、障害時の再現端末特定、設定の分岐(端末別のフォルダやプリンタ設定)
  • 取得方法の選び方:
    • Environ(“COMPUTERNAME”) は最短・軽量。
    • WScript.Network はドメインやユーザー名も併せて取得でき、企業環境で安定。
    • WMI(任意) は詳細情報(モデル名・シリアルなど)向けだが初心者には不要。

最短テンプレ(環境変数でPC名)

Sub GetComputerName_Environ()
    Dim pcName As String
    pcName = Environ$("COMPUTERNAME")
    MsgBox "PC名: " & pcName
End Sub
VB
  • 重要ポイント(深掘り):
    • 軽量・高速: 依存なしで即使える。多くのWindows環境で有効。
    • 落とし穴: 稀に環境変数が未設定のケースがあるため、フォールバックを用意すると安心。

安定テンプレ(WScript.NetworkでPC名・ドメイン・ユーザー)

Sub GetComputerName_Network()
    Dim net As Object
    Set net = CreateObject("WScript.Network")
    
    Dim pcName As String
    pcName = net.ComputerName
    
    Dim domainUser As String
    domainUser = net.UserDomain & "\" & net.UserName
    
    MsgBox "PC名: " & pcName & vbCrLf & _
           "実行者: " & domainUser
End Sub
VB
  • 重要ポイント(深掘り):
    • 企業ネットワークで安定: ドメイン参加端末でも正しく取得。
    • 監査に強い: 「DOMAIN\username」を同時記録できるため、誰がどの端末かが一目で分かる。
    • フォールバック戦略: 取得失敗時は Environ$("COMPUTERNAME") に切り替える実装が現場向き。

拡張テンプレ(IPアドレス・Excel表示名も合わせて取得)

Sub GetHostInfo_Extended()
    Dim net As Object: Set net = CreateObject("WScript.Network")
    Dim pcName As String: pcName = net.ComputerName
    Dim domainUser As String: domainUser = net.UserDomain & "\" & net.UserName
    Dim excelName As String: excelName = Application.UserName
    
    ' IPは簡易にWinsock(MSWinsockLibがない環境もあるため例示)
    Dim ip As String: ip = GetLocalIP_Simple() ' 下の関数参照(失敗時は空)
    
    MsgBox "PC名: " & pcName & vbCrLf & _
           "ユーザー: " & domainUser & vbCrLf & _
           "Excel表示名: " & excelName & vbCrLf & _
           "IP(参考): " & ip
End Sub

Private Function GetLocalIP_Simple() As String
    On Error Resume Next
    Dim ws As Object: Set ws = CreateObject("MSWinsock.Winsock")
    ws.RemoteHost = "example.com": ws.RemotePort = 80
    ws.Connect
    GetLocalIP_Simple = ws.LocalIP
    On Error GoTo 0
End Function
VB
  • 重要ポイント(深掘り):
    • Excel表示名は参考情報: 監査には使わず、画面表示向け。
    • IP取得は環境差あり: Winsockは導入状況次第。確実性重視ならPC名+ドメインユーザーで十分。

ログ連携テンプレ(PC名を監査ログに残す)

Sub LogExecutorWithPC()
    Dim net As Object: Set net = CreateObject("WScript.Network")
    Dim pcName As String: pcName = net.ComputerName
    Dim domainUser As String: domainUser = net.UserDomain & "\" & net.UserName
    
    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 = domainUser
    ws.Cells(r, 3).Value = pcName
    ws.Cells(r, 4).Value = "処理開始" ' イベント名や詳細
    
    MsgBox "ログ記録: Row " & r
End Sub
VB
  • 重要ポイント(深掘り):
    • 監査の最小セット: 「日時」「DOMAIN\username」「PC名」「イベント」を1行で残す。
    • 大量ログは配列で一括書き: 行単位の記録が増えるなら、後で配列→一括書きに切り替える。

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

  • 例1:最短取得で表示
    • 手順: GetComputerName_Environ を実行してPC名を確認。
  • 例2:安定取得で監査向け情報
    • 手順: GetComputerName_Network を実行して「PC名+DOMAIN\username」を確認。
  • 例3:ログ記録
    • 手順: 「Log」シートを作り、LogExecutorWithPC を実行して1行追加されることを確認。

実務の落とし穴と対策

  • 落とし穴1:環境変数未設定
    • 対策: まず WScript.Network、失敗したら Environ にフォールバック。
  • 落とし穴2:ドメイン非参加端末
    • 対策: UserDomain がワークグループでも PC名と合わせて記録すれば識別可能。
  • 落とし穴3:文字化け
    • 対策: ファイル保存時は UTF-8、シート記録ならそのままでもOK。
  • 落とし穴4:過剰なネットワーク依存
    • 対策: 取得はローカル情報中心(PC名、ユーザー名)。IPは任意。
  • 落とし穴5:ログが遅い
    • 対策: 節目だけ記録、またはまとめて配列書き。ファイルログはストリーム活用。

スターター手順(最短で導入)

  • 手順1: 最短テンプレ(Environ)でPC名を取得して動作確認。
  • 手順2: 安定テンプレ(WScript.Network)に切り替え、ドメインユーザーも取得。
  • 手順3: ログテンプレで日時・ユーザー・PC名を記録。必要ならイベント名を増やす。

タイトルとURLをコピーしました