こんにちは!VBScriptの世界へようこそ。
業務の自動化を進めていると、こんな壁にぶつかったことはありませんか?
「自分のパソコンでは完璧に動くのに、別のパソコンや共有サーバーにファイルを移した途端、エラーで止まってしまう……」
原因の多くは、プログラムの中に書き込まれた「固定のパス(C:\Work\data.txtなど)」です。この「環境依存」の呪縛から解放され、どこに持ち運んでも動く「ポータブルなプログラム」を作るための極意を、今日は一緒に紐解いていきましょう。
ここをクリアすれば、あなたの書くVBScriptは見違えるほど頑丈になりますよ。さあ、一歩ずつ進んでいきましょう!
—
1. なぜ「固定パス」は悪者なのか?
VBScriptでファイル操作を行うとき、初心者の方が一番最初に書くコードは、大体こんな形になります。
‘ 【やってはいけない例】固定パスの罠
Dim fso, file
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ Cドライブの特定フォルダを直接指定している
Set file = fso.OpenTextFile(“C:\MyFolder\config.txt”, 1)
このコード、あなたのPCの `C:\MyFolder\` に `config.txt` があれば動きます。しかし、以下のような状況になったらどうでしょう?
- デスクトップにフォルダごと移動した
- USBメモリに入れて別のPCで動かした
- 共有サーバー(`\\server\share\folder`)に配置した
当然、`C:\MyFolder\` なんて存在しないので、「ファイルが見つかりません(エラー 53)」という悲しいエラーが発生します。プログラムの置き場所が変わるたびにコードを書き換えるなんて、エンジニアの仕事としてスマートではありませんよね。
—
2. 【極意】「今、自分はどこにいるのか?」を知る
この問題を鮮やかに解決する鍵が、VBScriptが標準で持っているマジックワード、`WScript.ScriptFullName` と、ファイルシステムオブジェクト(FSO)の `GetParentFolderName` です。
考え方はとてもシンプル。
「プログラム自身が『今、自分がどこにいるファイルか』を調べ、その親フォルダの場所を起点にしてファイルの場所を探せばいい」のです。
図解でイメージしてみましょう。
[USBメモリ全体の構造]
┗ 📂 業務ツール/
┣ 📜 main.vbs ← ★ ScriptFullName はこのフルパスを返す
┗ 📂 data/
┗ 📄 config.txt ← ★ ここを参照したい!
`main.vbs` がどこに置かれていようとも、自分自身のフルパスが分かれば、そこから「一歩上のフォルダ(親フォルダ)」を特定し、同階層にある `data` フォルダへの道筋を計算できます。これが、環境依存から脱却するポータブルなパス解決の正体です。
—
3. 実装コード:環境に依存しない最強のパス構築
それでは、実際に現場でそのまま使える実用的なコードを見てみましょう。
コード内のコメントをしっかりと読みながら、動きを確認してみてください。
Option Explicit
‘ =====================================================================
‘ テーマ: 実行場所に依存しないポータブルなパス解決サンプル
‘ =====================================================================
Dim fso, currentScriptPath, currentFolder, targetFilePath, objFile
‘ 1. FileSystemObjectの生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 2. スクリプト自身のフルパスを取得する
‘ 例: “E:\Work\Tool\main.vbs”
currentScriptPath = WScript.ScriptFullName
‘ 3. スクリプトが存在するフォルダのパス(親フォルダ)を取得する
‘ 例: “E:\Work\Tool”
currentFolder = fso.GetParentFolderName(currentScriptPath)
‘ 4. 取得したフォルダを起点にして、相対的に目的のファイルのパスを組み立てる
‘ fso.BuildPath を使うと、スラッシュやバックスラッシュの連結ミスを防げます
targetFilePath = fso.BuildPath(currentFolder, “data\config.txt”)
‘ — 動作確認用メッセージ —
Wscript.Echo “【現在のスクリプト場所】” & vbCrLf & currentScriptPath & vbCrLf & vbCrLf & _
“【特定した起点フォルダ】” & vbCrLf & currentFolder & vbCrLf & vbCrLf & _
“【ターゲットファイルの絶対パス】” & vbCrLf & targetFilePath
‘ 5. 実際にファイルを開いてみる処理の例
If fso.FileExists(targetFilePath) Then
Set objFile = fso.OpenTextFile(targetFilePath, 1) ‘ 1 = ForReading
Wscript.Echo “成功: 設定ファイルを読み込みました。”
‘ ここにファイルの読み込み処理を書く
objFile.Close
Else
Wscript.Echo “警告: 指定されたパスに設定ファイルが存在しません。”
End If
‘ オブジェクトの解放
Set objFile = Nothing
Set fso = Nothing
—
4. コードの重要ポイント解説
初心者のうちは、上記のコードに出てくるいくつかの重要なパーツをしっかり押さえておきましょう。
① `WScript.ScriptFullName`
これこそが命綱です。現在実行されている `.vbs` ファイル自身の「ドライブ名からファイル名までの完全なパス(フルパス)」を文字列として返してくれます。似たプロパティに `WScript.ScriptName` がありますが、こちらはファイル名(`main.vbs`など)しか取れないため、パスの特定には使えません。必ず `ScriptFullName` を使いましょう。
② `fso.GetParentFolderName(…)`
FSOが持つ強力なメソッドです。パスを渡すと、一番右側のファイル名(またはフォルダ名)を切り落とし、その「親にあたるフォルダのパス」を返してくれます。
③ `fso.BuildPath(basePath, relativePath)`
パスを結合するときに `currentFolder & “\data\config.txt”` のように「`\`(円マーク)」を直接足し算していませんか?
これだと、パスの結合部分に `\` が二重に入ってしまったりしてエラーの原因になります。`BuildPath` メソッドを使えば、FSOがよしなにスラッシュやバックスラッシュを適切に調整して結合してくれます。地味ですが非常にバグを防ぐ優秀なメソッドです。
—
5. 陥りやすい罠と注意点
最後に、現場でよくある「あれ?」というポイントを先回りして解説しておきます。
- カレントディレクトリ(`CurDir`)との混同に注意
VBScriptには、コマンドプロンプトなどで使われる「現在の作業ディレクトリ(CurDir)」という概念もあります。しかし、VBScriptをダブルクリックして実行した場合、カレントディレクトリはスクリプトの場所とは限らず、デスクトップやショートカットの「作業フォルダ」に勝手に変わってしまうことがあります。
「スクリプトから見た場所を指定したいときは、必ず `ScriptFullName` を起点にする」と覚えておいてください。
—
おわりに
いかがでしたでしょうか?
`ScriptFullName` と `GetParentFolderName` を組み合わせるこのテクニックは、VBScriptだけでなく、VBAや他のスクリプト言語にステップアップしてもずっと使える普遍的な知見です。
この基本をマスターすれば、あなたが作ったツールをZIPにまとめてチャットで同僚に送っても、相手のPCのどこに展開してもエラーなく動く「プロの仕事」ができるようになります。
ここをクリアしたあなたなら、もうVBScriptの基礎はバッチリです!
ぜひ、日々の業務自動化に役立ててくださいね。それでは、次のステップへ進みましょう!
