本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
VBA×WMI:リモートPCのディスク空き容量を高速に一括取得する
【背景と目的】
複数台のPCやサーバーのディスク残量を手動で確認するのは非効率です。WMIを利用し、ネットワーク越しに容量情報を取得してExcelへ集約する自動化手法を提案します。
【処理フロー図】
graph TD
A["開始"] --> B["ターゲットPCリストの読み込み"]
B --> C["WMIロケーターの初期化"]
C --> D{"リモート接続試行"}
D -- 成功 --> E["Win32_LogicalDiskクエリ実行"]
D -- 失敗 --> F["エラーログ記録"]
E --> G["取得データを配列に格納"]
G --> H["Excelシートへ一括書き出し"]
H --> I["終了"]
【実装:VBAコード】
外部ライブラリの参照設定を不要にする「実行時バインディング(Late Binding)」を採用し、書き込み速度を最大化する配列処理を組み込んでいます。
Option Explicit
' =================================================================
' 概要: リモートPCのディスク情報をWMIで取得しシートに出力
' 特徴: 配列処理による高速化、エラーハンドリング実装
' =================================================================
Sub GetRemoteDiskSpace()
Dim ws As Worksheet
Set ws = ThisWorkbook.ActiveSheet
Dim pcName As String
Dim lastRow As Long
Dim i As Long
Dim results() As Variant
Dim rCount As Long: rCount = 0
' 高速化設定
Application.ScreenUpdating = False
' PC名がA列に入力されていると仮定(A2から開始)
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
If lastRow < 2 Then Exit Sub
' 結果格納用配列(PC名, ドライブ, 容量GB, 空きGB, 使用率%)
ReDim results(1 To lastRow, 1 To 5)
Dim objLocator As Object
Dim objService As Object
Dim colDisks As Object
Dim objDisk As Object
On Error Resume Next
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
For i = 2 To lastRow
pcName = ws.Cells(i, 1).Value
If pcName <> "" Then
' リモートWMI接続(権限があるユーザーで実行している前提)
Set objService = objLocator.ConnectServer(pcName, "root\cimv2")
If Err.Number <> 0 Then
' 接続失敗時の処理
rCount = rCount + 1
results(rCount, 1) = pcName
results(rCount, 2) = "接続エラー: " & Err.Description
Err.Clear
Else
' 固定ディスク(DriveType=3)のみ取得
Set colDisks = objService.ExecQuery("Select * from Win32_LogicalDisk Where DriveType = 3")
For Each objDisk In colDisks
rCount = rCount + 1
results(rCount, 1) = pcName
results(rCount, 2) = objDisk.DeviceID
results(rCount, 3) = Round(objDisk.Size / 1024 / 1024 / 1024, 2) ' GB換算
results(rCount, 4) = Round(objDisk.FreeSpace / 1024 / 1024 / 1024, 2) ' GB換算
results(rCount, 5) = Round((1 - (objDisk.FreeSpace / objDisk.Size)) * 100, 1) & "%"
Next
End If
End If
Set objService = Nothing
Next i
On Error GoTo 0
' 結果の一括出力(C2セルを起点に出力)
If rCount > 0 Then
ws.Range("C2").Resize(rCount, 5).Value = results
End If
Application.ScreenUpdating = True
MsgBox "ディスク情報の取得が完了しました。", vbInformation
End Sub
【技術解説】
WbemScripting.SWbemLocator: リモートPCのWMIサービスへ接続するための標準オブジェクトです。参照設定なしで動作するよう
CreateObjectを使用しています。Win32_LogicalDisk: ディスク情報を保持するクラスです。
DriveType = 3を指定することで、ネットワークドライブや光学ドライブを除外し、ローカルのHDD/SSDのみを抽出します。配列による書き込み: セルへの書き込みを1回ずつ行うと処理が重くなるため、一旦
results配列にデータを蓄積し、最後に一括でシートへ展開しています。
【注意点と運用】
ファイアウォールの許可: リモート接続先PCで「Windows Management Instrumentation (WMI)」の通信(TCP 135等)が許可されている必要があります。
実行権限: 実行ユーザーがリモートPCに対して管理者権限(Administrator)を持っている必要があります。ドメイン環境での実行を推奨します。
タイムアウトの発生: 存在しないPCや電源が切れているPCへ接続しようとすると、
ConnectServerで待機時間が発生します。リストが多い場合は事前にPing等で生存確認を行うロジックの追加を検討してください。
【まとめ】
WMIを活用すれば、特別なエージェントソフトなしでリモートPCの容量監視が可能。
配列処理を組み合わせることで、数十台規模のデータ取得も数秒で完了する。
エラーハンドリングを徹底し、接続失敗時でもマクロが止まらないように設計することが運用のコツ。

コメント