【入門編】【実務中級者向け】Excel非依存!FSOのみでHTMLテーブル形式(.xls互換)のスタイル付き帳票ファイルを高速生成 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

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のテーブルタグ(`

`)は、実は多くの表計算ソフトで互換性を持って解釈されます。つまり、HTMLファイルを`.xls`拡張子で保存すれば、Excelで開いたときに整形された表として表示されるというわけです。

実際にやってみよう! FSOでHTMLテーブルを生成するコード

では、具体的なコードを見ていきましょう。まずは、簡単なHTMLテーブルを生成するスクリプトから。

‘===============================================================================
‘ スクリプト名: GenerateHtmlTable.vbs
‘ 概要: FSOを使用して、HTMLテーブル形式の帳票ファイルを生成する
‘ 作者: あなたの先輩エンジニア
‘ 作成日: 2023/10/27
‘===============================================================================

‘ — 定数 —
Const ForWriting = 2 ‘ 書き込みモード
Const CreateNewFile = True ‘ 新規ファイル作成

‘ — 変数宣言 —
Dim objFSO ‘ FileSystemObject
Dim objTextFile ‘ TextStreamオブジェクト (ファイル書き込み用)
Dim strFilePath ‘ 生成するHTMLファイルのパス
Dim arrData ‘ データを格納する配列
Dim i ‘ ループカウンタ

‘ — 初期設定 —
‘ 生成するHTMLファイルのパスを指定します。
‘ 現在のディレクトリに “report.xls” という名前で保存されます。
strFilePath = CurrentDirectory() & “\report.xls”

‘ — FSOオブジェクトの作成 —
‘ FileSystemObjectを作成します。これがファイル操作の司令塔です。
Set objFSO = CreateObject(“Scripting.FileSystemObject”)

‘ — ファイルのオープン —
‘ strFilePathで指定されたファイルを、書き込みモード(ForWriting)で開きます。
‘ CreateNewFile=Trueなので、もしファイルが存在しても上書きされます。
‘ 失敗するとエラーが発生するため、エラーハンドリングをしっかり行うのが実務では重要です。
On Error Resume Next ‘ エラーが発生しても処理を続行します (後でエラーチェックします)
Set objTextFile = objFSO.OpenTextFile(strFilePath, ForWriting, CreateNewFile)
If Err.Number <> 0 Then
MsgBox “ファイルのオープンに失敗しました。パスを確認してください: ” & strFilePath, vbCritical, “ファイルエラー”
WScript.Quit ‘ スクリプトを終了します
End If
On Error GoTo 0 ‘ エラーハンドリングを元に戻します

‘ — HTMLヘッダーの書き込み —
‘ HTML文書の基本的な構造と、テーブルのスタイルを定義します。
‘ ここでCSSを記述することで、見た目を整えます。
objTextFile.WriteLine “”
objTextFile.WriteLine “”
objTextFile.WriteLine “”
objTextFile.WriteLine “”
objTextFile.WriteLine “生成された帳票”
objTextFile.WriteLine “

”
objTextFile.WriteLine “”
objTextFile.WriteLine “”

‘ — テーブル開始タグとヘッダー行の書き込み —
objTextFile.WriteLine “

月次売上レポート

” ‘ 見出し
objTextFile.WriteLine “

”
objTextFile.WriteLine ”

”
objTextFile.WriteLine ”

”
objTextFile.WriteLine ”

”
objTextFile.WriteLine ”

”
objTextFile.WriteLine ”

”
objTextFile.WriteLine ”

”
objTextFile.WriteLine ”

”
objTextFile.WriteLine ”

”
objTextFile.WriteLine ”

”

‘ — データ行の書き込み (例) —
‘ ここではサンプルデータを使っていますが、実際にはデータベースや他のファイルから取得したデータを使います。
arrData = Array( _
Array(“商品A”, 100, 5, 500), _
Array(“商品B”, 200, 3, 600), _
Array(“商品C”, 150, 10, 1500) _
)

‘ 配列の各要素をループしてテーブルの行として書き込みます。
For i = LBound(arrData) To UBound(arrData)
objTextFile.WriteLine ”

”
objTextFile.WriteLine ”

” ‘ 商品名
objTextFile.WriteLine ”

” ‘ 単価
objTextFile.WriteLine ”

” ‘ 数量
objTextFile.WriteLine ”

” ‘ 合計金額
objTextFile.WriteLine ”

”
Next

‘ — テーブル終了タグとHTMLフッターの書き込み —
objTextFile.WriteLine ”

”
objTextFile.WriteLine “

商品名 単価 数量 合計金額
” & 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によるスタイル指定: `