【入門編】【初心者向け】CreateTextFileのOverwrite引数をFalseに指定した際のエラーハンドリングと上書き事故防止 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク
スポンサーリンク

データを守る「盾」を手に入れよう: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)は、起きてしまった事態への「対応」である。

エラーは敵ではありません。適切に扱うことができれば、あなたのプログラムをより強固で、信頼されるものへと進化させてくれる「ガイド」になります。

一歩ずつ、着実に。あなたの自動化への旅路を応援しています。

タイトルとURLをコピーしました