.NETでエクセル解放がうまくいかない理由と解決方法
- Excelを解放する際に発生する問題とその解決方法について説明します。
- エクセル解放時に発生するエラーの原因と対処法を解説します。
- .NETでエクセルを解放する方法についての詳しい説明をします。
- ベストアンサー
.NETでエクセル解放がうまくいきません.
ネット上で散々ある良回答を拝見させていただいても, 自分で解決しきれませんでした.どうぞよろしくお願いいたします. 下の2行を追加するとエクセルが解放できなくなってしまいます. Private Sub Excel一括置換(ByRef N As Integer) Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim WB As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim Mypath As String = TextBoxパス.Text Dim FName As String FName = Dir(Mypath & "*.xls", vbNormal) Do While FName <> "" WB = xlBooks.Open(Mypath & FName) For Each xlSheet In WB.Worksheets 'For N_s = 1 To WB.Worksheets.Count Next 'Next N_s ' ↑の2行がなくなれば無事解放できます MRComObject(xlSheet) : xlSheet = Nothing WB.Save() : WB.Close() MRComObject(WB) FName = Dir() Loop Me.Activate() xlSheet = Nothing WB = Nothing MRComObject(xlBooks) : xlBooks = Nothing xlApp.Quit() : MRComObject(xlApp) : xlApp = Nothing End Sub 最初の「For N_s = 1 To WB.Worksheets.Count」という書き方だと, ネット上で見かけるWorksheet「暗黙のオブジェクト」になるのかな??と思い, xlSheetを宣言してみましたが,うまくいきません. できればFor N_s = ~ という記述法にしたいのですが... お詳しい方がいらっしゃれば,どうぞよろしくお願いいたします.
- camputer
- お礼率96% (29/30)
- Visual Basic
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは、 私も、エクセルのオブジェクトの解放の問題になったときに 紹介されたページ http://hanatyan.sakura.ne.jp/dotnet/index.html 花ちゃん、コード見ると、このページにもたどり着いた様に 見受けられますが。 このページと、camputerさんのコードを見て 気づいた点として、 Dim xlSheets As Excel.Sheets = xlBook.Worksheets (注意)Sheetも宣言しますが、Sheetsも宣言しています。 がないですね。 そのせいか、 xlSheetsの表現が、WB.Worksheets に変わっています。 花ちゃんでは、 花ちゃんから、転載**************** 1.基本的に、下記のように、[.]が2つ連続で使用されたら解放できません。 誤り xlRange = xlCells(1,1) xlRange.Interior.Color = RGB(0, 255, 0) '使った変数の解放処理(.NETからExcelの基本的な操作方法 参照の事) MRComObject(xlCells) MRComObject(xlRange) 正 xlRange = xlCells(1, 1) Dim xlInterior As Excel.Interior xlInterior = xlRange.Interior xlInterior.Color = RGB(0, 255, 0) MRComObject(xlInterior) MRComObject(xlCells) MRComObject(xlRange) 必ず、上記のように分解して変数に受けて、解放処理をして下さい。 ***************************************転載終了 WB.Worksheets.Countの表現を使っていますが。 花ちゃんからの転載に書いてある。[.]が2つ連続で使用されています。 ここは、WB.WorksheetsをxlSheetsで受けて、 xlSheets.Countに変えたほうが、良い様な気がします。 とうぜん、xlSheetsを、使っているので、他にもこれ用にコードを 変更しないと、いけないかも知れませんが。 後は、気がついた点は、ないです。 外していたら、ごめん。
関連するQ&A
- (再質問) .NETでエクセル解放に悩んでおります.
数個前のスレッドで勘違いして,締め切らせていただきました. 申し訳ございません.未解決で同じ質問をさせてください. コードの流れといたしましては, エクセル操作 ↓ エクセル解放 ↓ ←下記2行のコードが無ければ,この時点でExcel.exeは消えています. MsgBox("終了") ↓ アプリケーションを右上の×マークから終了(下記2行のコードを入れると,Excel.exeがギリギリまで残っております.) Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim WB As Excel.Workbook Dim xlSheets As Excel.Worksheets Dim xlSheet As Excel.Worksheet Dim Mypath As String = TextBoxパス.Text Dim FName As String FName = Dir(Mypath & "*.xls", vbNormal) Do While FName <> "" WB = xlBooks.Open(Mypath & FName) For Each xlSheet In WB.Worksheets Next ' ↑の2行がなくなれば無事解放できます WB.Save() : WB.Close() MRComObject(WB) FName = Dir() Loop Me.Activate() MRComObject(xlSheet) : xlSheet = Nothing MRComObject(xlSheets) : xlSheets = Nothing WB = Nothing MRComObject(xlBooks) : xlBooks = Nothing xlApp.Quit() : MRComObject(xlApp) : xlApp = Nothing MsgBox("終了") 先ほどのスレッドでアドバイス・指摘していただいた部分とあわせて 色々試してみましたが,自分では怪しそうな個所を見つけることすらできません... 暗黙宣言やNothing,Quit等ネットで見かけるものは一通り試したつもりなのですが... もしお詳しい方がいらっしゃれば,些細なことでも結構ですので なんでもアドバイスいただければ非常にうれしいです. どうぞよろしくお願いいたします.
- ベストアンサー
- Visual Basic
- エクセルの開放
VB2008でエクセルを操作しているのですが、エクセルのプロセスが残ってしまってどうやって解放すればいいのかわかりません。 サンプルプログラム-------------- Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Add Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) Dim xlobj As Object '開放用 xlobj = xlSheet.Range("A1:C3") xlobj.Value = "TEST" MRComObject(xlobj) MRComObject(xlSheet) MRComObject(xlSheets) xlBook.Close(False) MRComObject(xlBook) MRComObject(xlBooks) xlApp.Quit() MRComObject(xlApp) MRComObjectでCOM オブジェクトへの参照を解放しています。 このプログラムでは特に問題ないのですが、 xlobj = xlApp.Worksheets("Sheet2") xlobj2 = xlobj.Range("A1:C2") xlobj2.Value = "TEST" のようにワークシートを指定すると解放できません。 xlSheet = xlBook.Worksheets("Sheet2") としてもプロセスが残ります。 またVB6.0では可能だった xlApp.Worksheets("Sheet2").Select() のようにワークシートを切り替えるときもVB2008ではプロセスが残ってしまいます。 これはどのようにしたら解決するのでしょうか?
- ベストアンサー
- Visual Basic
- VB.NETからEXCELの起動が、うまくいかない
3回目の同じ質問になってしまうのですがよろしくお願いいたします。 下記のようなソースでEXCELファイルを作成し、その後ファイルを開くという処理をしています。 Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Add Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) Dim xlRange As Excel.Range Dim xlCells As Excel.Range = xlSheet.Cells xlRange = xlCells(1, 10) xlRange.Value = "--" xlRange = xlCells(1, 5) xlCells.EntireColumn.AutoFit() xlBook.SaveAs(sPath & "\" & sFileName, Excel.XlFileFormat.xlWorkbookNormal) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlCells) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlRange) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlSheet) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlSheets) xlCells = Nothing xlRange = Nothing xlSheet = Nothing xlSheets = Nothing xlBook.Close() System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlBook) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlBooks) xlBook = Nothing xlBooks = Nothing xlApp.Quit() System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp) xlApp = Nothing GC.Collect() System.Diagnostics.Process.Start(sPath & "\" & sFileName) ある特定のPCでのみEXCELのメニューバーとステータスバーのみしか表示されない状態です。 起動部分(Process.Start)をコメントアウトして確認したところ GC.COLLECTでEXCELが終了することなく、アプリの終了時にEXCELが終了する 状態にあります。 これはオブジェクトの開放がうまくいっていないのでしょうか? よろしくお願いいたします。
- ベストアンサー
- Visual Basic
- VB2005でExcelのシートをコピー
VB2005Expressで開発をしています。 Excelのシートをコピーして同じbookに追加をしたいと思っています。 下記でまずExcelを使用できるようにして Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Add '新規のファイルを開く Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) xlApp.Visible = True 下記で追加できると思うのですが、()内にセットするパラメータが わかりません・・・ xlBook.Worksheets.Copy() どなたかご存知の方がいらっしゃいましたら教えて下さい。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- VB.NET Excelの解放
Excel出力の解放について質問です。 下記URLを参考に作成しましたが、出力をし終えたときにプロセスを見るとExcelの解放がされません。 http://hanatyan.sakura.ne.jp/dotnet/Excel01.htm 助言をもらえないでしょうか? With SaveFileDialog1 .FileName = savefilename If .ShowDialog() = Windows.Forms.DialogResult.OK Then wstrPath = .FileName() If Func_Excelチェック(wstrPath) = False Then Exit Function End If End If End With Dim excel As New Excel.Application Dim xlbooks As Excel.Workbooks = excel.Workbooks Dim xlbook As Excel.Workbook = xlbooks.Add Dim xlsheets As Excel.Sheets = xlbook.Worksheets Dim xlsheet As Excel.Worksheet = xlsheets.Item(1) Dim xlCells As Excel.Range Dim xlRange1 As Excel.Range xlCells = xlsheet.Cells Dim i As Integer = 1 作成データテーブルに接続 xlRange1 = xlCells(1, 1) xlRange1.Value = "工場番号" MRComObject(xlRange1, True) While sqlReader.Read xlRange1 = xlCells(i + 1, 1) xlRange1(xlCells(i + 1, 1)).Select() xlRange1.Value = sqlReader("入力_工場番号") MRComObject(xlRange1, True) i += 1 End While excel.DisplayAlerts = False xlsheet.SaveAs(wstrPath) 'Select Case Val(excel.Version) 'Case 9 'xlbook.SaveAs(Filename:=wstrPath) 'Case 12 'xlbook.SaveAs(Filename:=wstrPath, FileFormat:=56) 'End Select 'MRComObject(xlsheet, True) excel.DisplayAlerts = True MRComObject(xlsheet)'xlSheet の解放 MRComObject(xlsheets)'xlSheets の解放 xlbook.Close()'xlBook を閉じる MRComObject(xlbook)'xlBook の解放 MRComObject(xlbooks)'xlBooks の解放 excel.Quit()'Excelを閉じる MRComObject(excel)'excel を解放 Private Function Func_Excelチェック(ByVal arg As String) As Boolean Dim excel As New Excel.Application Dim xlbooks As Excel.Workbooks = excel.Workbooks Dim xlbook As Excel.Workbook excel.Visible = False excel.Application.DisplayAlerts = False Try If System.IO.File.Exists(arg) = True Then xlbook = xlbooks.Open(arg) xlbook.SaveAs(arg, FileFormat:=42, CreateBackup:=False) MRComObject(xlbook, True) Return True Else Return True End If Catch ex As Exception MessageBox.Show("") Return False Finally xlbooks.Close() MRComObject(xlbooks, True) excel.Quit() MRComObject(excel, True) End Try End Function
- ベストアンサー
- Visual Basic
- VB.net(2005)でエクセルの特定名称のシートを操作したい。
お世話になります。 WindowsXP + SP3、VB.net(2005)の環境にて開発をしております。 VB.netから既存のエクセルファイル(雛形)を開き、特定の名称のシートを アクティブにしたいのですがどのようにコーディングすれば良いでしょうか? ※色々とネットで情報検索してみましたが特定の名前のシートを操作する 方法をうまく見つけられず質問致しました。 エクセルファイル名:売上情報_2009年.xls シート名 :"200901" ~ "200912" の12シート 以前、VB6で同様のことを行ったときは以下のような記述で実現できました。 Dim xlApp As Object Dim xlsheet As Object xlApp = CreateObject("Excel.Application") xlApp.Workbooks.Open(FileName:="C:\売上情報_2009年.xls") xlsheet = xlApp.Sheets("200908") xlsheet.Activate() 現状、vb.netで以下のコーディングまではできております。 Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Open("C:\売上情報_200904.xls") Dim xlSheets As Excel.Sheets = xlBook.Worksheets よろしくお願い致します。
- ベストアンサー
- Visual Basic
- VB2005でエクセルの機能を使うには
VB2005でエクセルに数値を貼り付けた後自動的に エクセルの機能を使ってA列で並び替えをしたいのですが可能でしょうか。 今のソース s1()の配列に数値がはいっている。 exp s1(1)="1.0,2.0,3.0,4.0......" Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlFilePath As String = Application.StartupPath & "\aaa.xls" Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath) Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) ':::::::::::::::::::::::::::::::::::::::::::::::sheet1 '-----貼り付け開始 Dim xlRange As Excel.Range Dim xlCells As Excel.Range Dim xlRange1 As Excel.Range xlCells = xlSheet.Cells Dim j Dim Col As String For i = 1 To irec - 1 temp = Split(s1(i), ",") For j = 0 To 12 xlRange1 = xlCells(3 + i, 1 + j) Col = xlRange1.Address(False, False) xlRange = xlSheet.Range(Col) xlRange.Value = temp(j) Next j Next i ここで並び替えしたいのですが。
- ベストアンサー
- Visual Basic
- VB2005でのEXCELマクロ操作
お世話になっております。 VB2005から指定したEXCELファイルを開き、標準モジュールにあるマクロを起動したいと考えております。 調べたところ、Runメソッドを使用するようですが、マクロファイルを開くところで停止してしまいます。 以下にソースを書きましたので、アドバイス頂きたいと思います。 Dim n As Short Dim xlApp As Excel.Application = Nothing Dim xlBooks As Excel.Workbooks = Nothing Dim xlBook As Excel.Workbook = Nothing Dim xlSheets As Excel.Sheets = Nothing Dim xlSheet As Excel.Worksheet = Nothing Dim xlRange As Excel.Range = Nothing Dim Fname As String = "C:\Documents and Settings\hoge\Application Data\Microsoft\Excel\XLSTART\PERSONAL.XLS" '読み込むファイル Try xlApp = New Excel.Application() xlBooks = xlApp.Workbooks For n = 0 To fil.Length - 1 xlBook = xlBooks.Open(fil(n)) xlSheets = xlBook.Worksheets xlApp.Run("'" & Fname & "'!module2.DB処理", fil(n)) '引数をもつ処理の呼び出し方法 '1000ミリ秒(1秒)待機する System.Threading.Thread.Sleep(1000) ' Excel ブックを保存する xlApp.DisplayAlerts = False xlBook.Save() Next ' Microsoft Excel を終了する xlApp.Quit() Finally If Not xlSheet Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) End If If Not xlSheets Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) End If If Not xlBook Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook) End If If Not xlBooks Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) End If If Not xlApp Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) End If End Try
- ベストアンサー
- Visual Basic
- EXCELのプロセスに関して
教えて下さい。 VB2008でEXCELを操作しようと考えていますが、以下のような記述をした場合、 EXCELのプロセスが残ってしまいます。 いろいろ調査し、いらない部分を削除した結果、以下のところまで絞込みを行い、 ****のところを削除した場合、問題なくプロセスは終了した為、****印の中の記述が 原因というところまで絞れました。 単純にブックの中のシートをコピーで追加しているだけですが、何がどのようにすれば プロセスは残らずに消えてくれるでしょうか。。。 よろしくお願いします。 《記述内容》 '既存のEXCELファイルを開く Dim xlFilePath As String = "C:\test.xls" '起動時の処理 Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath) xlApp.Visible = True ' 確認のためExcelのウィンドウを表示する Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = CType(xlSheets.Item(1), Excel.Worksheet) ************************* xlSheet = xlSheets.Item(1) 'シートの選択 xlSheet.Copy(After:=xlBook.Worksheets(1)) 'シートのコピー xlSheet = xlSheets.Item(2) '再度シートを選択 xlSheet.Name = "zz" 'シートに名前を付ける ************************* xlBooks.Close() xlApp.DisplayAlerts = False xlApp.Quit() ' COM オブジェクトの解放 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) ' Excel のプロセス終了 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
- ベストアンサー
- Visual Basic
- VB2005でのEXCEL制御について
いつもお世話になってます。 私はVB入門者です。 VBからシートを選択して値を入れることは出来たのですが 範囲選択→格子罫線をひく、といったような操作について 調べたところ、マクロをつくりコピーアンドペーストでスムーズに いくということがわかったので、試したところうまくいきませんでした。 又、質問ナンバー QNo.3575919 に [Visual Basic2005でExcelに罫線を描く]とあり 「CreateObject("Excel.Application")」はソースに入っているか という部分がポイントのようなので、少しいじってはみたのですが うまくかけませんでした。 と、いうよりも理解できませんでした。 下記のコードでは選択範囲を指定する部分まで成功したものです。 アドバイスよろしくお願いします。 Sub excel_app() Dim xlApp As Excel.Application = Nothing Dim xlBooks As Excel.Workbooks = Nothing Dim xlBook As Excel.Workbook = Nothing Dim xlSheets As Excel.Sheets = Nothing Dim xlSheet As Excel.Worksheet = Nothing xlApp = New Excel.Application() xlBooks = xlApp.Workbooks xlBook = xlBooks.Open("C:\hoge.xls") xlSheets = xlBook.Worksheets xlBook.Worksheets(1).Range("A31:Y55").Select() xlBook.Worksheets(1).Range.Borders. ←これ以降がわかりません。
- ベストアンサー
- Visual Basic
お礼
どうもありがとうございます. 分かりにくくてもうしわけございませ. 'For N_s = 1 To WB.Worksheets.Count のほうはコメントアウトしております. For Each xlSheet In WB.Worksheets が実行文になります. しかしtom11様のご指摘で Dim xlSheet As Excel.Worksheetではなく Dim xlSheet As Excel.Worksheetsにしたところ 正常に解放されるようになりました.ご指摘どうもありがとうございました. 今からExcel.WorksheetとExcel.Worksheetsについて勉強してみます. ほんとうにどうもありがとうございました.