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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

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

Q&A

解決済

3回答

2026閲覧

【VB.NET】【EXCEL】VB.NETでEXCELを操作した後オブジェクトを処理してもプロセスが残ってしまう

Ynn

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

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

0グッド

1クリップ

投稿2023/04/19 01:00

編集2023/04/19 01:10

お世話になっております
VB.NETでEXCEL操作を行っているのですが、処理の最後でコンポーネントを開放しているのにも関わらず、タスクマネージャー上にEXCELのプロセスが残ってしまいます
(ただしこのプロセスはアプリケーションを終了させると何故か消えます)
EXCELのバージョン等で動かない場合があるので今回オブジェクトはCreateObject("Excel.Application")にて作成しております
開放の仕方が悪いのでしょうか?
ご教示ください

当方で使用しているEXCELは2019です

該当のソースコード

VB.NET

1 Dim objXLApp As Object 2 Dim objXLBook As Object 3 Dim objXLSheet As Object 4 5 objXLApp = CreateObject("Excel.Application") 6 7 objXLApp.ScreenUpdating = False '画面を更新しないようにします 8 objXLApp.DisplayAlerts = False 'ユーザーに入力を促すメッセージや警告メッセージを表示させない 9 objXLApp.EnableEvents = False 'マクロ無効化 10 11 objXLBook = objXLApp.Workbooks.Open("C:\TEST.xlsx") 12 13 objXLBook.Worksheets(1).Activate() 14 objXLSheet = objXLBook.ActiveSheet 15 16 '値書き込み 17 objXLSheet.Range("C3") = "テスト" 18 19 '保存 20 objXLBook.SaveAs("C:\TEST2.xlsx") 21 22 objXLApp.EnableEvents = True 23 objXLApp.DisplayAlerts = True 24 objXLApp.ScreenUpdating = True 25 26 objXLBook.Saved = True 27 28 ' Microsoft Excel およびスプレッドシートへの参照を解放します。 29 System.Runtime.InteropServices.Marshal.ReleaseComObject(objXLSheet) 30 objXLSheet = Nothing 31 objXLBook.Close() 32 System.Runtime.InteropServices.Marshal.ReleaseComObject(objXLBook) 33 objXLBook = Nothing 34 objXLApp.Application.Quit() 35 System.Runtime.InteropServices.Marshal.ReleaseComObject(objXLApp) 36 objXLApp = Nothing

試したこと

ただオブジェクトをNothingにするだけではなくSystem.Runtime.InteropServices.Marshal.ReleaseComObjectで開放した

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

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

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

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

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

len_souko

2023/04/19 14:08

古い記事にはなりますがこういうのが在ります https://qiita.com/midori44/items/acab9106e6dad9653e73 ありとあらゆるものを変数に逐一格納しないと解放漏れが起きるとのことで、Officeをインストールされていないと使えない等の面からも「Microsoft.Office.Interop.XXXX」系は使用しない方が良さそうです
guest

回答3

0

解放漏れに気付けないことがあるため、
注意しないといけないですよね。
コードを見てみて、気づいた点を下に記載してみますね。
(気付けていないところもあるかもしれません・・)

vb

1' objXLApp.Workbooksを変数に保持して解放する必要があると思います。(要素の「book」だけではなく、コレクションの「books」) 2objXLBook = objXLApp.Workbooks.Open("C:\TEST.xlsx") 3' objXLBook.WorksheetsとobjXLBook.Worksheets(1)を変数に保持して解放する必要があると思います。(コレクションの「sheets」と要素の「sheet」) 4objXLBook.Worksheets(1).Activate() 5' objXLSheet.Range("C3")を変数に保持して解放する必要があると思います。 6objXLSheet.Range("C3") = "テスト"

途中で例外が発生した場合もちゃんと解放してあげる必要があるみたいで、
すごく面倒なコードになるみたいです。
下のリンクも見てみると良いかもしれません。

VB.NET - COM オブジェクトの参照カウントを解放する

追記です。

コメントありがとうございます。

objXLSheet.Cells(6, 6) = "テスト" も使っているのですがこれも変数に保持して解放してあげる必要があるのでしょうか

ちょっと手元に環境がないため、
間違いを書いてしまうかもしれませんが・・
ここはちょっと気付くのが難しいポイントだった気がします。

引用したコードを見ますと、
Cellsの部分で一度保持して、
さらにxlCells(6, 4)の部分も保持する感じになるみたいですね。

vb

1 Dim xlCells As Excel.Range = xlSheet.Cells 2 Try 3 Dim xlRange As Excel.Range = DirectCast(xlCells(6, 4), Excel.Range)

VB.NET - COM オブジェクトの参照カウントを解放する

投稿2023/04/19 02:25

編集2023/04/19 02:58
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Ynn

2023/04/19 02:50

ありがとうございます 文字をセルに入れるとき、 objXLSheet.Cells(6, 6) = "テスト" も使っているのですがこれも変数に保持して解放してあげる必要があるのでしょうか
guest

0

ベストアンサー

過去似たような事になったときに「objXLBook = objXLApp.Workbooks.Open("C:\TEST.xlsx")」のように「.」を複数使ってしまうとプロセスが消えない状態になった覚えがあります。
こういった感じにした場合はどうですか?

Dim objXLApp As Object = Nothing Dim objXLBooks As Object = Nothing Dim objXLBook As Object = Nothing Dim objXLSheets1 As Object = Nothing Dim objXLSheet As Object = Nothing objXLApp = CreateObject("Excel.Application") objXLApp.ScreenUpdating = False '画面を更新しないようにします objXLApp.DisplayAlerts = False 'ユーザーに入力を促すメッセージや警告メッセージを表示させない objXLApp.EnableEvents = False 'マクロ無効化 objXLBooks = objXLApp.Workbooks objXLBook = objXLBooks.Open("C:\TEST.xlsx") objXLSheets1 = objXLBook.Worksheets(1) objXLSheets1.Activate() objXLSheet = objXLBook.ActiveSheet '値書き込み objXLSheet.Range("C3") = "テスト" '保存 objXLBook.SaveAs("C:\TEST2.xlsx") objXLApp.EnableEvents = True objXLApp.DisplayAlerts = True objXLApp.ScreenUpdating = True objXLBook.Saved = True ' Microsoft Excel およびスプレッドシートへの参照を解放します。 System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objXLSheet) objXLSheet = Nothing System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objXLSheets1) objXLSheets1 = Nothing objXLBook.Close() System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objXLBook) objXLBook = Nothing System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objXLBooks) objXLBooks = Nothing objXLApp.Application.Quit() System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objXLApp) objXLApp = Nothing

投稿2023/04/19 02:32

bebebe_

総合スコア504

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

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

Ynn

2023/04/19 03:05

ありがとうございます ご提示していただいたプログラムでは見事プロセスが消えました ですが実際のプログラムで使っている objXLSheet.Cells(i, j) = "テスト" というセルに書き込んでいる記述があるのですがこれを使うとまたプロセスが残ってしまいます…
bebebe_

2023/04/19 04:03

ループ内に記述していますか? 恐らく同じように宣言をして 「For i = 1 To 10 objXLCells = objXLSheet.Cells(i, j) objXLCells.Value = "テスト" System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objXLCells) Next」 のようにその都度解放する必要があった気がします。
Ynn

2023/04/20 00:54

ご協力感謝します!
guest

0

objXLApp.Application.Quit()を
objXLBook.Close()より前に実行してみてください。

いつからか仕様がちょこっと変わったような気もします
https://answers.microsoft.com/ja-jp/msoffice/forum/all/excel2010-vba/137099ad-fdb6-4480-af11-8c37d4c17fe8

投稿2023/04/19 01:39

h-kn

総合スコア30

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

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

Ynn

2023/04/19 01:49

試してみましたがobjXLBook.Close()で System.Runtime.InteropServices.COMException: '起動されたオブジェクトはクライアントから切断されました。 とエラーが出て止まってしまいます… 以下のように試しました objXLApp.Application.Quit() objXLBook.Close() System.Runtime.InteropServices.Marshal.ReleaseComObject(objXLSheet) objXLSheet = Nothing System.Runtime.InteropServices.Marshal.ReleaseComObject(objXLBook) objXLBook = Nothing System.Runtime.InteropServices.Marshal.ReleaseComObject(objXLApp) objXLApp = Nothing
h-kn

2023/04/19 02:02

見当違いならすみません。 objXLBook.Close()を除けて実行した場合、正常に動きますか?
Ynn

2023/04/19 02:23

ありがとうございます 最後まで動作するようですがやはりプロセスは残ってしまいますね 今回もプログラムを終了すると消えるようですが…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問