VBAでファイル操作を行う際、ユーザーにバックアップ先のドライブを選択させたり、PCのストレージ構成を調査したりするために、現在利用可能なドライブの一覧を取得したい場合があります。
FileSystemObject (FSO)
の**Drives
コレクション**を使えば、ローカルのハードディスク(C:など)から、USBメモリ、ネットワークドライブに至るまで、PCが認識している全てのドライブの情報を簡単に取得できます。
この記事では、FSO.Drives
をループ処理して、ドライブの一覧をExcelシートに書き出す方法を解説します。
【準備】参照設定
FSOを快適に利用するため、VBAエディタでツール
> 参照設定
を開き、**「Microsoft Scripting Runtime」**にチェックを入れておくことを推奨します。
完成したVBAコード
以下が、PCに接続されている全てのドライブの「ドライブレター」と「ドライブの種類」を、アクティブシートのA列とB列に書き出すVBAコードです。
'参照設定: Microsoft Scripting Runtime
Sub ListAllDrives()
' 変数を宣言します
Dim fso As New FileSystemObject
Dim drv As Drive
Dim driveTypeNames As Variant
Dim rowIndex As Long
' DriveTypeの数値に対応する日本語名を配列に格納
driveTypeNames = Array("不明", "リムーバブルディスク", "ハードディスク", "ネットワークドライブ", "CD-ROM", "RAMディスク")
' 書き出し先のシートを準備
ActiveSheet.Cells.ClearContents
ActiveSheet.Range("A1:B1").Value = Array("ドライブレター", "種類")
rowIndex = 2
'--- 1. FSO.Drivesコレクションをループ処理 ---
For Each drv In fso.Drives
'--- 2. 各ドライブの情報をシートに書き出す ---
' .DriveLetterプロパティでドライブ名を取得
ActiveSheet.Cells(rowIndex, "A").Value = drv.DriveLetter & ":"
' .DriveTypeプロパティで種類(数値)を取得し、配列から対応する名前を取り出す
ActiveSheet.Cells(rowIndex, "B").Value = driveTypeNames(drv.DriveType)
rowIndex = rowIndex + 1
Next drv
ActiveSheet.Columns("A:B").AutoFit
' オブジェクトを解放
Set drv = Nothing
Set fso = Nothing
End Sub
コードのポイント解説
① FSO.Drives
コレクション
For Each drv In fso.Drives
FSO
オブジェクトの.Drives
プロパティは、PCが認識している全てのドライブの集まり(コレクション)を返します。For Each
ループでこのコレクションを巡回させることで、各ドライブをDrive
オブジェクトとして一つずつ変数(drv
)に取り出し、処理を行うことができます。
② Drive
オブジェクトのプロパティ
ループの中で、変数drv
は個々のドライブを表すDrive
オブジェクトを格納しています。このオブジェクトは、ドライブに関する様々な情報を持つプロパティを持っています。
.DriveLetter
: ドライブレター(例: “C”)を返します。.DriveType
: ドライブの種類を、以下のような数値で返します。
.DriveType が返す値 | driveTypeNames 配列の要素 | 意味 |
0 | driveTypeNames(0) | 不明 (Unknown) |
1 | driveTypeNames(1) | リムーバブルディスク (Removable) |
2 | driveTypeNames(2) | ハードディスク (Fixed) |
3 | driveTypeNames(3) | ネットワークドライブ (Network) |
4 | driveTypeNames(4) | CD-ROM |
5 | driveTypeNames(5) | RAM ディスク (RAMDisk) |
③ ドライブの種類のマッピング
driveTypeNames = Array("不明", "リムーバブルディスク", ...)
...
ActiveSheet.Cells(rowIndex, "B").Value = driveTypeNames(drv.DriveType)
.DriveType
プロパティが返すのは味気ない数値なので、ユーザーにとって分かりやすい表示にするために、あらかじめ数値の順番に対応した日本語名の配列(driveTypeNames
)を用意しています。
そして、drv.DriveType
で取得した数値を、この配列のインデックスとして使うことで、driveTypeNames(2)
→ "ハードディスク"
のように、数値を分かりやすい文字列に変換しています。
【応用】さらに詳細なドライブ情報を取得する
Drive
オブジェクトには、他にも便利なプロパティがあります。これらを使えば、より詳細なドライブ情報の一覧を作成できます。
プロパティ | 説明 |
.IsReady | ドライブが利用可能か (True /False ) |
.VolumeName | ボリューム名(例: “ローカル ディスク”) |
.TotalSize | ドライブの総容量(バイト) |
.FreeSpace | ドライブの空き容量(バイト) |
.FileSystem | ファイルシステムの種類(例: “NTFS”) |
まとめ
FSOのDrives
コレクションとDrive
オブジェクトを使えば、VBAからPCのドライブ構成を簡単に把握できます。
- **
For Each drv In fso.Drives
**で、全てのドライブをループ処理する。 - ループの中で、**
drv.DriveLetter
やdrv.DriveType
**といったプロパティから情報を取得する。 - (推奨)
.DriveType
が返す数値を、配列を使って分かりやすい文字列に変換する。
このテクニックは、ファイル操作を伴うマクロで、ユーザーに保存先ドライブを選択させたり、空き容量をチェックしたりといった、より高度な機能を追加する際に役立ちます。