テーマ、知りたいこと
ExcelをCOM利用しているVB6のプログラムがあるのですが
これをVB.Netにバージョンアップしたい。という話が私の所に来ています。
私は、社内で使うだけのプログラムなら、Excelマクロでいいのではと思いました。
ソースを読む限り、VBAでも事足りると感じたためです。
VBAはソースコードのバージョン管理が上手くできないと思うので
そこがネックとしてはあるのかなと思っているのですが
果たしてどうなのでしょうか。
また、.Netへの改修は、.Net Frameworkにしろ、.Net にしろ
解放処理をやたらとしないといけないのでコードが煩雑になると思っています。
また、EPPlusやClosedXMLを使うというのも手としてはあるのかなと思ってはいますが
余り使用経験がないのでよくわかっていません。
そのため、私はExcelマクロを推して提案しようかなと思っています。
皆さんならどうしますか?
自分で試したこと
.Netにする場合、以下がいいのかなと今は感じている所です。
ただ、これよりもExcelマクロの方がいいんじゃないかなとも思っている次第です。
以下の共通処理を作って
VB.Net
1Imports System.Runtime.InteropServices 2Module Module1 3 Private mListObject As List(Of Object) 4 Public Sub AddComObject(rObject) 5 If mListObject Is Nothing Then mListObject = New List(Of Object) 6 mListObject.Add(rObject) 7 End Sub 8 9 Public Sub AllRereseComObjec() 10 For i As Integer = mListObject.Count - 1 To 0 Step -1 11 Marshal.ReleaseComObject(mListObject.Item(i)) 12 Next 13 mListObject.Clear() 14 mListObject = Nothing 15 End Sub 16End Module
こんな感じに使う方法です。
VB.Net
1 Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 2 Dim objXLSApp As Object 3 Dim objXLSBooks As Object 'Excel.Workbooks 4 Dim objXLSBook As Object 'Excel.Workbook 5 Dim objXLSSheets As Object 'Excel.Worksheets 6 Dim objXLSSheet As Object 'Excel.Worksheet 7 8 Dim objXLSCells As Object 'Excel.Range 9 Dim objXLSRange As Object 'Excel.Range 10 11 Dim tReleaseCom As New ReleaseComClass 12 13 objXLSApp = CreateObject("Excel.Application") 14 AddComObject(objXLSApp) 15 objXLSBooks = objXLSApp.Workbooks 16 AddComObject(objXLSBooks) 17 objXLSBook = objXLSBooks.Open(TextBox1.Text, False, True) 18 AddComObject(objXLSBook) 19 objXLSSheets = objXLSBook.Sheets 20 AddComObject(objXLSSheets) 21 objXLSSheet = objXLSSheets.Item("Sheet1") 22 AddComObject(objXLSSheet) 23 objXLSCells = objXLSSheet.Cells 24 AddComObject(objXLSCells) 25 26 objXLSRange = objXLSCells.Item(1, 1) 27 AddComObject(objXLSRange) 28 objXLSRange.value = "2" 29 30 objXLSRange = objXLSCells.Item(2, 1) 31 AddComObject(objXLSRange) 32 objXLSRange.value = "2" 33 34 If System.IO.File.Exists(TextBox2.Text) Then 35 System.IO.File.Delete(TextBox2.Text) 36 End If 37 objXLSBook.SaveAs(TextBox2.Text) 38 39 objXLSBook.Close 40 objXLSApp.Quit 41 42 AllRereseComObjec() 43 44 End Sub
オブジェクトを参照するたびに、それを追加していって
最後に逆順でリリースするだけなんですけど
最後に、順番を意識してリリースするのを列挙するのが大変だったり
同じ変数名を使いまわしたい場合、最後にリリースを列挙するより良いのかなと思った次第です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。