データを守る「盾」を手に入れよう:CreateTextFileのOverwrite引数とエラーハンドリングの極意
こんにちは。自動化の世界へようこそ。
あなたがもし、「マクロの記録」から一歩踏み出し、「自分の手でロジックを書きたい」と願い始めたのなら、素晴らしい一歩を踏み出しました。これから学ぶことは、単なるコードの書き方ではありません。「予期せぬ事態から、大切なデータを守るための作法」です。
プログラミングにおいて、最も恐ろしいことの一つは「プログラムが止まること」ではなく、「プログラムが勝手に、大切なファイルを上書きして消してしまうこと」です。
今日は、VBScriptでファイルを生成する際に欠かせない`CreateTextFile`メソッドに焦点を当て、既存ファイルを破壊しないための「安全装置」の使いかたを伝授します。ここをマスターすれば、あなたはもう「初心者」を卒業し、エンジニアとしての第一歩を確実に踏み出すことができますよ。
1. CreateTextFileの「安全装置」を知る
VBScriptでファイルを新しく作る際、私たちは`FileSystemObject`(FSO)という強力な道具を使います。その中の`CreateTextFile`メソッドには、実は非常に重要な「引数(ひきすう)」が隠されています。
メソッドの基本構造
Set TextFile = FSO.CreateTextFile(filename, [overwrite])
この `[overwrite]` という部分に注目してください。これは、「もし同じ名前のファイルが既にあったら、どうするか?」を決めるスイッチです。
- `True` を指定した場合:
既存のファイルがあっても、容赦なくそれを消去し、新しいファイルで上書きします。スピード重視ですが、危険を伴います。
- `False` を指定した場合:
既存のファイルがある場合、「そんなファイルは作れません!」とエラーを出して停止します。これが、私たちの目指す「上書き事故防止の安全装置」です。
2. 発生する「エラー58」の正体
では、実際に `False` を設定して、既に存在するファイルを作ろうとするとどうなるでしょうか。
VBScriptは、無慈悲に以下のエラーを吐き出して止まってしまいます。
> 実行時エラー ’58’: ファイルは既に存在します。
プログラムがここで止まってしまうと、それ以降に書いた「ログを出力する」「後片付けをする」といった大切な処理がすべて実行されません。これは実務では致命的な問題になります。
この「エラー58」を、プログラムの力で「優しく受け止める」方法を学んでいきましょう。
3. 実践:2つのプロフェッショナルな守り方
エラーを防ぐ、あるいはエラーを適切に処理するには、大きく分けて2つのアプローチがあります。
アプローチA:事前に「存在チェック」をする(LBYL方式)
「Look Before You Leap(跳ぶ前に見よ)」という考え方です。ファイルを作る前に、「そこにあるかな?」と確認する方法です。
' ============================================================
' パターンA:事前に存在確認を行う安全な書き方
' ============================================================
Option Explicit
Dim fso, filePath, textFile
' FileSystemObjectの生成
Set fso = CreateObject("Scripting.FileSystemObject")
filePath = "C:\Temp\SampleLog.txt" ' 保存したいパス
' 1. まず、ファイルが既に存在するかチェックする
If fso.FileExists(filePath) Then
' ファイルが存在する場合の処理
MsgBox "エラー:ファイル '" & filePath & "' は既に存在します。上書きはしませんでした。", vbExclamation, "上書き防止"
Else
' 2. ファイルが存在しない場合のみ、新規作成する
Set textFile = fso.CreateTextFile(filePath, False)
textFile.WriteLine "これは安全に作成されたファイルです。"
textFile.Close
MsgBox "ファイルを正常に作成しました。", vbInformation, "成功"
End If
' 後片付け
Set textFile = Nothing
Set fso = Nothing
【この方法のメリット】
- コードの流れが直感的で、読みやすい。
- エラーが発生する前に回避できるため、精神衛生上非常に良い。
アプローチB:エラーを「キャッチ」する(EAFP方式)
「Easier to Ask Forgiveness than Permission(許可を得るより許しを請う方が簡単)」という考え方です。一度作ってみて、もしエラーが出たらその時に対処する方法です。
' ============================================================
' パターンB:エラーハンドリング(On Error)を用いる書き方
' ============================================================
Option Explicit
Dim fso, filePath, textFile
Set fso = CreateObject("Scripting.FileSystemObject")
filePath = "C:\Temp\SampleLog.txt"
' エラーが発生しても、次の行へ進むように指示する
On Error Resume Next
' ファイル作成を試みる(OverwriteはFalse)
Set textFile = fso.CreateTextFile(filePath, False)
' エラーが発生したかどうかを判定
If Err.Number = 58 Then
' エラー番号58(ファイル存在)の場合の専用処理
MsgBox "【警告】ファイルが既に存在するため、作成をスキップしました。", vbCritical, "エラー発生"
Err.Clear ' エラー情報をクリアしておく
ElseIf Err.Number <> 0 Then
' それ以外の予期せぬエラーが発生した場合
MsgBox "予期せぬエラーが発生しました: " & Err.Description, vbCritical, "システムエラー"
Err.Clear
Else
' エラーがなければ、通常通り書き込み
textFile.WriteLine "エラーハンドリングによって守られたデータです。"
textFile.Close
MsgBox "ファイルを作成しました。", vbInformation, "成功"
End If
' エラーハンドリング設定を元に戻す(重要!)
On Error GoTo 0
Set textFile = Nothing
Set fso = Nothing
【この方法のメリット】
- 「ファイルがあるかないか」を何度もチェックする手間が省け、処理がスマートになる。
- 複雑な条件分岐が必要な大規模なシステムに向いている。
4. チーフアーキテクトからのアドバイス:どちらを使うべきか?
「結局、どっちが正解なんですか?」と聞かれることがあります。答えは、「目的」によって決まります。
1. 「ファイルが既にあるなら、何もしなくていい」という単純なルールなら…
👉 パターンA(存在チェック)が最適です。コードが読みやすく、後から見た人が「あ、ここでチェックしているんだな」とすぐに理解できるからです。
2. 「ファイルが既にあるなら、別の名前(日付付きなど)で保存したい」という高度な処理なら…
👉 パターンB(エラーハンドリング)が強力です。エラーが起きた瞬間に「じゃあ、ファイル名にタイムスタンプを付けてリトライしよう」といった、動的なリカバリー処理が書きやすくなります。
⚠️ 注意:`On Error Resume Next` の罠
パターンBを使う際、`On Error Resume Next` を書いたら、必ず最後に `On Error GoTo 0` でリセットしてください。 これを忘れると、その後のコードで発生した「本当に修正すべき重大なエラー」まで無視されてしまい、原因不明のバグを生む原因になります。これはプロの世界では「禁忌」に近いミスです。
まとめ:ここをクリアすれば、VBScriptの基本はバッチリです
今日学んだことを振り返りましょう。
- `CreateTextFile(path, False)` は、上書き事故を防ぐための盾である。
- `False` を指定すると、ファイルが存在する場合に Error 58 が発生する。
- パターンA(FileExists)は、事前の確認による「予防」である。
- パターンB(On Error)は、起きてしまった事態への「対応」である。
エラーは敵ではありません。適切に扱うことができれば、あなたのプログラムをより強固で、信頼されるものへと進化させてくれる「ガイド」になります。
一歩ずつ、着実に。あなたの自動化への旅路を応援しています。
