ねらいと使い分け
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行追加されることを確認。
- 手順: 「Log」シートを作り、
実務の落とし穴と対策
- 落とし穴1:環境変数未設定
- 対策: まず WScript.Network、失敗したら Environ にフォールバック。
- 落とし穴2:ドメイン非参加端末
- 対策:
UserDomainがワークグループでも PC名と合わせて記録すれば識別可能。
- 対策:
- 落とし穴3:文字化け
- 対策: ファイル保存時は UTF-8、シート記録ならそのままでもOK。
- 落とし穴4:過剰なネットワーク依存
- 対策: 取得はローカル情報中心(PC名、ユーザー名)。IPは任意。
- 落とし穴5:ログが遅い
- 対策: 節目だけ記録、またはまとめて配列書き。ファイルログはストリーム活用。
スターター手順(最短で導入)
- 手順1: 最短テンプレ(Environ)でPC名を取得して動作確認。
- 手順2: 安定テンプレ(WScript.Network)に切り替え、ドメインユーザーも取得。
- 手順3: ログテンプレで日時・ユーザー・PC名を記録。必要ならイベント名を増やす。
