【入門編】【コード・テキスト整形】FSOを活用してテキスト内の「タブ文字↔半角スペース」を一括相互変換するツール – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!エンジニアリングの世界へようこそ。
マクロの記録ボタンを押すだけの操作から一歩抜け出し、自分の手でシステムをコントロールしたいと思っているあなたへ。今日は、現場で即戦力として使える「VBScriptによるテキスト整形ツール(タブ⇔スペース相互変換)」の作り方を、私と一緒にじっくりと学んでいきましょう。

ここをクリアすれば、OSの標準機能だけでファイルをごりごり自動処理するVBScriptの本質がバッチリつかめますよ。それでは、さっそく扉を開けていきましょう!

—

なぜ、今「VBScript」と「FSO」なのか?

私たちが日常的に触れるソースコードや設定ファイル。他の人が書いたものや、古いシステムから吐き出されたログファイルを見ると、インデント(行頭の空白)が「タブ文字(`\t`)」だったり「半角スペース」だったり、バラバラで発狂しそうになった経験はありませんか?

「メモ帳で置換すればいいじゃないか」――そう思ったあなた。ファイルが100個あったらどうしますか? 毎朝それを手作業でやりますか? 違いますよね。プログラマなら「自動化」するべきです。

ここで登場するのが、Windows環境であれば追加のインストールなしで秒速で動かせるVBScriptと、その核心であるFSO(FileSystemObject)です。

FSOとは?

FileSystemObjectとは、Windowsのファイルシステム(ファイルやフォルダ)を自由自在に操るための魔法のオブジェクトです。これを使うと、ファイルの「読み込み」「書き込み」「存在確認」「移動」などが、まるで自分の手足のように動かせるようになります。

—

今回作るツールの仕様

今回作成するのは、「指定したテキストファイルを読み込み、タブ文字を半角スペース(またはその逆)に一括変換して、上書き保存する」という実用的なスクリプトです。

まずは、頭の中で処理の流れ(アルゴリズム)をイメージしてみましょう。

[VBScript起動]
↓
[FSOでファイルを開く]
↓
[全テキストをメモリ上に読み込む] ← ★一括読み込みがパフォーマンスの鍵!
↓
[文字列置換 (Tab ⇔ Spaces)]
↓
[ファイルを上書き保存]
↓
[完了!]

非常にシンプルですが、ここにはVBScriptを扱う上で知っておくべき「メモリ管理」や「文字コード」の知見がぎっしり詰まっています。

—

実装コード:タブ ⇄ スペース一括変換スクリプト

以下のコードをコピーして、メモ帳などのテキストエディタに貼り付けてください。そして、ファイルを保存する際の名前を `TextFormatter.vbs` (拡張子を必ず `.vbs` にしてください)に変更します。

‘ =================================================================0
‘ ツール名: TextFormatter.vbs
‘ 概要: 指定したテキストファイルのタブと半角スペースを相互変換する
‘ 著者: シニアアーキテクト先輩
‘ =================================================================0
Option Explicit

‘ メイン処理の実行
Call Main()

Sub Main()
‘ — 1. 設定エリア —
‘ 変換対象のファイルパス(ご自身の環境に合わせて変更してください)
Dim targetFilePath
targetFilePath = “C:\Work\sample.txt”

‘ 変換モードの選択
‘ True = タブを半角スペースに変換
‘ False = 半角スペースをタブに変換
Dim convertTabToSpace
convertTabToSpace = True

‘ タブ1つ分を何文字の半角スペースに換算するか
Dim spaceCount
spaceCount = 4

‘ — 2. FSOのインスタンス化 —
Dim fso
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ ファイルの存在チェック(これ基本中の基本!)
If Not fso.FileExists(targetFilePath) Then
MsgBox “指定されたファイルが存在しません:” & vbCrLf & targetFilePath, vbCritical, “エラー”
Exit Sub
End If

‘ — 3. 読み込み処理 —
Const ForReading = 1
Const ForWriting = 2
Const TristateUseDefault = -2 ‘ システムのデフォルト文字コードを使用

Dim tsRead, fileContent
‘ ファイルを開いてテキストを一気に読み込む
Set tsRead = fso.OpenTextFile(targetFilePath, ForReading, False, TristateUseDefault)
fileContent = tsRead.ReadAll
tsRead.Close
Set tsRead = Nothing ‘ メモリ解放の美学

‘ — 4. 変換処理(文字列置換) —
Dim targetStr, replacementStr
If convertTabToSpace Then
targetStr = vbTab
replacementStr = Space(spaceCount) ‘ 指定数分の半角スペースを生成
Else
targetStr = Space(spaceCount)
replacementStr = vbTab
End If

‘ Replace関数で一括置換
Dim convertedContent
convertedContent = Replace(fileContent, targetStr, replacementStr)

‘ — 5. 書き込み処理(上書き保存) —
Dim tsWrite
Set tsWrite = fso.OpenTextFile(targetFilePath, ForWriting, False, TristateUseDefault)
tsWrite.Write convertedContent
tsWrite.Close
Set tsWrite = Nothing

‘ — 6. 終了通知 —
MsgBox “テキストの整形が完了しました!”, vbInformation, “成功”

‘ オブジェクトの完全開放
Set fso = Nothing
End Sub

—

コードの深掘り解説:ここがプロの技

初学者が陥りやすい罠と、それを回避するための「エンジニアの知見」をいくつか解説しておきます。

1. `Option Explicit` はプロの証

コードの1行目に書いた `Option Explicit`。これ、何だか分かりますか?
これは「変数の宣言を強制する」ための命令です。これを書いておくと、うっかり変数名をタイポ(打ち間違い)した時に、VBScriptが怒って止まってくれます。これがないと、勝手に新しい変数が作られてしまい、バグの原因を何時間も探すハメになります。必ず書く癖をつけましょう。

2. ファイルを「行単位」ではなく「一括(ReadAll)」で読む理由

テキストを処理する際、1行ずつループして読み書きしたくなる気持ちは分かります。しかし、ファイルIO(入出力)の回数は、プログラムのパフォーマンスにおいて最も重い処理の一つです。
`ReadAll` で一気にメモリ上に読み込み、メモリ上で `Replace` 関数を使って一瞬で置換し、`Write` で一気に書き戻す。この「I/Oを最小限にし、メモリ上で爆速処理する」というアプローチは、大規模なシステム開発でもそのまま使える極意です。

3. オブジェクトの解放とライフサイクル

VBScriptでは、`Set fso = Nothing` や `Set tsRead = Nothing` のように、使い終わったオブジェクトを明示的に解放する記述をよく見かけます。
VBScript(厳密には背後で動いているCOMコンポーネント)はスクリプト終了時に自動でガベージコレクションされますが、長時間動くスクリプトや、連続してファイルを触る現場では、明示的に `Nothing` を代入してメモリやファイルロックを即座に解放する姿勢が、トラブルを防ぐプロの作法となります。

—

陥りやすいエラーと対策

1. 文字化けが発生する

  • 原因: Windowsのメモ帳などで保存したファイルが「UTF-8(BOMなし)」や「UTF-16」になっており、VBScriptの標準機能(Shift-JIS前提になりがち)とコンフリクトを起こしているケース。
  • 対策: 開発現場でVBScriptを使う場合は、極力対象ファイルを「ANSI(Shift-JIS)」または「UTF-8 with BOM」で保存するようにしてください。

2. 「権限がありません(アクセスが拒否されました)」エラー

  • 原因: 変換対象のファイルが、別のアプリケーション(ExcelやVisual Studio Codeなど)で開いたままになっている。
  • 対策: ファイルを閉じている状態で実行するか、エラーハンドリング(`On Error Resume Next` など)を適切に組み込みましょう(※最初はエラーを隠さないために使わない方が無難です)。

—

おわりに:ここから先へ進むあなたへ

お疲れ様でした!これであなたは、ただの「ツール利用者」から「ツールを創る側(エンジニア)」へとステップアップしました。

今回のスクリプトをベースに、

  • 「特定のフォルダの中にある `.txt` や `.sql` ファイルをすべて自動でループ処理する」(`fso.GetFolder` と `Folder.Files` の組み合わせ)
  • 「コマンドライン引数(`WScript.Arguments`)を受け取って、ドラッグ&ドロップで動くようにする」

といった機能を追加していくと、さらに実用的な「最強の自動化ツール」に進化させることができます。

VBScriptはレガシーだと言われることもありますが、Windows環境において「環境構築0秒で動く即効性」は、今なお他の言語の追随を許しません。ぜひ今日のコードをご自身の開発現場や日々の業務に役立ててみてくださいね。それでは、また別の知見でお会いしましょう!

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