こんにちは!業務自動化の現場を数多く渡り歩いてきたシニア・アーキテクトの私です。
日々の業務効率化のためにVBScriptを書いていると、避けて通れないのが「ファイルやフォルダの操作」ですよね。特に、USBメモリや外付けHDD、あるいは共有サーバーのネットワークドライブといった「外部ドライブ」を相手にする処理は、自動化のロジックとして非常に需要が高い分野です。
しかし、ここで多くの初学者が頭を悩ませる問題があります。それは──
「今日、そのUSBドライブ、本当に繋がってますか?」 という問題です。
もし、ドライブが物理的に抜かれていたり、ネットワークが切断されていたりする状態でファイルを書き込もうものなら、スクリプトは容赦なく「パスが見つかりません (Error)」を吐き出して強制終了してしまいます。朝出社して自動実行されるはずだったバッチ処理が、たった一本の抜けかけたUSBケーブルのせいで全滅……なんて、エンジニアとして最も避けたい悪夢ですよね。
今回は、そんな悲劇を未然に防ぎ、あなたのスクリプトを「絶対に転ばない堅牢な設計」へと引き上げるための最強の武器、`FileSystemObject` の `DriveExists` メソッド について、徹底的に解説していきましょう。
ここをクリアすれば、あなたのVBScriptスキルは「ただ動くものを作るレベル」から「現場で信頼されるプロの設計」へと確実にステップアップしますよ。ぜひ最後までついてきてくださいね!
—
1. なぜ「接続確認」がプロの必須作法なのか?
VBScriptで外部ドライブのファイルを操作する際、多くの初心者は次のようなコードを書きがちです。
‘ 【やってはいけない!危険なコード例】
Dim fso, targetFile
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ EドライブのUSBメモリからファイルをコピーしようとするが…
‘ もしEドライブがなかったら、ここでスクリプトがクラッシュ!
Set targetFile = fso.GetFile(“E:\Reports\data.txt”)
targetFile.Copy “C:\Backup\”
このコードの何がいけないのでしょうか?
VBScriptは非常に素直な言語ですが、存在しないリソースにアクセスしようとすると、容赦なくエラーダイアログを表示して止まります。これがバックグラウンドでサイレント実行される予定のタスクだった場合、エラーメッセージすら気づかれず、処理が途中で止まったまま放置されることになります。
「楽観的エラー処理」から「防御的設計」へ
プログラミングの世界では、「外部要因(ハードウェアやネットワーク)は、いつでも失敗するものだ」という前提でコードを書くのが鉄則です。これを防御的プログラミング(フェイルセーフ設計)と呼びます。
処理を始める前に、「そもそもそのドライブは存在しているか?」を優しく、確実にチェックする。そのための専用メソッドが、今回主役となる `DriveExists` なのです。
—
2. DriveExistsメソッドの基本と使い方
`FileSystemObject`(通称:FSO)には、ファイルやフォルダを操作するための多彩なメソッドが用意されていますが、その中で「ドライブ」の存在を文字通り「存在確認(Exists)」してくれるのが `DriveExists` です。
基本構文
object.DriveExists(drivespec)
- `object`: `Scripting.FileSystemObject` のインスタンス。
- `drivespec`: 調べたいドライブの文字(例: `”E:”` や `”E”`、ネットワークパスの場合は共有名まで含むこともありますが、基本はドライブレターを指定します)。
- 戻り値(返り値): ドライブが存在すれば `True`、存在しなければ `False` を返すブール値(真偽値)です。
非常にシンプルなサンプルコード
まずは、`DriveExists` がどのように動くのか、一番シンプルな形を見てみましょう。
‘ FSOのインスタンスを生成
Dim fso
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ Eドライブが存在するかチェック
If fso.DriveExists(“E:”) Then
WScript.Echo “Eドライブは接続されています!”
Else
WScript.Echo “警告:Eドライブが見つかりません。接続を確認してください。”
End If
たったこれだけです! `If` 文と組み合わせるだけで、ドライブが繋がっている時だけ処理を進める安全な分岐が作れましたね。
—
3. 【実践】現場でそのまま使える!安全なファイルコピー・スクリプト
それでは、学んだ知識を総動員して、実務でそのまま使える「外部ドライブからの安全なデータ回収スクリプト」を書いてみましょう。
このコードでは、以下の要素を網羅しています。
1. FSOの生成
2. ターゲットとなるUSBドライブ(例:`D:`ドライブ)の存在確認
3. ドライブが存在する場合のみ、安全にファイルをバックアップフォルダへコピー
4. エラー発生時のユーザーへの分かりやすい通知(ログ出力の代わり)
‘ ===================================================================
‘ 外部ドライブ接続チェック付きファイルバックアップ・スクリプト
‘ 対象: 初心者~マクロ脱却を目指す方
‘ ===================================================================
Option Explicit
Sub BackupFromUSB()
Dim fso
Dim targetDrive, sourceFile, destFolder
‘ 1. 定数の定義
targetDrive = “D:” ‘ 対象とするUSBドライブ
sourceFile = “D:\WorkData\report.xlsx” ‘ コピー元ファイル
destFolder = “C:\MyFolder\Backup\” ‘ コピー先フォルダ
‘ 2. FileSystemObjectの生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 3. 【最重要】ドライブの接続状態を事前にチェック
If Not fso.DriveExists(targetDrive) Then
‘ ドライブが存在しない場合の処理(異常終了を防ぐ)
MsgBox “エラー: 対象のドライブ (” & targetDrive & “) が接続されていません。” & vbCrLf & _
“USBメモリが正しく挿入されているか確認してください。”, _
vbCritical, “接続エラー”
Exit Sub ‘ 処理を安全に中断
End If
‘ 4. さらに、コピー元ファイル自体の存在も念のためチェック
If Not fso.FileExists(sourceFile) Then
MsgBox “エラー: ドライブは認識されていますが、指定されたファイルが見つかりません。” & vbCrLf & _
“パス: ” & sourceFile, _
vbExclamation, “ファイル不在”
Exit Sub
End If
‘ 5. コピー先フォルダが存在するかどうかもチェックし、なければ作成する
If Not fso.FolderExists(destFolder) Then
fso.CreateFolder(destFolder)
End If
‘ 6. すべての安全確認をクリアしたため、安全にファイルをコピー
‘ 引数 ‘True’ は、同名ファイルが存在する場合に上書きすることを許可する設定
fso.CopyFile sourceFile, destFolder, True
‘ 7. 完了通知
MsgBox “バックアップが正常に完了しました!”, vbInformation, “成功”
‘ オブジェクトの解放(メモリのクリーンアップ)
Set fso = Nothing
End Sub
‘ メイン処理の実行
BackupFromUSB()
コードのここがプロの技!
- 多重の安全確認(バリデーション): `DriveExists` で大元のハードウェア接続を確認し、その後に `FileExists` でファイル単位の存在をダブルチェックしています。この二段構えが実務でシステムを壊さない秘訣です。
- メモリのクリーンアップ (`Set fso = Nothing`): VBScriptのガベージコレクションに頼らず、使い終わったオブジェクトは明示的に解放する習慣をつけましょう。リソースリークを防ぐ美しいコードの基本です。
—
4. 初学者が陥りがちな「罠」と注意点
`DriveExists` は非常に強力ですが、VBScript特有の仕様や、Windowsの環境においていくつか注意すべきポイントがあります。現場でハマりがちな罠を先回りして共有しておきますね。
① ドライブレターのコロン(`:`)の有無に注意
`DriveExists(“E:”)` と指定するのが一般的ですが、`DriveExists(“E”)` とコロンを省略しても多くの環境では正しく判定してくれます。しかし、可読性と予期せぬ挙動を防ぐ意味で、ドライブ文字を指定する際は常にコロン(`:`)を含める(例: `”E:”`)書き方を習慣にしましょう。
② ネットワークドライブ(共有フォルダ)の落とし穴
`Drive` という言葉を聞くと、社内LANなどのネットワークドライブ(例: `Z:` ドライブ)もチェックできるか気になりますよね。
結論から言うと、`Z:` のようにローカルのドライブレターとして割り当てられているネットワークドライブであれば、`DriveExists(“Z:”)` で正常に判定できます。
しかし、ドライブレターを割り当てず、UNCパス(例: `\\fileserver\share\`)の形式で直接指定した場合は、`DriveExists` では正しく判定できません。ネットワーク上のフォルダ存在確認には、代わりに `FolderExists` メソッドを使用するのが正しいアプローチとなります。
‘ ネットワーク上の共有フォルダ(UNCパス)をチェックする場合
Dim fso
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ × DriveExists(“192.168.1.50\share”) は使えない!
‘ ○ FolderExists を使う
If fso.FolderExists(“\\fileserver\share”) Then
WScript.Echo “ネットワークフォルダにアクセス可能です。”
End If
この違いは、実務でファイルサーバーを扱う際に必ず役立つ知識ですので、ぜひ覚えておいてください。
—
まとめ:防御的設計でワンランク上のエンジニアへ
今回は、FileSystemObjectの `DriveExists` メソッドを用いて、外部ドライブの接続状態を安全に判定する方法について解説しました。
- 外部リソースは「いつでも失敗するもの」として設計する(防御的プログラミング)
- 処理の実行前に `fso.DriveExists(“E:”)` で接続を必ずチェックする
- ドライブの有無だけでなく、ファイル単位の有無やネットワークパス(UNC)との使い分けにも気を配る
ここをしっかりと押さえておけば、あなたが書くVBScriptは、現場で突然エラーを吐いて周囲を慌てさせるような「お騒がせスクリプト」から、静かに確実に仕事をこなす「頼れる相棒」へと生まれ変わります。
「ここをクリアすれば、VBScriptの基本はバッチリですよ!」
自信を持って、日々の自動化ライフを楽しんでくださいね。次回の応用編でも、現場で即効性のある知見をお届けします。お楽しみに!
