<p><style_prompt_compliance></style_prompt_compliance></p>
<p>本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</p>
<h1 class="wp-block-heading">VBAでリモートPCのディスク容量を一括取得するWMI自動化スクリプト</h1>
<h3 class="wp-block-heading">【背景と目的】</h3>
<p>複数台のPCやサーバーのディスク空き容量を確認する際、手動ログインは非効率で時間がかかります。本コードはWMIを用いて、遠隔地から高速に容量を取得し、管理効率を最大化します。</p>
<h3 class="wp-block-heading">【処理フロー図】</h3>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
graph TD
A["開始"] --> B["対象ホスト名の読み込み"]
B --> C["WMIサービスへの接続試行"]
C -->|成功| D["Win32_LogicalDiskをクエリ"]
C -->|失敗| E["エラー情報を記録"]
D --> F["容量・空き容量を算出し配列へ格納"]
F --> G["シートへ一括出力"]
E --> G
G --> H["終了"]
</pre></div>
<h3 class="wp-block-heading">【実装:VBAコード】</h3>
<pre data-enlighter-language="generic">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
</pre>
<h3 class="wp-block-heading">【技術解説】</h3>
<ol class="wp-block-list">
<li><p><strong>WMI (Win32_LogicalDisk)</strong>: Windowsの管理情報にアクセスするインターフェースです。<code>DriveType = 3</code> を指定することで、ネットワークドライブやCD-ROMを除外した「ローカルハードディスク」のみを抽出しています。</p></li>
<li><p><strong>Late Binding (遅延結合)</strong>: <code>GetObject</code> を使用することで、実行環境に依存せず、特定のライブラリ参照設定を行わずに動作させることが可能です。</p></li>
<li><p><strong>高速化手法</strong>: <code>Application.ScreenUpdating = False</code> による描画停止と、計算結果を一度配列(<code>results</code>)に格納してからセルに一括出力する手法を採用し、処理時間を大幅に短縮しています。</p></li>
</ol>
<h3 class="wp-block-heading">【注意点と運用】</h3>
<ol class="wp-block-list">
<li><p><strong>権限の壁</strong>: リモートPCに対して「管理者権限」を持つユーザーでExcelを実行している必要があります。</p></li>
<li><p><strong>ファイアウォールの遮断</strong>: リモートPC側で「Windows Management Instrumentation (WMI)」の通信(RPC)が許可されていない場合、接続エラーとなります。</p></li>
<li><p><strong>タイムアウト</strong>: ネットワーク上のPCがオフラインの場合、<code>GetObject</code> で数十秒フリーズする可能性があります。応答がないPCが多い場合は、事前に <code>Ping</code> による生存確認を挟むのが定石です。</p></li>
</ol>
<h3 class="wp-block-heading">【まとめ】</h3>
<ul class="wp-block-list">
<li><p><strong>WMIを活用</strong>することで、ログイン不要のディスク監視がVBAのみで完結する。</p></li>
<li><p><strong>配列処理</strong>を組み合わせることで、数十台規模のクエリでもストレスなく動作する。</p></li>
<li><p><strong>エラー処理</strong>を徹底し、接続不可な端末があってもマクロ全体を停止させない構成が重要。</p></li>
</ul>
本記事は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のみで完結する。
配列処理を組み合わせることで、数十台規模のクエリでもストレスなく動作する。
エラー処理を徹底し、接続不可な端末があってもマクロ全体を停止させない構成が重要。
コメント