前提
バイトをしていてもっと効率化できると思い、独学でVB.netを初めてのプログラミング言語として学び始めたものです。
Excelに画像を貼り付けるという作業があり、それを自動化するソフトを開発しましたがExcelのプロセスが終了しないです。
実現したいこと
処理完了と同時にプロセスも同時に終了できるようにしたいです。
発生している問題・エラーメッセージ
処理をするごとにExcelを起動してしまうので、たくさん処理をした際に多重起動で重くなってしまう
該当のソースコード
VB.Net
1Private Sub testing_button2_Click(sender As Object, e As EventArgs) Handles testing_button2.Click 2 3 Dim strCurrentDir As String = System.IO.Directory.GetCurrentDirectory() 4 Dim template As String = strCurrentDir + "\" + "template.xls" 5 Dim xlApp As New Excel.Application 6 7 Dim fbd As New FolderBrowserDialog 8 9 'Adding header description 10 fbd.Description = "エクセルファイルの保存先を指定してください。" 11 'Allow users to create new folders 12 'True as default 13 fbd.ShowNewFolderButton = True 14 15 ProgressBar1.Minimum = 0 16 ProgressBar1.Maximum = folder_lists.CheckedItems.Count 17 ProgressBar1.Value = 0 18 19 If fbd.ShowDialog(Me) = DialogResult.OK Then 'show save distination setting dialog 20 For Each item_fld As ListViewItem In folder_lists.CheckedItems 21 Dim imagePath As String = item_fld.SubItems(1).Text 22 Dim extensions As String() = {"*.jpg", "*.png", "*.bmp"} 23 Dim files As New List(Of String) 24 ProgressBar1.Value = ProgressBar1.Value + 1 25 26 For Each extension As String In extensions 'counting multiple extension files 27 files.AddRange(Directory.GetFiles(imagePath, extension)) 28 Next 29 30 Dim filesCount As Integer = files.Count 'amount of image files 31 32 33 Dim xlWorkbook As Excel.Workbook = xlApp.Workbooks.Open(template) 34 Dim xlWorksheet As Excel.Worksheet = xlWorkbook.Sheets(1) 35 36 Dim rng As Long = 1 37 38 For Each file As String In files 'insert pictures to the excel book 39 Debug.WriteLine(file) 40 xlWorksheet.Shapes.AddPicture(file, MsoTriState.msoTrue, MsoTriState.msoTrue, xlWorksheet.Range("B" & rng).Left, xlWorksheet.Range("B" & rng).Top, 355, 252) 41 rng = rng + 12 42 Next 43 44 For Each shape As Excel.Shape In xlWorksheet.Shapes 'move down all images because of print bug 45 shape.Top = shape.Top + 3 46 Next 47 xlWorkbook.SaveAs(fbd.SelectedPath & "\" & item_fld.Text & ".xls") 48 xlWorkbook.Close() 49 50 xlApp.Quit() 51 Next 52 53 End If 54 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) 55 ProgressBar1.Value = 0 56 57 End Sub
試したこと
オブジェクトの開放
補足情報(FW/ツールのバージョンなど)
うろ覚えですが
xlWorkbook
xlWorksheet
shapeも解放が必要かと思います。
それとたしか「Dim xlWorkbook As Excel.Workbook = xlApp.Workbooks.Open(template)」のように.が2個あってもだめだったと思うので
Dim xlWorkbooks As Excel.Workbooks = xlApp.Workbooks
Dim xlbook As Excel.Workbook = Workbooks.Open(template)
のようにしてxlbookも解放しましょう。
Excelの扱いは大変なのでClosedXML等のライブラリを使ったほうが楽になるかもしれません。
NerOffice を使うといいんじゃないでしょうか。
https://netoffice.io/
https://blog.jhashimoto.net/entry/20120826/1351042349
回答1件