FileSystemObjectのDriveExistsメソッド
FileSystemObjectのDriveExistsメソッドは、引数で指定したドライブが存在するかどうかを判定します。
外付けのUSBメモリやCD-ROMやDVD-ROMなどのリムーバブルメディアが接続されている場合、それらの機器と接続されていればCDやDVDなどのディスクメディアが機器にセットされていなくてもドライブとして認識されます。
また、ネットワークドライブの割り当てで作成されたドライブも認識します。
FileSystemObjectの他のメソッドやプロパティは「FileSystemObjectとTextStreamのメソッド・プロパティ一覧」をご参照ください。
構文
Function DriveExists(DriveSpec As String) As Boolean
DriveSpec | ドライブ文字列を指定します。
文字列にドライブ配下のフォルダが含まれている場合はドライブとして認識されずFalseが返却されます。 |
戻り値 | 引数文字列がドライブとして認識できるかどうかを返却します。
ドライブであればTrueを返し、そうでなければFalseを返します。 |
認識できるドライブ文字列とは?
ドライブとして認識できる文字列には決まりがあります。
“C”、”C:”、”C:\”はドライブとして認識されTrueを返しますが、”C:\a”はドライブとは認識されずFalseが返されます。
これらを整理すると、パス区切り文字(¥マーク)の右側に文字がある場合(フォルダがある場合)はFalseになります。
実際のプログラムでドライブ名を取得したい場合は、多くの場合でドライブ名だけがわかっている状況よりも、ファイルパスやフォルダパスがわかっていてそこからドライブ名を取得したい、ということの方が多いです。
そのような場合は、パス区切り文字から左側だけを取得するようなコードを書いてもいいのですが、GetDriveNameメソッドを使い、その結果をDriveExistsメソッドの引数にすると期待した結果が得られます。
事前設定
以下のサンプルコードでは参照設定でFileSystemObjectクラスを利用できるようにしています。
FileSystemObjectクラスを利用するには、事前にVBA画面→ツールメニュー→参照設定、を選択し、参照設定ダイアログで「Microsoft Scripting Runtime」にチェックを付けます。
詳細は「VBAでのFileSystemObjectとTextStreamの使い方」の事前設定をご参照ください。
サンプルコード
固定ドライブのCドライブとネットワークドライブのSドライブでのドライブ存在チェックを行うサンプルです。
ファイルパスからドライブ名を抽出する方法として、GetDriveNameメソッドを使う方法とLeft関数とInStr関数を組み合わせる方法の2通りを書いています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
Sub FileSystemObjectDriveExists() Dim fso As New FileSystemObject '// FileSystemObjectクラス Dim bRet As Boolean '// 判定結果 Dim sFilePath As String '// ファイルパス '// ファイルパス bRet = fso.DriveExists("C:\aaaa\b.txt") Debug.Print "C:\aaaa - " & bRet '// False '// フォルダパス bRet = fso.DriveExists("C:\aaaa") Debug.Print "C:\aaaa - " & bRet '// False '// ドライブ名+パス区切り文字 bRet = fso.DriveExists("C:\") Debug.Print "C:\ - " & bRet '// True '// ドライブ名+コロン bRet = fso.DriveExists("C:") Debug.Print "C: - " & bRet '// True '// ドライブ名のみ bRet = fso.DriveExists("C") Debug.Print "C - " & bRet '// True '// ネットワークドライブ(Sドライブ) sFilePath = "S:\cccc\aaaa\test.txt" '// GetDriveNameでドライブ名を取得 bRet = fso.DriveExists(fso.GetDriveName(sFilePath)) Debug.Print "GetDriveName - " & bRet '// True '// Left関数+Instr関数でドライブ名を取得 bRet = fso.DriveExists(Left(sFilePath, InStr(1, sFilePath, "\") - 1)) Debug.Print "Left + Instr - " & bRet '// True End Sub |
DriveExistsメソッドはドライブ名としてありえない文字列が指定された場合はFalseを返します。
例えば、”あいうえお”という文字列や空文字列””を判定してもエラーとはならずFalseを返します。
引数の型不正以外ではエラーが発生することがありません。型不正の場合は「エラー438 オブジェクトは、このプロパティまたはメソッドをサポートしていません。」が発生します。
ただ、型不正はコーディングや検証のときに気がつくことが多いため、DriveExistsメソッドではエラーに遭遇することはほとんどないと思われます。
FileSystemObjectオブジェクト変数に対して、「Set fso = Nothing」のようなコードがありませんが、なくても問題ありません。詳細については「VBAでのFileSystemObjectとTextStreamの使い方」をご参照ください。