【VB.Net】Excelを操作してみた~ClosedXMLを使う~

目次

VB.NET|ClosedXMLでExcel(.xlsx)を安全に読み書きする方法(列はA1/数値どちらも対応)

どうも!リョクちゃです。

Excelをアプリケーションで操作したいとき、現場で一番事故りにくいのは ClosedXML です。
Interop(Excel COM)は「動くけど運用で死ぬ」ことが多いので、読み書き中心なら ClosedXML が現実的。

  • ✅ Excel本体が無くても動く(サーバーでも動かしやすい)
  • ✅ COM特有の残プロセス・環境依存を避けやすい
  • .xlsx 前提なら実装がラク

ただし、“動くコード” と “運用で詰まらないコード” は別物。
この記事では 現場の落とし穴(入力、シート無し、上書き禁止)まで含めて解説します。


スポンサーリンク




この記事でできること(目的)

  • 読込:「列」「行」を入力し、指定セルの値を表示
  • 書込:「列」「行」「値」を入力し、指定セルへ書き込み
  • 列入力は A1形式(A,B,AA…)と数値(1=A,2=B…)両対応
  • Sheet1 が無い場合でも落ちない(存在チェック&メッセージ)
  • SaveAs(上書き禁止運用)パターンも対応

公式と現場のズレ(ここが大事)

公式や一般記事だと「Cell(“B2”)で読み取れます」で終わりがちですが、現場はここで詰まります。

  • ❌ 列に「2」と入れたら落ちる(A1形式前提しかない)
  • ❌ Sheet名が違って落ちる(Sheet1固定、テンプレ差し替えで事故)
  • ❌ Saveで上書きしてテンプレが壊れる(上書き禁止運用が多い)
  • ❌ ブックを閉じずにロック(次回以降 “使用中です” 地獄)

つまり、運用の前提を入れないと、使い続けられません。
ここを最初から潰します。


前提:ClosedXMLの導入(NuGet)

NuGetで ClosedXML をインストールします。
コードでは以下を使います。

NuGetからの入手

作成したプロジェクトで

  1. ツールタブをクリック
  2. NuGetパッケージマネージャをクリック
  3. ソリューションのNuGetパッケージの管理を選択

クリックしたら、NuGetソリューションタブが新たに開きます。
デフォルトでは、インストール済みが選択されているので、参照を選択します。

検索ボックスにClosedXMLと入力します。

赤枠で囲まれたClosedXMLを選択し、インストールしたいプロジェクトのチェックボックスにチェックを入れます。

選択をしたら、インストールをクリックします。

OKボタンを押します。

インストールが完了すると、プロジェクトの参照欄にClosedXMLが追加されます。

これでClosedXMLの準備は完了です。

練習用フォームの作成

フォームを作成します。

①~⑭のコントロールについては以下の表のとおりです。

Noコントロール名前
1LabelLabel1
2LabelLabel2
3LabelLabel3
4LabelLabel4
5TextBoxtbxReadColumn
6TextBoxtbxReadRow
7TextBoxtbxWriteColumn
8TextBoxtbxWriteRow
9ButtonbtnRead
10LabelLabel5
11TextBoxtbxWriteText
12LabelLabel6
13LabellbReadResult
14ButtonbtnWrite

各コントロールのフォントは、メイリオの18ptを設定しています。

実行環境

筆者の実行環境

  • VisualStudio2019
  • Windows 10 64bit
  • .Net Framework 4.5.1

※ Windows7 8 8.1でも動作はできますが、画面デザインの表示が変わるかもしれません。


実務で使う判断基準(ClosedXMLでOKか?)

  • ✅ .xlsx でOK → ClosedXMLが最有力
  • ❌ .xls 必須 → ClosedXMLは不可(別手段が必要)
  • △ .xlsm(マクロ) → 読み込みはできても運用要件次第(別途検討)

この記事は .xlsx前提 です。


実装:安全な読み書き(列:A1/数値対応、シート存在チェック、SaveAs対応)

まずは「列入力」を統一する(A, AA… / 1, 2… → どちらもOK)
ユーザー入力が以下どちらでも通るようにします。

  • A1形式:A, B, C, AA, AB …
  • 数値:1, 2, 3 …(1=A, 2=B)

読取りボタン押下時の処理

書込むボタン押下

列変換関数(数値→A1列名)

入力列を「最終的にA1列名へ統一」する関数


「Sheet1が無い」場合のハンドリング

現場ではテンプレ差し替えでシート名が変わることがよくあります。
Worksheet(“Sheet1”) を直接呼ぶと例外なので、存在確認します。


SaveAs(上書き禁止運用)パターン

テンプレを直接編集して Save() すると、原本が壊れて戻せないことがあります。
現場では以下どちらかが多いです。

  • ✅ 常に別名保存(SaveAs)
  • ✅ 出力用ファイルをコピーしてから編集 → Save

ここでは SaveAs方式 を入れます。

  • 出力先:C:\output\test_yyyyMMdd_HHmmss.xlsx のように日時付与
  • 同名衝突を回避


✅完成コード(読込+書込+SaveAs+シート存在チェック+列数値対応)


実行編

プログラム起動時

読み取るセルの番地を入力

読取ったセルの情報を表示

C2にあるセルに”赤い”と書き込む場合

書込まれた

正しく書き込まれていることがわかります。


実務メモ(短く補足)

  • 列入力は「B」でも「2」でもOK(2=B)
  • Sheet1が無い場合は、メッセージ表示して落ちない
  • 書き込みは SaveAs で必ず別ファイル出力(テンプレ破壊を防ぐ)
  • .xls は ClosedXML 対象外(必要なら別手段)

書籍紹介(実務でExcel操作を“事故らせない”ために)

このパートが刺さる人

  • 業務で Excelテンプレが頻繁に変わる
  • 「とりあえず動く」Excel操作コードが増殖している
  • 自分以外の人が触るVB.NETアプリを保守している

逆に、
「趣味でちょっとExcelを触りたいだけ」という人には 少し重い かもしれません。


① Excel入出力が増える現場向け

Excel操作の設計思想がまとまった一冊

向いてる人

  • Excel操作がアプリの“付属機能”ではなく“中核処理”になっている
  • Save / SaveAs / テンプレ管理で過去に痛い目を見た

向いていない人

  • 1セル読むだけ、書くだけで終わる小ツール用途

👉 この記事の「SaveAs(上書き禁止運用)」の考え方を、
より体系的に整理したい人向けです。


② VB.NETの保守性を上げたい人向け

フォーム設計・責務分離が学べる一冊

向いてる人

  • フォームの Clickイベント に処理を書きがち
  • Excel操作・DB操作・UI処理が混ざってきている

向いていない人

  • 使い捨てツールしか作らない人

👉 「動くけど後から地獄」にならないための
VB.NET設計の基礎体力を補ってくれます。


③ データを扱うならセットで

SQL/データ設計の基礎を押さえる一冊

向いてる人

  • Excel → DB → 帳票 という流れが見えている
  • いずれExcelを“卒業”したいと思っている

向いていない人

  • Excelだけで完結する業務が確定している人

👉 Excel操作を「ゴール」にしない人ほど、
早めに読んでおくと後がラクです。


💡 補足(読み飛ばしてOK)

この記事のコードは「今すぐ使える」ことを重視していますが、
長期運用では“設計”が効いてきます。
上の書籍は、その“判断基準”を補うためのものです。

スポンサーリンク