本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
VBAでリモートPCのディスク容量を一括取得するWMI自動化スクリプト
【背景と目的】
複数台のPCやサーバーのディスク空き容量を確認する際、手動ログインは非効率で時間がかかります。本コードはWMIを用いて、遠隔地から高速に容量を取得し、管理効率を最大化します。
【処理フロー図】
graph TD A["開始"] --> B["対象ホスト名の読み込み"] B --> C["WMIサービスへの接続試行"] C -->|成功| D["Win32_LogicalDiskをクエリ"] C -->|失敗| E["エラー情報を記録"] D --> F["容量・空き容量を算出し配列へ格納"] F --> G["シートへ一括出力"] E --> G G --> H["終了"]
【実装:VBAコード】
Option Explicit
' ================================================================
' 機能:リモートPCのディスク情報を一括取得
' 手法:WMI (Windows Management Instrumentation) を使用
' 備考:参照設定不要(Late Binding)
' ================================================================
Sub GetRemoteDiskInfo()
Dim ws As Worksheet
Set ws = ThisWorkbook.ActiveSheet
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
If lastRow < 2 Then
MsgBox "A列にリモートPC名(またはIP)を入力してください。", vbExclamation
Exit Sub
End If
' 高速化設定
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
Dim i As Long
Dim targetHost As String
Dim objWMIService As Object
Dim colDisks As Object
Dim objDisk As Object
Dim results() As Variant
ReDim results(1 To lastRow - 1, 1 To 4) ' ホスト, ドライブ, 全容量(GB), 空き(GB)
On Error Resume Next
For i = 2 To lastRow
targetHost = ws.Cells(i, 1).Value
results(i - 1, 1) = targetHost
' WMIサービスへの接続(タイムアウト対策としてエラーハンドリング)
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & targetHost & "\root\cimv2")
If Err.Number <> 0 Then
results(i - 1, 2) = "接続エラー: " & Err.Description
Err.Clear
Else
' 論理ディスク(ハードディスクのみ:DriveType=3)を取得
Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk Where DriveType = 3")
For Each objDisk In colDisks
results(i - 1, 2) = objDisk.DeviceID
results(i - 1, 3) = Round(objDisk.Size / 1073741824, 2) ' Byte to GB
results(i - 1, 4) = Round(objDisk.FreeSpace / 1073741824, 2) ' Byte to GB
' 複数ドライブがある場合は、簡易的に最初のドライブのみ、
' または必要に応じて行を分割するロジックをここに追加
Exit For
Next
End If
Set objWMIService = Nothing
Next i
On Error GoTo 0
' シートへの一括書き出し
ws.Range("B2").Resize(UBound(results, 1), UBound(results, 2)).Value = results
' 高速化設定の解除
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
End With
MsgBox "ディスク情報の取得が完了しました。", vbInformation
End Sub
【技術解説】
WMI (Win32_LogicalDisk): Windowsの管理情報にアクセスするインターフェースです。
DriveType = 3を指定することで、ネットワークドライブやCD-ROMを除外した「ローカルハードディスク」のみを抽出しています。Late Binding (遅延結合):
GetObjectを使用することで、実行環境に依存せず、特定のライブラリ参照設定を行わずに動作させることが可能です。高速化手法:
Application.ScreenUpdating = Falseによる描画停止と、計算結果を一度配列(results)に格納してからセルに一括出力する手法を採用し、処理時間を大幅に短縮しています。
【注意点と運用】
権限の壁: リモートPCに対して「管理者権限」を持つユーザーでExcelを実行している必要があります。
ファイアウォールの遮断: リモートPC側で「Windows Management Instrumentation (WMI)」の通信(RPC)が許可されていない場合、接続エラーとなります。
タイムアウト: ネットワーク上のPCがオフラインの場合、
GetObjectで数十秒フリーズする可能性があります。応答がないPCが多い場合は、事前にPingによる生存確認を挟むのが定石です。
【まとめ】
WMIを活用することで、ログイン不要のディスク監視がVBAのみで完結する。
配列処理を組み合わせることで、数十台規模のクエリでもストレスなく動作する。
エラー処理を徹底し、接続不可な端末があってもマクロ全体を停止させない構成が重要。

コメント