こんにちは。システム開発の現場で「Excel自動化」という言葉を聞くと、多くの人が真っ先に思い浮かべるのが『COM Interop(Excelを裏で立ち上げて操作する)』でしょう。しかし、伝説的なエンジニアとして断言します。サーバー環境でCOMを使うのは、時限爆弾を抱えて走るようなものです。
今日は、VBAの「マクロの記録」という温室から飛び出し、VB.NETを使って「Excelをインストールせずに、爆速で帳票を生成する」という現代のエンジニアの必須スキルを伝授します。
—
1. なぜ「COM Interop」を使ってはいけないのか?
VBAやVB.NETで `Microsoft.Office.Interop.Excel` を使うと、PCの中にExcelが起動します。これには致命的な弱点があります。
- 激重: プロセスを立ち上げるオーバーヘッドが凄まじい。
- サーバーで動かない: Microsoftはサーバー環境でのExcel自動化を推奨していません(ライセンス問題やメモリリークのリスク)。
- 不安定: 処理中にExcelがフリーズすると、プロセスが残り続け、PCを再起動するまで消せなくなることがあります。
これらを解決するのが、今回紹介する「Open XML SDKベースのライブラリ(EPPlus / ClosedXML)」です。これらはExcelファイル(.xlsx)を直接バイナリデータとして編集するため、Excelがインストールされていないサーバーでも爆速で動作します。
—
2. 武器の選択:EPPlusか、ClosedXMLか
どちらも優秀ですが、今回はEPPlusを例に解説します。
- EPPlus: 大規模なデータ処理に強く、メモリ効率が極めて高い。計算式やグラフも強力。
- ClosedXML: 直感的な書き心地。小〜中規模の帳票ならこちらがおすすめ。
今回はNuGetパッケージから `EPPlus` をインストールしている前提で進めます。
—
3. 実践:VB.NETによる爆速Excel生成コード
それでは、実際に「売上管理表」を出力するコードを見てみましょう。このコードは、メモリ上でExcelを構築し、最後にファイルとして保存します。
Imports OfficeOpenXml ‘ EPPlusの名前空間
Imports System.IO
Public Sub GenerateReport()
‘ EPPlusのライセンス設定(非商用利用の場合)
ExcelPackage.LicenseContext = LicenseContext.NonCommercial
‘ ファイルパスの定義
Dim fileInfo As New FileInfo(“C:\Temp\MonthlyReport.xlsx”)
‘ Excelパッケージの作成(Usingを使うことでメモリ解放を確実にします)
Using package As New ExcelPackage(fileInfo)
‘ ワークシートを追加
Dim ws = package.Workbook.Worksheets.Add(“売上報告”)
‘ ヘッダーの入力(セル指定は1始まりです)
ws.Cells(1, 1).Value = “商品名”
ws.Cells(1, 2).Value = “売上金額”
‘ データの流し込み
ws.Cells(2, 1).Value = “伝説のキーボード”
ws.Cells(2, 2).Value = 50000
‘ スタイルの装飾(ここがExcel操作の醍醐味です)
Using range = ws.Cells(1, 1, 1, 2)
range.Style.Font.Bold = True
range.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid
range.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightBlue)
End Using
‘ 自動列幅調整
ws.Cells.AutoFitColumns()
‘ 保存して終了
package.Save()
End Using
End Sub
コードのポイント
- `Using` ステートメント: これが重要です。Excelという重いリソースを扱う際、処理が終わったら即座にメモリを解放するための「お作法」です。
- `ws.Cells(行, 列)`: VBAと同じ感覚で操作できます。しかし、処理速度はCOMの数百倍です。
- 非依存性: このコードを実行するマシンにExcelは不要です。Linux環境(.NET Core / .NET 5+)でも動作します。
—
4. 初学者が陥りやすい罠と対策
Q. 「セルに値を書き込んだのにファイルが開けない!」
A. 大抵は「保存処理 (`package.Save()`)」が漏れています。あるいは、ファイルが他のプロセスで開かれている可能性があります。まずは例外処理(Try-Catch)で「ファイルが使用中です」というエラーをキャッチする癖をつけましょう。
Q. 「VBAと何が違うの?」
A. 最大の違いは「並列処理」です。VB.NETなら、複数のExcel生成をマルチスレッドで同時に行うことも可能です。VBAでは絶対にできない芸当ですね。
—
5. まとめ:ここをクリアすれば「脱・初心者」
今回解説した内容は、現代の業務自動化の「標準」です。
1. COM Interopの呪縛を捨てる
2. EPPlus / ClosedXML を覚える
3. Usingステートメントでメモリ管理を徹底する
この3つを意識するだけで、あなたの作るツールは「重くて落ちるマクロ」から「サーバーで静かに、かつ爆速で動くプロフェッショナルなシステム」へと進化します。
次は、テンプレートファイルを読み込んで、そこにデータを流し込む「テンプレート帳票開発」に挑戦してみてください。それができれば、もう現場で怖いものなしですよ。
何か詰まったら、いつでも聞いてください。応援しています。
