• 締切済み

【VB】タスクマネージャでEXECELが残る件

VisualBasic2008で、ボタンを押すとTest.xlsを開いて閉じるという簡単なプログラムを作成しています。 ワークブックのCloseとアプリケーションのQuitをしているのも関わらず ボタンを押す度に、タスクマネージャに『EXCEL.EXE』が増え、消えない状態です。 フォームを閉じると『EXCEL.EXE』は消えるのですが、 フォームを閉じない状態で、『EXCEL.EXE』を消すことはできないのでしょうか? 以下、コードです。 ----------------------------------------------- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim AAA As Excel.Application Dim BBB As Excel.Workbook Dim CCC As Excel.Worksheet AAA = CreateObject("Excel.Application") BBB = XL.Workbooks.Open("C:\Work\Test") CCC = XM.Worksheets(1) CCC = Nothing BBB.Close(SaveChanges:=False) BBB = Nothing AAA.Quit() AAA = Nothing End Sub ----------------------------------------------- 終了処理のコードが間違っていましたらご指摘ください。 わかる方いらっしゃいましたら、是非お願い致します。

みんなの回答

  • camputer
  • ベストアンサー率64% (22/34)
回答No.3

 今晩は。「開放」漏れについては様々な要因がありますので (宣言方法・開放順序・開放コードの種類、その他特別なコーディング下で発生)、 それらを1個づつ指摘されて、次にまたコード追加する度に何故か開放できない、と ずっと苦労し続けるよりは、まずお手本コードに従って一気に「矯正」してしまう方が 今後楽ですし、理解も早いです。  まず、宣言方法を少しミスるだけでも環境によっては突然開放できなくなりますので http://www.hanatyan.sakura.ne.jp/ の、VB2005関係専用→Excel・Word・他(30) に書いてくださっているコードに すべて直してみてください。MRComObjectで都度開放してください。 Close・Quitまで、このページを参考にさせていただく形が良いです。 (以前、Excelを扱うソフトで4万行以上のコードを書いたことがありますが、 このサイトの宣言・開放コードですべて開放できました^^) →次にこの状態で AAA = Nothing MsgBox("終了") End Sub としてButton1を押し、正常に開放されていればMsgBox表示中にタスクマネージャ上から Excel.exeが消えます。 →消えていなければ開放漏れがどこかに潜んでいますので、不要なコードを全て消して Excel.exeが消える事を確認。 たまに、MsgBoxを「閉じれば」Excelが消える、といった現象が現れますが、 「正常開放された」と誤認識させられやすいです。MsgBox「表示中」に消えるのが正常です。 注意するのが、開放ミスしているコードでも正常にExcelが消えてくれる事が ある、という事です。一度でも消えなければ、どこかに開放ミスがあると睨んでよいです。 →消えるようになれば、数行づつコードを書き足していきExcelが消えていることを 都度確認してください。消えなくなった時点でその部分が開放ミスだと分かりますので、 今後自分で「特別環境下・稀な形での開放漏れ」の検出ができるようになります。  あとこのような癖をつけておけば、上記「その他特別なコーディング下で発生」するような 開放ミスについても悩まずにクリア出来るようになります。 (自分の場合、上記が全て1から手探りでしたので散々苦労しましたが。。。)  少しでもお役に立てば幸いです。  どうぞ頑張ってください ^^b

  • localica
  • ベストアンサー率52% (202/385)
回答No.2

CloseするからQuiteが処理されないのです。

Macchomu
質問者

お礼

どういうことでしょうか? 具体的にご指摘くださりますでしょうか?

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

これはかなり有名な話ですね。 適当なキーワードで検索しても分かったはずですが? http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm

関連するQ&A

  • タスクマネージャーのプロセスから消えなくなる

    こんばんは。 フォームにボタンを設置して、そのボタンをクリックすると 既存のアクセスファイルを開くようにしているのですが そのアクセスファイルを終了させてもタスクマネージャーのプロセスタブの MSACCESS.EXE*32 がいつまでも残ってしまいます。 VBのフォームを閉じると、MSACCESS.EXE*32は消えます。 VBのコードは、 Private Sub cmb_Access_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmb_Access.SelectedIndexChanged Call AccessOpen() End Sub ------------------------------ 標準モジュール Sub Access_Open() Dim AccApp As Access.Application Dim MyPath As String MyPath = "C:\test.accdb" AccApp = CreateObject("Access.Application") AccApp.OpenCurrentDatabase(MyPath) AccApp.Visible = True AccApp.UserControl = True AccApp = Nothing End Sub です。 VBのフォームから test.accdbを開く→閉じるを繰り返してると、 プロセスが溜まってしまって、アクセスでエラーが起こります。 なので、VBからアクセスを開いて閉じてたら、 プロセスも終了させるようにしたいのですが、 どうすればいいでしょうか? ご回答よろしくお願いします。

  • VB2008とExcel2003連携

    VB2008とExcel2003連携 VBでExcelの操作を、VBのボタン操作でOPEN処理、CEL操作、CLOSE処理をそれぞれ単独に処理したいのですが方法がわかりません。以下の記述では、OPEN処理後、CEL操作のため再度呼び出すと、前回呼び出したOPEN処理の内容が残っていません。VBAはある程度理解していますが、VBのCLASS等の概念が良く理解できていません。できれば、OPEN処理、CELの処理、CLOSE処理を別々のSUBにしたいので、その方法を優先して教えていただければ幸いです。 宜しくお願いします。 Public Class Form1 Public Sub xlsAccess(ByVal xlPrc As String) Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim strFilename As String = "C:\TEST\SAMPLE.xls" 'ファイル名(フルパス)をセット Dim strSheetName As String = "Sheet1" 'シート名/シート名をセット ‘【EXCELファイルを開く】 If xlPrc = "OPEN" Then xlApp = CreateObject("Excel.Application") 'Application生成 xlApp.Workbooks.Open(Filename:=strFilename, UpdateLinks:=0) 'EXCELを開く xlApp.Visible = True 'EXCELの表示 xlBook = xlApp.Workbooks(Dir(strFilename)) 'Workbook xlSheet = xlBook.Worksheets(strSheetName) 'Worksheet xlSheet.Cells(1, 1).Value = "HELLO" End If '【EXCEL セル操作】 If xlPrc = "R/W" Then For k = 2 To 10 Step 1 xlSheet.Cells(k, 2).Value = xlSheet.Cells(1, 1).Value Next k End If ‘【EXCELファイル終了処理】 If xlPrc = "CLOSE" Then xlBook.Close(SaveChanges:=True) 'ブックを保存して終了 xlApp.Quit() 'EXCELを閉じる xlSheet = Nothing 'オブジェクトの解放 xlBook = Nothing 'オブジェクトの解放 xlApp = Nothing 'オブジェクトの解放 End If End Sub ‘【ボタン操作OPEN】 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click xlsAccess("OPEN") MsgBox("Open Excuted") End Sub ‘【ボタン操作、CEL操作】 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click xlsAccess("R/W") MsgBox("R/W Excuted") End Sub ‘【ボタン操作、CLOSE】 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click xlsAccess("CLOSE") MsgBox("CLOSE Excuted") End Sub End Class

  • Excelにおけるセルの値をVB2005に配列として取り込みたい

    Excelのセルの値をVB2005に配列として取り込みたいのですが、Excel.Rangeと配列の整合性が取れず困っています。 なんらかヒントになるような助言をお願いします。 以下は今までに作成中のコードです。 Public Class Form1 Dim xlsapp As New Excel.Application Dim xlsbook As Excel.Workbook Dim xlssheet As Excel.Worksheet Dim fn As String = "sample.xls" Dim Q(,,) As Double Dim i, j, x, y, z As Integer Dim k As Double Dim w(i), v(i), u(i) As Double Dim As Object Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click xlsbook = xlsapp.Workbooks.Open(fn) xlssheet = xlsbook.Worksheets(1) k = 1 w(i) = xlssheet.Cells(1, 3) v(i) = xlssheet.Cells(1, 2) u(i) = xlssheet.Cells(1, 1) For x = 2 To 11 If w(i) = 1 Then For y = 2 To 11 If v(i) = 1 Then Q(1, 1, k) = u(i) k = k + 1 End If Next End If Next z = k For k = 1 To z TextBox1.Text = Q(1, 1, k) Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Me.Close() xlsapp.DisplayAlerts = False xlssheet = Nothing xlsbook.Close() xlsbook = Nothing xlsapp.Quit() xlsapp = Nothing End Sub End Class

  • vb2008で操作中のエクセルが解放されてない?

     質問させていただきます.どうぞよろしくお願いします.  vb2008で,エクセル操作をするアプリケーションの作成を試みております. コードの流れとしましては,  エクセル操作   ↓  オブジェクト・アプリケーション解放   (自分的にはここでタスクマネージャからExcel.exeが              消えると思うのですが,残ります)   ↓  メッセージボックス「終了」   ↓  アプリケーションを右上の×マークで閉じる   (タスクマネージャからExcel.exeが消えます) となります.  色々なページを参考にさせていただいて,Excelが解放されるように したつもりなのですが,VBアプリケーション終了ギリギリまで 存在し続けるという事は,うまく解放できていないということなのでしょうか?  作成したコードは以下のようになります. (バグ取り中に,エクセル操作部分のコードはほとんど消去してみました. しかしまだ上記のような現象になっております) Private Sub ButtonA_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonA.Click Dim N_e As Integer Call Excel一括置換(N_e) MsgBox("終了" ) End Sub Private Sub Excel操作(ByRef N As Integer) Dim xlApp As New Excel.Application Dim xlBooks As Object Dim WB As Object Dim Rng As Object '================== 終了処理 ===================== Rng = Nothing : MRComObject(Rng) WB = Nothing : MRComObject(WB) xlBooks = Nothing : MRComObject(xlBooks) xlApp.Quit() : xlApp = Nothing : MRComObject(xlApp) End Sub Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False) If objCom Is Nothing Then Return End If Try If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then If force Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom) Else Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom) Debug.WriteLine(count) End If End If Finally objCom = Nothing End Try End Sub  何か些細なことでもご指摘いただければ非常に助かります. どうぞよろしくお願いたします.

  • VB.NetでExcelシート削除

    独学で、VB2010にてAccess、Excel連携のプログラムを組んでいます。 ある集計結果をExcelに代入してそのシートのみだけにして(その他集計シートがあります。) 別名ファイルでデスクトップへ保存するようにしたいです。 For Each~Nextで指定のシート名以外を削除するというコードを書いたつもりなのですが、うまく動作しません。 ご教授お願いします。 (Excelはcom参照していません。) Private Sub Button出力_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button出力.Click '===============Excel入力=============== Dim xlApplication Dim xlBooks Dim xlSheets xlApplication = CreateObject("Excel.Application") ' Excelのインスタンス作成 'ファイル名(フルパス) Dim xlFilename As String = 集計ExPath xlApplication.Visible = False ' Excelの表示 xlBooks = xlApplication.Workbooks.Open(xlFilename) xlBooks = xlApplication.Workbooks(Dir(xlFilename)) 'Workbook xlSheets = xlBooks.Worksheets("AAA") 'Worksheet その他Excel処理 xlApplication.DisplayAlerts = False Dim DelSheet As Object For Each DelSheet In xlBooks.Worksheets If DelSheet.Name <> "AAA" Then DelSheet.Delete() End If Next xlBooks.saveas(System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\新ファイル名.xlsx") xlBooks.Close xlApplication.DisplayAlerts = True xlApplication.Quit() ' Excel を終了する xlSheets = Nothing xlBooks = Nothing xlApplication = Nothing MsgBox("出力処理終了しました。") Me.Close() End Sub

  • VB初心者です。コードの書き方が分かりません。

    VB初心者です。 VBで(zのn乗)-(xのn乗+yのn乗)の計算が出来るようにしたいのですが、答えが必ず-1になってしまいます。 Option Explicit On Public Class Form1 Dim x As Long Dim y As Long Dim z As Long Dim n As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click TextBox5.Text = (z ^ n) - (x ^ n + y ^ n) End Sub End Class 正しいコードの書き方を教えて下さい。 また特定の答えのときにメッセージを表示したいのですが、どうすればいいですか?

  • VBからエクセルを起動。そのあとエクセルを終了

    教えてください。 VBからエクセルを起動します。 そのあと、エクセルのシートの上にデータを貼り付けます。そして、エクセルを終了します。 しかし、エクセルが終了しません。 タスクバー上のエクセルをクリックすると終了します。 どうして、このような現象が起こるのかわかりません。 教えてください。 下記に同様のサンプルを書きました 誤記入があるかも知れませんが このような感じのプログラムです。 以上、よろしくお願いします。 public sub test Dim XApp as Excel.Application Dim nfilename as string Dim xlBook As Object Dim xlSheet As Object ' エクセルを起動 Set xlApp = New Excel.Application nfilename ="AAAA.xls" ' 指定されたファイルを開く Call xlApp.Workbooks.Open(nfilename) Set xlBook = xlApp.ActiveWorkbook Set xlSheet = xlBook.Worksheets(1) 'フォームを貼り付ける xlSheet.Range("a1").PasteSpecial      'ファイル名の作成 Filename="BBBB.xls" '保存 ChDir "C:\" xlBook.SaveAs Filename:=Filename,FileFormat:=xlNormal, _ Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False Set xlSheet = Nothing xlBook.Close True Set xlBook = Nothing xlApp.Quit Set xlApp = Nothing End sub

  • datagridviewからエクセルへ出力する際のエラーについて

    datagridviewからエクセルへ出力する際のエラーについて いつもお世話になります。 datagridviewに表示されたデータをエクセルへ出力したく以下のコードを書きました。 Imports System.IO Imports System.Data Imports System.Data.SqlClient Imports Microsoft.Office.Interop Public Class form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cn As OleDb.OleDbConnection _ = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2008\コピー ~ 社会保険計算.mdb;") End Sub Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click Dim xlapp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet 'Excelを開く xlapp = CreateObject("Excel.Application") xlapp.Visible = True xlapp.Workbooks.Add() xlBook = xlapp.ActiveWorkbook xlSheet = xlBook.ActiveSheet 'シートの編集 ☆ xlSheet.Cells(1, 1).Value = DataGridView1(1, 1).Value.ToString  xlSheet.Cells(2, 1).Value = DataGridView1(2, 1).Value.ToString xlBook.Close() xlapp.Quit() xlBook = Nothing xlapp = Nothing End Sub ☆マークで止まってしまいます。 argumentoutofrangeexceptionがハンドルされませんでした。 インデックスが範囲を超えています。負でない値でコレクションのサイズよりも小さくなければなりません。 パラメータ名:index と表示されます。 環境は、VB.NET2008     XP(SP3)     Excel2007 になります。 上記のエラーで止まり、エクセルも立ち上がりぱなしです。 お忙しい所お手数をお掛けしますが、ご教授下さい。

  • 既に開いているエクセルを閉じるには?

    既に該当のファイルが開いているのなら閉じたいのですが xlBook.Quitだとエラーになります。 Sub test1() Dim xlApp As Excel.Application Dim xlBook As Workbook Dim FileName As String FileName = "C:\test.xlsm" Set xlApp = GetObject("", "Excel.Application") 'GetObjectで合ってるか不安 Set xlBook = xlApp.Workbooks.Open(FileName) If xlBook.ReadOnly = True Then 'ファイルが開いてるのなら MsgBox "既にファイルが開いているので閉じます。" xlBook.Quit 'エラー 438 End If xlApp.Quit 'これって何のために必要? Set xlBook = Nothing 'ココを通り過ぎるのにすごく時間がかかる。 Set xlApp = Nothing End Sub と言うコードを作りました。 xlBook.Quitがダメならどのコードを使えばいいでしょう? また、 GetObject("", "Excel.Application") と言う開き方でいいのでしょうか? あと、 xlApp.Quit は何のために必要なのでしょう? タスクマネージーのプロセスを見ると、 Set xlApp = GetObject("", "Excel.Application") を通る時に新しいEXCEL.EXEが作成され、 Set xlApp = Nothing を通り過ぎる時に、そのEXCEL.EXEが消えます。 だから xlApp.Quit は不要ですか?

  • VB2008EEラジオボタンにて、

    VB2008EEラジオボタンにて、 チェックされていない時、というのはif文で指定できるでしょうか? チェックボックスは、下記で出来ますが、ラジオボタンでは出来るでしょうか? Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If CheckBox1.CheckState = CheckState.Unchecked Then   aaa = "1" End If End Sub 複数のラジオボタンがあって1つ選んだ後に別のを選び直した後に、選ばれてないほうの値を変えたいです。 Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged aaa = "1" End Sub Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged bbb = "2" End Sub

専門家に質問してみよう