【VB.NET】COM参照(Microsoft.Office.Interop.Excel)でExcelファイルを操作

パソコン

どうも、もももです。

VB.NETでExcelファイルを操作する方法は色々ありますが、今回はCOM参照で操作する方法について紹介します。

前提条件

  • VB.NET(Visual Studio 2019)
  • Excel(Microsoft Office Personal 2019)

事前準備

COM参照でExcelファイルを操作するには「Microsoft.Office.Interop.Excel」をプロジェクトの参照に追加する必要があります。

対象プロジェクトの「参照」を右クリック→「NuGetパッケージの管理」をクリック

NuGetの画面が表示されるので「参照」タブを選択し、検索窓に「Microsoft.Office.Interop.Excel」と入力します。

表示された「Microsoft.Office.Interop」を選択し「インストール」ボタンをクリックします。

「変更のプレビュー」が表示されるので「OK」をクリックし、インストールが完了するとプロジェクトの参照に「Microsoft.Office.Interop.Excel」が追加されます。

サンプルプログラム

概要

保存ボタン押下でA1~C1用のテキストボックスに入力した内容がExcel上のA1~C1セルに書き込まれ、上書き保存されるプログラムです。

A1セルは文字列、B1セルは数値、C1セルは日付として保存します。

実行結果

画面の各テキストボックスに「001」と入力して保存ボタンを押下しました。

Excelファイルを確認すると「001」がそれぞれ、A1セル:文字列、B1セル:数値、C1セル:日付として保存されていました。

コード解説

Imports Microsoft.Office.Interop

Public Class Form1
    Private Sub SaveButton_Click(sender As Object, e As EventArgs) _
        Handles SaveButton.Click

        Dim fileName = "Excelファイルのフルパス"

        'ファイルオープン
        Dim ea As Excel.Application = New Excel.Application
        Dim wbs As Excel.Workbooks = ea.Workbooks
        Dim wb As Excel.Workbook = wbs.Open(fileName)

        'データ書込み
        Dim ss As Excel.Sheets = wb.Worksheets
        Dim ws As Excel.Worksheet = ss(1)
        Dim cs As Excel.Range = ws.Cells

        Dim A1 As Excel.Range = cs(1, 1)
        A1.NumberFormat = "@"
        A1.Value = A1CellTextBox.Text

        Dim B1 As Excel.Range = cs(1, 2)
        B1.NumberFormat = "General"
        B1.Value = B1CellTextBox.Text

        Dim C1 As Excel.Range = cs(1, 3)
        C1.NumberFormat = "yyyy/mm/dd"
        C1.Value = C1CellTextBox.Text

        '保存
        ea.DisplayAlerts = False
        wb.SaveAs(fileName)

        '終了処理
        ea.Quit()
        System.Runtime.InteropServices.Marshal.ReleaseComObject(C1)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(B1)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(A1)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(cs)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(ws)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(ss)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(wb)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(ea)

    End Sub
End Class
  • 10~12行:Excelオブジェクトを生成してファイルを開きます。
  • 15~17行:開いたファイルのBookからSheetを選択し、セルを取得します。
  • 19~21行:A1セルのオブジェクトを生成し、書式設定(文字列)、データセットを行います。
  • 23~25行:B1セルのオブジェクトを生成し、書式設定(数値)、データセットを行います。
  • 27~29行:C1セルのオブジェクトを生成し、書式設定(日付)、データセットを行います。
  • 32~33行:確認メッセージを非表示にし、上書き保存します。
  • 36行:ファイルを閉じます。
  • 37行~45行:各オブジェクトの開放を行います。

※Excel操作で使用した全てのオブジェクトを開放する必要があります。「サンプルプログラム(bad)」で後述

サンプルプログラム(bad)

コード解説

Imports Microsoft.Office.Interop

Public Class Form1
    Private Sub SaveButton_Click(sender As Object, e As EventArgs) _
        Handles SaveButton.Click

        Dim fileName = "Excelファイルのフルパス"

        'ファイルオープン
        Dim ea As Excel.Application = New Excel.Application
        Dim wb As Excel.Workbook = ea.Workbooks.Open(fileName)

        'データ書込み
        Dim cs As Excel.Range = wb.Worksheets(1).cells

        cs(1, 1).NumberFormat = "@"
        cs(1, 1).Value = A1CellTextBox.Text
        cs(1, 2).NumberFormat = "General"
        cs(1, 2).Value = B1CellTextBox.Text
        cs(1, 3).NumberFormat = "yyyy/mm/dd"
        cs(1, 3).Value = C1CellTextBox.Text

        '保存して終了
        ea.DisplayAlerts = False
        wb.SaveAs(fileName)

        '終了処理
        ea.Quit()
        System.Runtime.InteropServices.Marshal.ReleaseComObject(cs)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(wb)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(ea)

    End Sub
End Class
  • 10~11行:Excelオブジェクトを生成してファイルを開きます。(Workbooksを省略)
  • 14行:開いたファイルのBookからSheetを選択し、セルを取得します。(Sheets, Worksheetを省略)
  • 16~21行:セルオブジェクトにA1, B1, C1のセルを指定し、書式設定、データセットを行います。
  • 24~25行:確認メッセージを非表示にし、上書き保存します。
  • 28行:ファイルを閉じます。
  • 29~31行:各オブジェクトの開放を行います。

一見すると無駄な定義が省略されており、こちらの方が良いコードのように見えますが、内部的に使用していたWorkbooks, Sheets, Worksheet, A1セル, B1セル, C1セルオブジェクトが解放されていません。

Excelプロセスが残ってしまう問題

タスクマネージャーで確認するとExcelのプロセスが残ったままになっています。(画像は保存ボタンを3回押下した後の状態です。)

プロセスが残った状態で処理を重ねていくとメモリの使用量が膨大になってしまうので注意する必要があります。

まとめ

VB.NETでCOM参照を用いてExcelファイルを操作する方法についてまとめました。

COM参照では適切にオブジェクトの開放を行わないと、Excelのプロセスが残ってしまうため注意が必要です。

個人的にはオブジェクトの開放の煩わしさや、処理速度の関係でCOM参照よりもNPOIの方が、利用しやすいかと思います。

NPOIを用いたExcelファイル操作は以下を参照ください。

下記はアプリケーションの作成例になります。

コメント

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