「デバイスの準備ができていません」を過去のものに。VBScriptでドライブ操作を「プロ」の品質へ昇華させる極限の知見
「マクロの記録はできるようになったけれど、いざ自分でコードを書こうとすると、USBメモリを抜いただけでエラーが出て止まってしまう……」
そんな経験はありませんか?
プログラミング初学者の皆さんが最初にぶつかる壁の一つ、それが「物理的な状態とプログラムの論理的な動きのズレ」です。プログラムは「そこにドライブがあるはずだ」と信じて疑いませんが、現実の世界では、ユーザーがUSBを抜いたり、CDを入れ忘れたりすることは日常茶飯事です。
今回は、そんな「予期せぬエラー」をスマートに回避し、あなたのスクリプトを「ただ動くもの」から「信頼される道具」へと進化させるための必須テクニック、`Drive.IsReady`プロパティの掌握術を伝授します。
ここをクリアすれば、VBScriptの基本はバッチリですよ。さあ、一緒に見ていきましょう。
1. なぜ、あなたのスクリプトは突然死するのか?
まず、エラーの正体を知ることから始めましょう。
VBScriptで `FileSystemObject` (FSO) を使い、`D:\` ドライブの中身を見ようとしたとします。しかし、もしDドライブが光学メディア(CD/DVD)で、ディスクが入っていなかったらどうなるでしょうか?
Windowsは、プログラムに対して「そんなデバイス、準備できてないよ!(Runtime Error ’70’: Permission denied や ’53’: File not found 等)」と悲鳴を上げます。これが、プログラムが強制終了してしまう原因です。
致命的なコードの例(初心者が陥りやすい罠)
' ❌ 危険な実装:ドライブの状態を確認せずにアクセスしている
Dim fso, drive
Set fso = CreateObject("Scripting.FileSystemObject")
Set drive = fso.GetDrive("D:")
' もしDドライブにメディアが入っていなければ、次の行で即座にクラッシュ!
MsgBox "ドライブの容量は " & drive.TotalSize & " バイトです。"
このコードは、「ドライブが存在すること」と「ドライブが使える状態であること」を混同しています。 ドライブレター(D:)自体が存在していても、中身(メディア)がなければ、プログラムはアクセスを拒否されるのです。
2. 救世主 `Drive.IsReady`:存在確認のプロトコル
ここで登場するのが、`Drive` オブジェクトが持つ `IsReady` プロパティです。
`IsReady` は、その名の通り「そのドライブは、今すぐ読み書きできる準備ができているか?」を `True`(準備OK)または `False`(準備NG)で返してくれる、非常に優秀なセンサーです。
「もしも」を想定する思考回路
プロのエンジニアは、コードを書くときに常にこう考えます。
「もし、もしも、もしも……」
- もし、USBが刺さっていなかったら?
- もし、CDが読み込み中だったら?
- もし、ドライブが空だったら?
この「もしも」に対する答えを、`If` 文を使って事前に用意しておく。これが、エラーを防ぐための「ガード(防護)」という考え方です。
3. 実践:安全なドライブ操作の実装パターン
それでは、実際に現場でそのまま使える、堅牢なコードを見てみましょう。
単にエラーを防ぐだけでなく、ユーザーに対して「何が原因で止まったのか」を優しく伝える、親切な設計にしています。
' =================================================================
' テーマ:Drive.IsReady を活用した安全なドライブアクセス
' 目的:未挿入のメディアへのアクセスによるランタイムエラーを防止する
' =================================================================
Option Explicit ' 変数の宣言を強制(プロの作法:バグを未然に防ぐ)
Dim fso, targetDriveLetter, drive
' 1. 設定:操作したいドライブレターを指定
targetDriveLetter = "D:"
' 2. FileSystemObjectの生成
Set fso = CreateObject("Scripting.FileSystemObject")
' 3. ドライブオブジェクトの取得を試みる
' ※ここでドライブレター自体が存在しない場合のエラーを防ぐため、
' 本来はさらに慎重なエラーハンドリングが必要ですが、今回はIsReadyに集中します。
On Error Resume Next ' ドライブレター自体が存在しない場合のエラーを一時的に無視
Set drive = fso.GetDrive(targetDriveLetter)
If Err.Number <> 0 Then
MsgBox "エラー: ドライブ '" & targetDriveLetter & "' がシステムに認識されていません。", vbCritical, "システムエラー"
WScript.Quit
End If
On Error GoTo 0 ' エラーハンドリングを元に戻す
' --- ここからが本番:IsReady による判定 ---
If drive.IsReady Then
' 【準備OKの場合】
' ここに本来やりたい処理(ファイルコピーなど)を記述します
MsgBox "ドライブ '" & targetDriveLetter & "' は準備完了です。" & vbCrLf & _
"空き容量: " & Int(drive.FreeSpace / 1024 / 1024 / 1024) & " GB", vbInformation, "成功"
Else
' 【準備NGの場合】
' プログラムを強制終了させるのではなく、ユーザーに状況を伝える
MsgBox "警告: ドライブ '" & targetDriveLetter & "' にメディアが挿入されていないか、" & vbCrLf & _
"使用できない状態です。メディアを確認してください。", vbExclamation, "ドライブ未準備"
End If
' 4. 後片付け(オブジェクトの解放)
' ライフサイクルを意識したメモリ管理は、大規模なシステムでは必須です
Set drive = Nothing
Set fso = Nothing
コードの解説:ここが「プロ」のポイント
1. `Option Explicit`: これを書く習慣をつけましょう。変数の型や宣言漏れをチェックしてくれる、最強の味方です。
2. `If drive.IsReady Then`: これが心臓部です。アクセスする前に、必ず「準備ができているか」を確認しています。
3. ユーザーへのフィードバック: エラーで黙って止まるのではなく、`MsgBox` で「何をすべきか(メディアを確認してください)」を伝えています。これが「使いやすいツール」の条件です。
4. オブジェクトの解放 (`Set … = Nothing`): VBScriptは小規模なスクリプトが多いですが、オブジェクトを使い終わったら明示的に解放する癖をつけることで、メモリリーク(メモリの無駄遣い)を防ぐ美しい習慣が身につきます。
4. さらなる高みへ:`IsReady` だけでは足りない時
最後に、少しだけ高度な話をしましょう。
`IsReady` は「デバイスが通信可能か」を教えてくれますが、「書き込みが可能か(ReadOnlyではないか)」までは保証してくれません。
もし、あなたが「ファイルを保存するスクリプト」を書くのであれば、`IsReady` に加えて、`drive.ReadOnly` プロパティもチェックすると、さらに完璧な、鉄壁のスクリプトになります。
If drive.IsReady Then
If drive.ReadOnly Then
MsgBox "準備はできていますが、書き込み禁止メディアです。"
Else
' 書き込み可能!安心して作業できます
End If
End If
まとめ:エラーを恐れず、エラーを「制御」しよう
プログラミングにおいて、エラーは敵ではありません。「想定内の出来事」としてコントロールすべき対象です。
今回学んだ `Drive.IsReady` は、そのコントロールのための第一歩です。
「もし、準備ができていなかったらどうするか?」という視点を持つだけで、あなたの作るプログラムの品質は、初心者レベルからエンジニアレベルへと一気に跳ね上がります。
一歩ずつ、着実に。
この調子で、VBScriptの深淵をマスターしていきましょう。応援していますよ!
