Excel非依存!FSOのみでHTMLテーブル形式(.xls互換)のスタイル付き帳票ファイルを高速生成
こんにちは!VBScriptの世界へようこそ。私が皆さんのVBScriptマスターへの道を、優しく、そして時には厳しく(でも愛情込めて!)サポートさせていただきます。
さて、今日は皆さんが「おおっ!」と唸るような、ちょっとした裏技というか、実用的なテクニックをご紹介しましょう。それは、Excelオブジェクトを一切使わずに、VBScriptのファイルシステムオブジェクト(FSO)だけで、まるでExcelで作ったかのような表形式の帳票ファイルを生成する方法です。
「え?Excelで作ったみたいなのに、Excelを使わないの?」と思ったあなた、鋭い!そうなんです。しかも、生成されるファイルは`.xls`という拡張子で保存すれば、古いバージョンのExcelでも開ける互換性があるんです。
なぜ、Excelオブジェクトを使わないのが良いのか?
皆さんがVBScriptやVBAで帳票を作成する際、おそらくExcelを直接操作するコードを書いたことがあるのではないでしょうか?例えば、こんなコードです。
Set objExcel = CreateObject(“Excel.Application”)
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add
Set objSheet = objWorkbook.Sheets(1)
‘ ここにデータを書き込んでいく
objSheet.Cells(1, 1).Value = “ヘッダー1”
objSheet.Cells(1, 2).Value = “ヘッダー2”
‘ …
この方法は、見たままの操作ができるので直感的で分かりやすいですよね。しかし、裏側ではExcelという巨大なアプリケーションを起動し、メモリを大量に消費し、処理に時間がかかるというデメリットがあります。
特に、大量のデータを処理したり、頻繁に帳票を生成したりする場合、このExcelオブジェクトの呼び出しがボトルネックになり、スクリプト全体の実行速度を著しく低下させてしまうんです。
「でも、表計算ソフトで開ける帳票が欲しいんだよ!」
そんな声が聞こえてきそうです。ご安心ください。ここでFSOの出番です。
FSOとは? ファイル操作の万能選手!
FSO(FileSystemObject)は、VBScriptに標準で備わっているオブジェクトで、ファイルやフォルダの作成、読み書き、削除など、ファイルシステムに関するあらゆる操作をプログラムから行うことができます。
Excelオブジェクトのように「セルの値を設定する」といった直接的な操作はできませんが、テキストファイルとしてHTMLを書き出すことで、表形式のデータを表現し、さらにCSSで装飾を施すことで、見た目にも美しい帳票を作成できるんです。
そして、HTMLのテーブルタグ(`
| 商品名 | 単価 | 数量 | 合計金額 |
|---|---|---|---|
| ” & arrData(i)(0) & “ | ” & arrData(i)(1) & “ | ” & arrData(i)(2) & “ | ” & arrData(i)(3) & “ |
”
objTextFile.WriteLine “”
objTextFile.WriteLine “”
‘ — ファイルを閉じる —
‘ 書き込みが終わったら、必ずファイルを閉じます。
‘ これを忘れると、ファイルが正しく保存されなかったり、破損したりする可能性があります。
objTextFile.Close
‘ — オブジェクトの解放 —
‘ 使用したオブジェクトは解放するのが良い習慣です。
Set objTextFile = Nothing
Set objFSO = Nothing
‘ — 完了メッセージ —
MsgBox “帳票ファイル ‘” & strFilePath & “‘ を生成しました。”, vbInformation, “処理完了”
‘ — 現在のディレクトリを取得する関数 —
‘ この関数は、スクリプトが実行されているカレントディレクトリのパスを返します。
Function CurrentDirectory()
Dim objShell
Set objShell = CreateObject(“WScript.Shell”)
CurrentDirectory = objShell.CurrentDirectory
Set objShell = Nothing
End Function
コードの解説:ここがポイント!
1. `CreateObject(“Scripting.FileSystemObject”)`:
- これがFSOオブジェクトを作成する呪文です。この`objFSO`を通して、ファイル操作の全てのコマンドを実行します。
- オブジェクトのライフサイクル: FSOオブジェクトも、使い終わったら`Set objFSO = Nothing`で解放するのがメモリ管理上、望ましいです。しかし、スクリプトの最後で自動的に解放されることも多いので、短時間のスクリプトでは必須ではありません。ただ、知っておくと、より大規模なスクリプトや、長時間実行されるプロセスで役立ちます。
2. `objFSO.OpenTextFile(strFilePath, ForWriting, CreateNewFile)`:
- ファイルを「開く」ためのメソッドです。
- `strFilePath`: 作成・書き込みたいファイルのパスを指定します。
- `ForWriting` (定数 `2`): ファイルに書き込むモードを指定します。他に読み込みモード(`ForReading`)などもあります。
- `CreateNewFile` (定数 `True`): `True`を指定すると、ファイルが存在しない場合は新規作成し、存在する場合は上書きします。`False`だと、ファイルが存在しない場合にエラーになります。
- エラーハンドリングの重要性: `On Error Resume Next`と`If Err.Number <> 0 Then …`の部分は、実務では必須です。ファイルパスが間違っていたり、書き込み権限がない場合などにエラーが発生しますが、これを適切に処理しないとスクリプトが意図せず終了してしまいます。
3. `objTextFile.WriteLine “…”`:
- 開いたテキストファイルに1行ずつ文字列を書き込むメソッドです。
- ここで、HTMLのタグをそのまま文字列として書き込んでいきます。`
`でテーブルの開始、`
`で行の開始、` `や` `でヘッダーセルやデータセルを定義していきます。 - CSSによるスタイル指定: `
- CSSによるスタイル指定: `