Excel VBA入門 | FileSystemObject-Drivesプロパティ(全てのドライブの取得)

Excel VBA入門

公開日:2017年6月6日

FileSystemObjectオブジェクトは、Windowsスクリプトテクノロジの1つであるScriptランタイムに属したオブジェクトです(Excel VBA上ではScriptingのメンバに位置づけされています)。

ここでは、利用できる全てのドライブを取得する方法としてFileSystemObjectオブジェクトのDrivesプロパティを使用する方法を解説します。

FileSystemObject-Drivesプロパティ(全てのドライブの取得)【Excel VBA入門】
目次

1.基本形

FSO.Drives→Drivesコレクションの取得

変数説明
FSOFileSystemオブジェクト変数。FileSystemオブジェクトとして宣言して格納した変数です。

利用できる全てのドライブオブジェクトの集まりであるDrivesコレクションを取得します。。

2.使用例

全てのドライブを取得し、ドライブ名をメッセージ表示します。

Sub 全ドライブの取得()

Dim FSO As New FileSystemObject  '(1)
Dim MyDrive As Drive           '(2)
Dim buf As String
'変数名は自由に設定してください。

For Each MyDrive In FSO.Drives   '(3)

buf = buf & MyDrive.DriveLetter & ","  '(4)

Next         '(3)

MsgBox buf   '(5)

End Sub

【解説】

(1)Dim FSO As New FileSystemObject
→FileSystemObjectオブジェクトを使用する際のおまじないです。FileSystemObjectオブジェクト変数FSOの宣言と変数FSOにFileSystemObjectオブジェクトの参照への代入を同時に1行で行っています。

おまじないには事前バインディングと実行時バインディングがありますが、ここでは事前バインディングを使用しています。

なお、FileSystemObjextオブジェクトを使用する場合には前もって、参照設定で「Microsoft Scripting Runtime」を有効にしておきます。

※FileSystemObjectオブジェクトの設定は「Excel VBA入門 | FileSystemObjectオブジェクト(概要)」を参照ください。

(2)Dim MyDrive As Drive
→取得したドライブを格納する変数を使用したいので、Drive型のオブジェクト変数MyDriveを宣言しています。

(3)For Each MyDrive In FSO.Drives ~ Next
→利用できる全てのドライブに対して繰り返し処理するためのコードです。

まず、全てのオブジェクト(ここではDriveオブジェクト)に対して繰り返し処理を行うには、For Each...Next ステートメントを使用します。

「For Each」に続けて、対象となるオブジェクトである「MyDrive」を記述します。変数MyDriveは(2)で宣言したDrive型のオブジェクト変数、すなわち、Driveオブジェクトです。

オブジェクト変数を宣言したのであれば、Setステートメントを利用して、「Set MyDrive = FSO.GetDrive(DriveName)」と、FilSystemObjectオブジェクトのGetDriveメソッドを使用して、Driveオブジェクトを取得したいのですが、今回は全てのドライブに対して繰り返し処理したいプログラムです。

そこで、「FSO.Drives」と、FilSystemObjectオブジェクトのDrivesプロパティを使用することで、Setステートメントを使用してDriveオブジェクトを取得する代わりに、Driveオブジェクトの集合体であるDrivesコレクションを取得しています。

「FSO.Drives」と記述することによって、Driveコレクションを取得しました。そして、「FSO.DrivesというDrivesコレクションの中(In)に存在するMyDrive(Driveオブジェクト)」ということで、「MyDrive In FSO.Drives」という記述になります。これで、利用できる全てのドライブを表しています。

以上をまとめると、「For Each MyDrive In FSO.Drives」になり、この記述からNextまでの間に記述されたコードについて繰り返し処理を行います。

(4)buf = buf & MyDrive.DriveLetter & ","
→ドライブ名を取得し、変数bufに文字列として追加して代入しています。

For Each...Nextステートメント内のコードであるため、繰り返し処理の対象になります。String型の変数bufに繰り返し取得したドライブ名を代入していきます。

ドライブ名を取得するために、DriveオブジェクトのDriveLetterプロパティを使用しています。Driveオブジェクト(および集合体であるDrivesコレクション)はFileSystemObjectオブジェクトと同じく、FileSystemObjectオブジェクトの系統に属するオブジェクトです(すなわち、Scriptingライブラリのメンバー)。Driveオブジェクトにはドライブを操作する様々なメソッド、プロパティが用意されています。

(5)MsgBox buf
→(3)(4)で取得した、全てのドライブ名をメッセージ表示します。

【補足】Drivesコレクション、Driveオブジェクトの位置づけ

DrivesコレクションおよびDriveオブジェクトは、FileSystemObjectオブジェクトの系統に属すると記載しましたが、DrivesコレクションもDriveオブジェクトも、FileSystemObjectオブジェクトに属する訳ではありません。

この2つのオブジェクトはVBE上では同じSctiptingライブラリのメンバーになります(同列の扱い)。従って、FileSystemObjectオブジェクトとDrivesコレクション、Driveオブジェクトにはそれぞれ別々のプロパティやメソッドが存在します。FileSystemObjectオブジェクトのプロパティやメソッドをDrivesコレクションやDriveオブジェクトでは扱うことはできません。またその逆もしかりです。

この点、ややこしい話になるのは言葉の問題によるものです。「MSDN ライブラリ」を見ると分かりますが、FileSystemObjectオブジェクトやDrivesコレクション、Driveオブジェクトをまとめて「FileSystemObjectオブジェクト」という用語で説明しています。

要するに「FileSystemObjectオブジェクト」を2つの意味で用いていることが、VBA上のFileSystemObjectオブジェクト系統の文法の理解を難しくしています。