こんにちは!VBScriptの世界へようこそ。
業務自動化の現場で、Excelマクロの次のステップとしてVBScriptに触れる方は本当に多いです。「マクロの記録」という温室から一歩外に出て、本格的なOS操作やファイル自動処理の荒波に漕ぎ出すわけですね。素晴らしい挑戦です!
さて、VBScriptでファイルやフォルダを操作する時、絶対に避けて通れないのが「FSO(Scripting.FileSystemObject)」という最強の相棒です。
今回は、このFSOの正しい召喚(インスタンス生成)の方法と、エラーをスマートに回避する「安全な存在チェック(Safe Check)」の極意を、優しく、そして本質的なところまで徹底的に解説します。ここさえクリアすれば、あなたの書くスクリプトは劇的にタフになりますよ。一緒にマスターしていきましょう!
—
1. なぜ「FSO」が必要なのか?
VBScriptには、標準でファイルを開いたり閉じたりする命令(`Open`ステートメントなど)が古くから備わっています。しかし、それらは機能が貧弱で、少し複雑なフォルダ構造を扱おうとすると、すぐにスクリプトがエラーで力尽きてしまいます。
そこで登場するのが、Windowsが標準で用意しているCOMコンポーネントである `Scripting.FileSystemObject`(通称:FSO) です。
FSOを使いこなせるようになると、以下のような操作が自由自在になります。
- ファイルやフォルダの「作成」「コピー」「移動」「削除」
- テキストファイルの読み書き
- ドライブ情報の取得(空き容量など)
まさに、ファイルシステムの支配者権限を手に入れるようなものです。
—
2. FSOの正しい召喚方法(インスタンス生成)
FSOを使うには、まずメモリ上にその実体(インスタンス)を生成する必要があります。ここで多くの初心者がつまずくポイントがあります。
VBScriptでオブジェクトを生成する際には、主に2つの方法があります。
1. `CreateObject` 関数を使う方法(推奨)
2. `New` キーワードを使う方法(VBScriptでは非推奨・注意が必要)
結論から言いますと、VBScriptでは`CreateObject(“Scripting.FileSystemObject”)`を使うのが鉄則です。
実装コード例:安全なインスタンス化
Option Explicit
‘ —————————————————-
‘ FSOインスタンス生成の基本パターン
‘ —————————————————-
Dim fso
‘ 1. CreateObjectを使ってメモリ上にFSOを召喚する
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 試しにデスクトップのパスでも取得してみましょう(WScript.Shellを使用)
Dim wsh, desktopPath
Set wsh = CreateObject(“WScript.Shell”)
desktopPath = wsh.SpecialFolders(“Desktop”)
WScript.Echo “FSOの準備が完了しました!”
‘ 2. 使い終わったらメモリを解放する(クリーンなコーディングの基本)
Set fso = Nothing
Set wsh = Nothing
> 💡 先輩エンジニアからの知見:オブジェクトの解放(`Set … = Nothing`)について
> VBScriptが終了する時、メモリは自動的にOSに返却されますが、長大なループ処理や複雑なスクリプトを書く場合、使い終わったオブジェクトをこまめに `Nothing` で解放する癖をつけておくと、メモリリークを防ぎ、動作の安定性が劇的に向上します。プロの作法としてぜひ身につけてくださいね。
—
3. 「痛いエラー」を防ぐ! `FileExists` と `FolderExists` による事前チェック
さて、ここからが本題の本質です。
プログラミング初心者が一番やりがちなミスが、「存在するかどうか分からないファイルやフォルダを、いきなり操作しようとしてエラー落ちする」というパターンです。
例えば、存在しないファイルを開こうとしたり、すでに無いフォルダを削除しようとしたりすると、VBScriptは容赦なく赤いエラーダイアログを出して強制終了します。これでは自動化スクリプトとして失格ですよね。
そこで、処理を実行する前に、FSOの持つメソッドで「本当にあるか?」を必ず確認します。これが Safeな存在チェック です。
- `fso.FileExists(パス)` : 指定したファイルが存在すれば `True`、なければ `False` を返す
- `fso.FolderExists(パス)`: 指定したフォルダが存在すれば `True`、なければ `False` を返す
実装コード例:安全な存在確認ロジック
以下のコードをメモ帳に貼り付けて、拡張子を `.vbs` にして保存し、実行してみてください。安全な分岐処理の感覚が掴めますよ。
Option Explicit
Dim fso, targetFile, targetFolder
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ チェックしたいファイル・フォルダのパス(ご自身の環境に合わせて書き換えてください)
targetFile = “C:\Test\sample.txt”
targetFolder = “C:\Test\Backup”
‘ — 【1】ファイルの存在チェック —
If fso.FileExists(targetFile) Then
WScript.Echo “【発見】ファイルが存在します: ” & targetFile
‘ ここにファイルを開く処理や削除する処理を書く
Else
WScript.Echo “【警告】ファイルが見つかりません。スキップします: ” & targetFile
End If
‘ — 【2】フォルダの存在チェック —
If fso.FolderExists(targetFolder) Then
WScript.Echo “【発見】フォルダが存在します: ” & targetFolder
‘ ここにフォルダ内の走査や移動処理を書く
Else
WScript.Echo “【警告】フォルダが存在しないため、新しく作成します: ” & targetFolder
‘ おまけ:フォルダが存在しないなら作っちゃえ!という安全なアプローチ
‘ fso.CreateFolder(targetFolder)
End If
Set fso = Nothing
—
4. 現場で役立つ!陥りやすい罠とエラー対策
最後に、実務でVBScriptを書くときにつまずきやすい「罠」をいくつかシェアしておきます。
罠①:パスの区切り文字(バックスラッシュ `\` とスラッシュ `/`)
Windowsのパス指定では `\`(円マーク、環境によってはバックスラッシュ)を使用しますが、VBScriptの文字列内ではエスケープシーケンスとして扱われることがあります。
基本的には、そのまま `C:\Folder\File.txt` と書いて問題ありませんが、変数結合をする際はパスの結合漏れに注意してください。
(※FSOにはパスを安全に結合してくれる `fso.BuildPath(folder, file)` という神メソッドもあります!)
罠②:ネットワークドライブや権限の問題
`FileExists` はファイルが存在していても、そのファイルを読み取る権限(アクセス権)がない場合に `False` を返すことがあります。「あるはずなのに `False` になる」という場合は、Windowsのアクセス権限やパスのスペルミス(全角・半角の違い)を疑いましょう。
—
まとめ
いかがでしたでしょうか? 今回の内容をまとめます。
1. FSOの生成は `CreateObject(“Scripting.FileSystemObject”)` を使え!
2. 使い終わったオブジェクトは `Set … = Nothing` でスマートに解放せよ!
3. ファイルやフォルダを操作する前には、必ず `FileExists` / `FolderExists` で存在確認(Safe Check)を行え!
ここをクリアできれば、あなたのVBScriptはもう「初心者レベル」ではありません。エラーに強く、現場で安心して動かせる「プロの自動化スクリプト」の第一歩を踏み出しています。
ぜひ、日々の業務効率化にこの知見を役立ててくださいね。それでは、次のステップでお会いしましょう!
