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も終了するようにすること.
http://nary.cocolog-nifty.com/blog/2009/11/vb2005-excel-2c.html