VB2005 Excel操作 (遅延バインディングを使う方法)

Microsoft Excel Object Libraryを参照する事前バインディングではビルドしたPCと配布先のPCでExcelのバージョンが違うとエラーで動かない.
バージョンが違っても動くようにするには遅延バインディングを使う.

遅延バインディングでは,Option Strict Offにしなければならないが,
Option Strictはファイル単位で指定できるのでExcel操作のコードだけ別にしてそこだけOption Strict Offにするのが良い.
または,プロジェクトのプロパティー – [コンパイル]で「遅延バインディングです~」を「なし」に設定する.

    Public Sub Excel()
        ‘Excelを起動
        Dim oExcel As Object = CreateObject(“Excel.Application”)
        oExcel.Visible = True ‘Excelを表示する場合
        Dim oBooks As Object = oExcel.Workbooks
        Dim FilePath As String = “c:\Test.xls”
        Dim oBook As Object = oBooks.open(FilePath) ‘既存ファイルを開く場合
        ‘Dim oBook As Object = oBooks.Add ‘新規作成の場合
        Dim oSheets As Object = oBook.Worksheets
        Dim oSheet As Object = oSheets.Item(1) ‘Sheet1

        ‘Excelファイル操作
        Dim oRange As Object = oSheet.Cells(1, 1) ‘A1セル
        oRange.value = “abc”
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oRange) ‘解放(使うたびに解放する)
        oRange = oSheet.Cells(2, 1) ‘A2セル
        oRange.value = “def”
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oRange) ‘解放

        ‘Excelファイル保存
        oExcel.DisplayAlerts = False ‘保存しますか?を表示しない
        oSheet.SaveAs(FilePath) ‘ファイル保存
        oExcel.DisplayAlerts = True ‘非表示を元に戻す

        ‘Excelオブジェクト解放
        ‘FinalReleaseComObject:参照を0にする(全て解放)
        ‘ReleaseComObject:参照を1つデクリメントする(1つ解放)
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oSheet) ‘解放
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oSheets) ‘解放
        oBook.Close(False) ‘xlBookを閉じる
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oBook) ‘解放
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oBooks) ‘解放
        oExcel.Quit() ‘Excelを閉じる
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oExcel) ‘解放

    End Sub

注意:解放がうまくいかないと画面上でExcelが消えていてもプロセスが残ってしまうので,タスクマネージャの[プロセス]でEXCEL.EXEが残っていないことをリリース前によく確認すること.解放がうまくいかなくても普通はアプリを終了するとEXCEL.EXEも消えるが,そんなことでごまかさずに解放したらすぐにEXCEL.EXEも終了するようにすること.

参考:
Visual Basic .NET による Office オートメーション サーバーでのバインディング MS
Visual Basic .NET からオートメーションを使用して Office マクロを実行する方法 MS
.NET 開発者の観点から捉えた Excel オブジェクト モデル MS
C#によるExcel制御
http://hanatyan.sakura.ne.jp/dotnet/Excelflm.htm VBレスキュー(花ちゃん)