質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

1回答

1242閲覧

VB.netでExcelのプロセスが終了しない

nullexp

総合スコア0

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2023/01/24 04:35

前提

バイトをしていてもっと効率化できると思い、独学で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/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bebebe_

2023/01/24 05:02

うろ覚えですが 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等のライブラリを使ったほうが楽になるかもしれません。
guest

回答1

0

動作確認はしていませんが、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 Dim xlWorkbook As Excel.Workbook ' ← ここで宣言 7 Dim xlWorksheet As Excel.Worksheet ' ← ここで宣言 8 9 Dim fbd As New FolderBrowserDialog 10 11 'Adding header description 12 fbd.Description = "エクセルファイルの保存先を指定してください。" 13 'Allow users to create new folders 14 'True as default 15 fbd.ShowNewFolderButton = True 16 17 ProgressBar1.Minimum = 0 18 ProgressBar1.Maximum = folder_lists.CheckedItems.Count 19 ProgressBar1.Value = 0 20 21 If fbd.ShowDialog(Me) = DialogResult.OK Then 'show save distination setting dialog 22 For Each item_fld As ListViewItem In folder_lists.CheckedItems 23 Dim imagePath As String = item_fld.SubItems(1).Text 24 Dim extensions As String() = {"*.jpg", "*.png", "*.bmp"} 25 Dim files As New List(Of String) 26 ProgressBar1.Value = ProgressBar1.Value + 1 27 28 For Each extension As String In extensions 'counting multiple extension files 29 files.AddRange(Directory.GetFiles(imagePath, extension)) 30 Next 31 32 Dim filesCount As Integer = files.Count 'amount of image files 33 34 35 xlWorkbookk = xlApp.Workbooks.Open(template) ' ここはdim宣言せず、代入のみ 36 xlWorksheet = xlWorkbook.Sheets(1) ' ここはdim宣言せず、代入のみ 37 38 Dim rng As Long = 1 39 40 For Each file As String In files 'insert pictures to the excel book 41 Debug.WriteLine(file) 42 xlWorksheet.Shapes.AddPicture(file, MsoTriState.msoTrue, MsoTriState.msoTrue, xlWorksheet.Range("B" & rng).Left, xlWorksheet.Range("B" & rng).Top, 355, 252) 43 rng = rng + 12 44 Next 45 46 For Each shape As Excel.Shape In xlWorksheet.Shapes 'move down all images because of print bug 47 shape.Top = shape.Top + 3 48 Next 49 xlWorkbook.SaveAs(fbd.SelectedPath & "\" & item_fld.Text & ".xls") 50 xlWorkbook.Close() 51 52 Next 53 xlApp.Quit() ' 位置変更 54 55 End If 56 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorksheet) ' シート 57 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook) ' ブック 58 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) ' アプリの順で開放 59 ProgressBar1.Value = 0 60 61 End Sub

投稿2023/01/24 13:38

crowmt

総合スコア402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問