【Excel VBA】FSOでドライブが利用可能かを確認する方法 (.IsReady)

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プロパティで状態を確認する習慣をつけましょう。

  1. fso.GetDrive("ドライブ文字")で、調べたいドライブのDriveオブジェクトを取得する。
  2. If myDrive.IsReady = True Then の形で、ドライブが利用可能かを判定する。
  3. 利用可能であれば、ファイルの読み書き処理に進む。

この一手間を加えるだけで、ユーザーの環境に左右されにくい、堅牢で親切なマクロを作成することができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次