VBAマクロで、USBメモリやネットワークドライブ、CD-ROMドライブといった外部メディアに対してファイルの読み書きを行いたい場合があります。しかし、もしUSBメモリが抜かれていたり、ディスクがドライブに挿入されていなかったりすると、マクロは「デバイスの準備ができていません」という実行時エラーで停止してしまいます。
このようなエラーを未然に防ぐには、ファイル操作を行う直前に、対象のドライブが本当に利用可能な状態にあるかをVBAでチェックするのが確実です。
この記事では、FileSystemObject (FSO)
のDrive
オブジェクトが持つ**.IsReady
プロパティ**を使い、ドライブの状態を確認する方法を解説します。
【準備】参照設定
FSOを快適に利用するため、VBAエディタでツール
> 参照設定
を開き、**「Microsoft Scripting Runtime」**にチェックを入れておくことを推奨します。
完成したVBAコード
以下は、ユーザーに入力してもらったドライブレターを対象に、そのドライブが利用可能かどうかを判定してメッセージを表示するVBAコードです。
'参照設定: Microsoft Scripting Runtime
Sub CheckIfDriveIsReady()
' 変数を宣言します
Dim fso As New FileSystemObject
Dim targetDrive As Drive
Dim driveLetter As String
'--- ユーザーからドライブ文字を入力してもらう ---
driveLetter = InputBox("状態を確認したいドライブの文字を入力してください(例: D)", "ドライブの指定")
If driveLetter = "" Then Exit Sub ' キャンセルされたら終了
'--- 1. まず、そのドライブ文字が存在するかを確認 ---
If Not fso.DriveExists(driveLetter) Then
MsgBox UCase(driveLetter) & "ドライブは、このコンピュータに存在しません。", vbCritical
Exit Sub
End If
'--- 2. Driveオブジェクトを取得 ---
Set targetDrive = fso.GetDrive(driveLetter)
'--- 3. .IsReadyプロパティで、ドライブが利用可能か判定 ---
If targetDrive.IsReady = True Then
MsgBox UCase(driveLetter) & "ドライブは利用可能な状態です。", vbInformation
Else
MsgBox UCase(driveLetter) & "ドライブの準備ができていません。" & vbCrLf & _
"(ディスクが挿入されていない、接続が切れている等の可能性があります)", vbExclamation
End If
' オブジェクトを解放
Set targetDrive = Nothing
Set fso = Nothing
End Sub
コードのポイント解説
Drive
オブジェクトの .IsReady
プロパティ
If targetDrive.IsReady = True Then
このコードの核心部分です。Drive
オブジェクトの.IsReady
プロパティは、そのドライブがファイル操作を受け付けられる状態にあるかどうかを、**True
(準備OK)またはFalse
(準備未完了)**のブール値で返します。
このプロパティは、特に以下のような可変的な状態を持つドライブを扱う際に真価を発揮します。
- CD/DVD/Blu-rayドライブ: ディスクが挿入されているか?
- USBメモリ / SDカードリーダー: メディアが接続されているか?
- ネットワークドライブ: ネットワークに正しく接続されているか?
ハードディスク(Cドライブなど)の場合は、通常は常にTrue
を返します。
事前チェックの重要性
サンプルコードでは、.IsReady
を調べる前に、まずfso.DriveExists(driveLetter)
で「そもそもそのドライブが存在するか」をチェックしています。このように、ファイルやドライブを操作する際は、存在確認→状態確認、というように段階的にチェックを進めることで、よりエラーに強い安定したマクロを作成することができます。
【応用】全ドライブの状態を一覧化する
このテクニックを応用すれば、PCに接続されている全ドライブの状態を一覧化する、といったシステム情報取得ツールも作成できます。
Sub ListAllDriveStatus()
Dim fso As New FileSystemObject
Dim drv As Drive
Dim i As Long
i = 2
Range("A1:B1").Value = Array("ドライブ", "状態")
For Each drv In fso.Drives
Cells(i, 1).Value = drv.Path
If drv.IsReady Then
Cells(i, 2).Value = "準備完了"
Else
Cells(i, 2).Value = "準備未完了"
End If
i = i + 1
Next drv
Columns("A:B").AutoFit
End Sub
まとめ
リムーバブルメディアやネットワークドライブをVBAで操作する際は、エラーを防ぐために.IsReady
プロパティで状態を確認する習慣をつけましょう。
fso.GetDrive("ドライブ文字")
で、調べたいドライブのDrive
オブジェクトを取得する。If myDrive.IsReady = True Then
の形で、ドライブが利用可能かを判定する。- 利用可能であれば、ファイルの読み書き処理に進む。
この一手間を加えるだけで、ユーザーの環境に左右されにくい、堅牢で親切なマクロを作成することができます。