C#でのEXCEL出力に関する問題

このQ&Aのポイント
  • C#でEXCELシートにデータを出力した際、EXCELファイルを開くと中身のシートが表示されない現象について
  • 記述に過不足がある場合について指摘
  • 解決方法についての質問
回答を見る
  • ベストアンサー

C#でのEXCEL出力に関して

教えて下さい。 C#でEXCELシートにデータを出力していますが、その際に以下のような記述をした場合、 EXCELファイルは作成されるものの、そのファイルをダブルクリックで開こうとすると、 EXCELの枠だけ表示され、中身のシートが表示されない現象となってしまいます。 それらしきオブジェクトはすべて開放しているつもりですが、その事象を解決できません。 どこがおかしいか教えて頂きたいと思います。 記述に過不足あればご指摘下さい。 尚、環境は、WindowsXP Office2000-EXCEL です。 《記述内容》 ////////////////////////////////// //ここからエクセルシートへの転記// ////////////////////////////////// Excel.Application objExcel = null; Excel.Workbooks objBooks = null; Excel.Workbook objBook = null; Excel.Worksheet sheet = null; Excel.Range range1 = null; Excel.Range range2 = null; Excel.Range range3 = null; //ExcelのCOMオブジェクトの生成 objExcel = new Excel.Application(); //Excelを表示する設定 //objExcel.Visible = isVisible; //ワークブックの集合体取得 objBooks = objExcel.Workbooks; //ブックの新規作成 objBook = objBooks.Add(Missing.Value); //シートを取得 sheet = (Excel.Worksheet)objBook.Sheets.get_Item(1); //Rangeを取得 range1 = (Excel.Range)sheet.Cells[1, 1]; range2 = (Excel.Range)sheet.Cells[1, 2]; //文字列を設定 //ヘッダ書き込み range1.Value = "仕入先名"; range2.Value = "図面番号"; //エクセルシート側の行数カウント変数 int rcount = 2; //データテーブル側の行数カウント変数 int tcount = 0; for (tcount = 0; tcount < mst_cnt;tcount++ ) { range1 = (Excel.Range)sheet.Cells[rcount, 1]; range2 = (Excel.Range)sheet.Cells[rcount, 2]; range1.Value = 仕入先名[tcount]; range2.Value = 図面番号[tcount]; rcount++; } //エクセルシート削除 DeleteFile(@"c:\\" + h_no + ".xls"); //エクセルシート生成 objBook.SaveAs( "c:\\" + h_no + ".xls", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, 0, Missing.Value, Missing.Value, Missing.Value, Missing.Value ); //COMオブジェクト解放 Marshal.ReleaseComObject(range1); Marshal.ReleaseComObject(range2); //COMオブジェクトの開放(必須) Marshal.ReleaseComObject(objBook); objBook = null; Marshal.ReleaseComObject(sheet); sheet = null; Marshal.ReleaseComObject(objBooks); objBooks = null; //System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel); objExcel.Quit(); Marshal.ReleaseComObject(objExcel); objExcel = null; //objExcel.Quit(); return; } よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>range1.Value = 仕入先名[tcount]; >range2.Value = 図面番号[tcount]; の部分がエラーになるので range1.Value = tcount; range2.Value = tcount; に変更し、 >DeleteFile を System.IO.File.Delete に変更して試してみましたが、こちらの環境 ( Windows XP、VS 2008、Excel 2000 ) では再現できませんでした。 どこか別の関数とかで Excel の開放ができていないとか? タスクマネージャのプロセスタブを監視しながら動作させてみてはいかがでしょうか。

yurix_1
質問者

補足

ご回答ありがとうございます! 早速、教えて頂いた内容の通り記述してみましたが、結果は同じでした。 確かにタスクマネージャのプロセスは、EXCEL.EXEが残ったままです。 何か開放忘れでしょうか。。。 申し訳ありません。 もう少し教えて頂きたいと思います。

その他の回答 (1)

回答No.1

なんだか不可解な現象ですけど、出力したファイルを開こうとしたときに、ガベージコレクトされずにメモリ上に残っていた Excel がアクティブになると問題の現象が起きるようです。 xls に出力した後で、メモリ上に残っている Excel をタスクマネージャで強制的に終了させると、この現象は起きないと思います。 とりあえず、 >objExcel.Quit(); >Marshal.ReleaseComObject(objExcel); >objExcel = null; の後に GC.Collect(); を入れてみてはいかがでしょうか。

yurix_1
質問者

補足

ご回答ありがとうございます! ご指摘頂いたように記述したら正しく起動するようになりました。 但し、もう1点、上記の記述をした場合、プログラムが起動している 最中はどうしても正しく開きません。(今までと同じ現象) 起動している最中は、何か掴んでいるのでしょうか??? 教えて頂ければ幸いです。 よろしくお願いします。

関連するQ&A

  • C#で複数のエクセルを閉じる方法

    c#で複数のエクセルを起動(オープン)させた後に、起動させたエクセルを閉じる(クローズ) させる為に、下記ソースを記載しましたが、エラーになってしまいます。 ※エラー内容としましては、例えば2ファイルのエクセルを起動させて閉じる場合、1ファイルは正常に閉じれるのですが、もう1ファイルを閉じる際にエラーとなってしまいます ※下記URLの内容を全てやったのですけれども解決できません。 (https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/0f210f52-366... ご教示の程、よろしくお願い申し上げます。 private List<String> filepath = new List<String>(); Excel.Workbook objWorkBook = null; finally { if (objWorkSheet != null) { Marshal.ReleaseComObject(objWorkSheet); objWorkSheet = null; } if (xlSheets != null) { Marshal.ReleaseComObject(xlSheets); xlSheets = null; } if (objWorkBook != null) { for (int I = 0; I < filepath.Count; I++) { objWorkBook.Close(false, filepath[I], true); } Marshal.ReleaseComObject(objWorkBook); objWorkBook = null; } if (objWorkBooks != null) { objWorkBooks.Close(); Marshal.ReleaseComObject(objWorkBooks); objWorkBooks = null; } if (objExcel != null) { objExcel.Workbooks.Close(); objExcel.Quit(); Marshal.ReleaseComObject(objExcel); objExcel = null; } GC.Collect(); }

  • VS2003.NET(C#)からのEXCELのプロセス解放

    ご存知の方がいたら教えて下さい。 【動作環境】 OS:WINDOWS XP(SP2) VisualStadio20003.NET(C#) EXCEL2003 VS.NETのプロジェクトメニューの参照の追加で「Microsoft Excel 11.0 Object Library」を追加してあります。 セルの更新を行った場合に、プロセスが解放されずに残ってしまいます。 (セルの更新を行っている行を実行しない場合にはプロセスは解放されます) いろいろ調べてはみたのですが、どうも原因がつかめません。 ご存知の方がいましたら教えてください。 (以下ソースコードになります) Excel.Application app; Excel.Workbook book; Excel.Worksheet sheet; Excel.Workbooks books; Excel.Sheets sheets; Excel.Range range; app = new Excel.Application(); books = app.Workbooks; book = books.Add("c:\\inetpub\\wwwroot\\ExcelData.xls"); sheets = book.Worksheets; sheet = (Excel.Worksheet)sheets["Sheet1"]; range = sheet.get_Range("A1","A1"); range.Value2 = "テストです"; // 解放 Marshal.ReleaseComObject(range); Marshal.ReleaseComObject(sheet); Marshal.ReleaseComObject(sheets); Marshal.ReleaseComObject(book); Marshal.ReleaseComObject(books); // Excel終了 app.Quit(); Marshal.ReleaseComObject(app); よろしくお願いします。

  • EXCELファイルからの値取得に関して

    環境:Visual Basic 2008 教えて下さい。 画面上から2つのEXCELファイルを指定し、1回の処理でその2つの EXCELからそれぞれ値を取得したいと考えています。 その為、以下のような記述をしましたが、2回目の値取得のところで "オブジェクト参照がオブジェクト インスタンスに設定されていません。" というエラーメッセージとなってしまいます。 1つのファイルから取得する事は経験ありましたが、同時に2回は初めてで ある為、記述方法が正しいのか、、、 どのように記述したら良いかを教えて下さい。 初歩的な質問で申し訳ありませんが、よろしくお願いします。 《記述内容》 'EXCELファイルを開く Dim xlFilePath As String = ofd1.FileName '起動時の処理 Dim xlApp As Object xlApp = CreateObject("Excel.Application") Dim xlBooks As Object = xlApp.Workbooks Dim xlBook As Object = xlBooks.Open(xlFilePath) '現シート数 Dim S_COUNT As Integer = xlBook.Worksheets.Count Dim xlSheets As Object = xlBook.Worksheets Dim xlSheet As Object = CType(xlSheets.Item(1), Object) '現シート数 S_COUNT = xlBook.Worksheets.Count Dim R_名称 As String R_名称 = "" R_名称 = xlSheet.Cells(1, 1).Value 'COM オブジェクトの解放 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) 'Excel のプロセス終了 xlApp.DisplayAlerts = False xlApp.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) GC.Collect() 'のEXCELファイルを開く Dim xlFilePath2 As String = ofd2.FileName '起動時の処理 Dim xlApp2 As Object xlApp2 = CreateObject("Excel.Application") Dim xlBooks2 As Object = xlApp2.Workbooks Dim xlBook2 As Object = xlBooks2.Open(xlFilePath2) '現シート数 Dim S_COUNT2 As Integer = xlBook2.Worksheets.Count Dim xlSheets2 As Object = xlBook2.Worksheets Dim xlSheet2 As Object = CType(xlSheets2.Item(1), Object) '現シート数 S_COUNT = xlBook2.Worksheets.Count Dim R_番号 As String R_番号 = "" R_番号 = xlSheet2.Cells(I_COUNT2, 1).Value 'COM オブジェクトの解放 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) 'Excel のプロセス終了 xlApp.DisplayAlerts = False xlApp.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) GC.Collect()

  • VB2008からのEXCEL出力に関して

    VB2008にて開発を行っていますが、その中で、あるデータをEXCELに出力するような 処理を行いたいと考えています。 その際に、ホームページ等で検索を行いながら、以下のような記述をしましたが、やはり 中身を完全に理解していない為、あまり応用がききません。。。 以下の内容で、1シート目までの出力は正しく行われ、問題なくプロセスも残らずに終了 する事ができました。 ただし、指定の行(10行目)までデータが書き込まれたら、1シートを追加して 次のシートに記載するというようなループ処理を考えていますが、どのように記述したら 良いでしょうか。。。。 どこまでをループ対象にすれば良いかが。。。 教えて下さい。 よろしくお願いします。 《記述内容》 '既存のEXCELファイルを開く Dim xlFilePath As String = "C:\order.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) Dim x, y As Integer x = 0 y = 0 'データをEXCELファイルに書き出し Dim xlRange As Excel.Range Dim strDat(14, 14) As Object xlRange = xlSheet.Range("A17:O31") 'データの入力セル範囲 Do While x < count strDat(x, 1) = h_date(x).IN_指示納期 strDat(x, 2) = h_date(x).IN_発注番号 strDat(x, 5) = h_date(x).IN_品目名称 strDat(x, 8) = h_date(x).IN_メーカー名 strDat(x, 9) = h_date(x).IN_数量 strDat(x, 10) = h_date(x).IN_単価 strDat(x, 11) = h_date(x).IN_金額 strDat(x, 12) = h_date(x).IN_備考 xlRange.Value = strDat 'セルへデータの入力 x = x + 1 Loop 'System.Runtime.InteropServices.Marshal.ReleaseComObject(strDat) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange) xlBooks.Close() xlApp.DisplayAlerts = False xlApp.Quit() ' COM オブジェクトの解放 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) ' Excel のプロセス終了 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)

  • VB.NET EXCEL

    下記のコードで、アプリケーション実行中 EXCELが起動したままになり アプリケーション終了時に、EXCELも一緒に終了する という、タスクマネージャーに残るという動作になります。 どこの COM の扱い方がまずかったのでしょうか? 教えてください。お願いします。 ※文字数制限で、SQLコネクション周り、SQL系宣言 エラー処理を消しました。 ※EXCEL周りに関してはすべてそのままです。 変数に代入している COMオブジェクトをすべて Marshal.FinalReleaseComObject してもEXCELが終了しないので何かしら COMオブジェクトを見落としていると思うのですが どれだかわかりません。 よろしくお願いします Imports Microsoft.Office.Interop Imports System.Runtime.InteropServices Public Class Cls_Print_Excel Public Sub S_Print_Excel() 'エクセルアクセス用 Dim _xslFile As String = "C:\base.xls" Dim objExcel As Excel.Application = Nothing Dim objWorkBook As Excel.Workbook = Nothing Dim objWorkBooks As Excel.Workbooks = Nothing Dim xlSheet As Excel.Worksheet = Nothing Dim xlRange As Excel.Range = Nothing Dim xlPageSetup As Excel.PageSetup = Nothing Try objExcel = New Excel.Application objWorkBooks = objExcel.Workbooks objWorkBooks.Open(_xslFile) objWorkBook = objExcel.ActiveWorkbook xlSheet = DirectCast(objWorkBook.Worksheets(1), Microsoft.Office.Interop.Excel.Worksheet) rs = cm.ExecuteReader() I = 3 Do While rs.Read Dim AA() As String = {"B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"} Dim K As Integer For K = 0 To 11 IN_Range(xlSheet, AA(K) & I.ToString, rs(K).ToString) Next xlRange = xlSheet.Range("3:3") xlRange.Copy() A = A + Marshal.ReleaseComObject(xlRange) xlRange = xlSheet.Range(I.ToString & ":" & I.ToString) xlRange.PasteSpecial( _ Paste:=Microsoft.Office.Interop.Excel.XlPasteType.xlPasteFormats, _ Operation:=Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, _ SkipBlanks:=False, Transpose:=False) A = A + Marshal.ReleaseComObject(xlRange) xlRange = xlSheet.Range(I.ToString & ":" & I.ToString) xlRange = xlRange.EntireRow xlRange.AutoFit() A = A + Marshal.ReleaseComObject(xlRange) xlRange = xlSheet.Range(I.ToString & ":" & I.ToString) N = 5.5 While True If CType(xlRange.RowHeight, Double) < N Then Exit While Else N += 5.5 End If End While xlRange.RowHeight = N '高さを設定 A = A + Marshal.ReleaseComObject(xlRange) I += 1 'ループカウンタを積む Loop xlPageSetup = xlSheet.PageSetup xlPageSetup.PrintArea = "B2:M" & (I - 1).ToString A = A + Marshal.ReleaseComObject(xlPageSetup) S_filename = System.IO.Path.GetDirectoryName(_xslFile) & Format(Now(), "yyyy-MM-dd-HH-mm-ss") & ".xls" objWorkBook.SaveAs(S_filename) objWorkBooks.Close() A = A + Marshal.ReleaseComObject(objWorkBooks) objExcel.Quit() A = A + Marshal.ReleaseComObject(objExcel) Exit Sub Catch ex As Exception Finally End Try End Sub Private Sub IN_Range(ByRef wSheet As Microsoft.Office.Interop.Excel.Worksheet, _ ByVal iCell As String, _ ByVal Value As String) Dim rng As Excel.Range = wSheet.Range(iCell) rng.Value = Value Marshal.FinalReleaseComObject(rng) rng = Nothing End Sub End Class

  • C# Excelを遅延バインディングで操作する方法

    いつもお世話になっております 只今C#でExcelファイルを出力するプログラムを作成しています。 以前やり方が分からずここに質問し、なんとかExcelに出力できるようになったのですが Excelのバージョンが2007にしか対応していないことが分かり 遅延バインディング仕様に作り変えている最中です。 ところが、あと少しというところでクリアできない問題が2つ出てきたので、質問させていただきます。 1つは枠線を引く処理です。現在以下のように記述していますが どうしても例外が発生してしまいます(0x800A03EC) Type line = Type.GetTypeFromProgID("Excel.XlLineStyle.xlContinuous"); Type insidevertical = Type.GetTypeFromProgID("Excel.XlBordersIndex.xlInsideVertical"); Object tempA = objRange.GetType().InvokeMember("Borders", BindingFlags.GetProperty, null, objRange, null); Object tempB = tempA.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, tempA, new object[] { insidevertical }); tempB.GetType().InvokeMember("LineStyle", BindingFlags.SetProperty, null, tempB, new object[] { line }); これがどう解決していいかわかりません・・・ 遅延バインディングという手法も最近知ったばかりで、見よう見まねという状況です。 2つ目は、ファイル保存時の拡張子です。 現在は以下のように記述しています (問題なく動作はしてくれます) object[] mySave ={strFileName,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing}; objBook.GetType().InvokeMember("SaveAs", BindingFlags.InvokeMethod, null, objBook, mySave); 以前はこのようにしていました objBook.SaveAs(strFileName,      Excel.XlFileFormat.xlExcel8,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Excel.XlSaveAsAccessMode.xlNoChange,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing); 保存する拡張子をxlsに統一したいのですが、遅延にした場合のファイル形式の指定方法がわかりません Type.Missingにすると、実行環境にあるものに合わせた拡張子で保存されてしまい Excel2007を使用している環境ではxlsxのファイルを作ってしまいます。 Type exFormat = Type.GetTypeFromProgID("Excel.XlFileFormat.xlExcel8"); のような感じで使えるかとも思ったのですが、できませんでした。。 わかる方がいましたら、よろしくお願いします。 開発環境   Vista   VisualStudio2008   .NET Framework 3.5

  • 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)

  • vb.netでExcelの1行をコピーしたい

    WindowsXP(SP2) VB2005 Excel2007で開発を行っております。 Excelの操作について質問したいことがあり、投稿しました。 Excelシートの横一列をセル単位に罫線で囲み、その行を必要な行数分どんどん下にコピーしたいのですが、コピーの部分で行き詰ってしまいました。 以下がコードです。 ' Excel用Objectの宣言 Public Shared xl As Excel.Application Public Shared xlBooks As Excel.Workbooks Public Shared xlBook As Excel.Workbook Public Shared xlSheets As Excel.Sheets Public Shared xlSheet As Excel.Worksheet Public Shared xlBorders As Excel.Borders Public Shared xlCells As Excel.Range ' ユーザID x = 1 y = 1 ' 罫線で囲む xlBorders = xlSheet.Range(xlSheet.Cells(y, x), xlSheet.Cells(y, x)).Borders xlBorders.LineStyle = Excel.XlLineStyle.xlContinuous System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBorders) xlBorders = Nothing ' 住所 x = 2 y = 1 ' 罫線で囲む xlBorders = xlSheet.Range(xlSheet.Cells(y, x), xlSheet.Cells(y, x)).Borders xlBorders.LineStyle = Excel.XlLineStyle.xlContinuous System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBorders) xlBorders = Nothing ' 氏名 x = 3 y = 1 ' 罫線で囲む xlBorders = xlSheet.Range(xlSheet.Cells(y, x), xlSheet.Cells(y, x)).Borders xlBorders.LineStyle = Excel.XlLineStyle.xlContinuous System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBorders) xlBorders = Nothing ' Tel x = 4 y = 1 ' 罫線で囲む xlBorders = xlSheet.Range(xlSheet.Cells(y, x), xlSheet.Cells(y, x)).Borders xlBorders.LineStyle = Excel.XlLineStyle.xlContinuous System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBorders) xlBorders = Nothing ' 備考 x = 5 y = 1 ' 罫線で囲む xlBorders = xlSheet.Range(xlSheet.Cells(y, x), xlSheet.Cells(y, x)).Borders xlBorders.LineStyle = Excel.XlLineStyle.xlContinuous System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBorders) xlBorders = Nothing Dim i As Int16 For i = 0 To 15 ' ここでコピーの処理を行う Next 以上がコードとなります。 どなたかご教授をよろしくお願いします。

  • EXCELのプロセスに関して2

    教えて下さい。 先日もEXCELに関して投稿させて頂きましたが、やはり少しソースを変更すると、最終的に EXCELのプロセスが残ってしまいます。 前回は、記述の最後に、"GC.Collect"を追加するようにご指摘頂き、余計なメモリを解放する事で、 プロセスは残らないようになりましたが、今回は、以下の記述のように、発注先コードが違った場合、 シートを分けるという事をしたい為、以下のような記述をした際に、プロセスが残ってしまう現象が 発生しました。 切り分けを行った結果、やはり*****印の部分があるかないかで、プロセスが残る現象が発生しますが、 何かプロセスを残してしまうような記述をしているのでしょうか。。。 どなたか教えて頂ければ幸いです。 よろしくお願いします。 《記述内容》 '既存のEXCELファイルを開く Dim xlFilePath As String = "C:\order.xls" '起動時の処理 Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath) '確認のためExcelのウィンドウを表示する xlApp.Visible = True 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" Dim x, y As Integer x = 0 y = 0 Dim mcount As Integer Dim fcount As Integer Dim D_発注先コード As String D_発注先コード = h_date(0).IN_発注先コード Dim strDat(14, 14) As Object For icount As Integer = 0 To count - 1 If D_発注先コード <> h_date(icount).IN_発注先コード Then 'データをEXCELファイルに書き出し Dim xlRange As Excel.Range 'データの入力セル範囲 xlRange = xlSheet.Range("A17:O31") 'セルへデータの入力 xlRange.Value = strDat System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange) D_発注先コード = h_date(icount).IN_発注先コード x = 0 *********************************************************************** xlSheet = xlSheets.Item(1) 'シートの選択 xlSheet.Copy(After:=xlBook.Worksheets(2)) 'シートのコピー xlSheet = xlSheets.Item(3) '再度シートを選択 xlSheet.Name = "YY" 'シートに名前を付ける *********************************************************************** strDat(x, 1) = h_date(icount).IN_指示納期 strDat(x, 2) = h_date(icount).IN_発注番号 fcount = 1 Else strDat(x, 1) = h_date(icount).IN_指示納期 strDat(x, 2) = h_date(icount).IN_発注番号 End If x = x + 1 Next Dim xlRange3 As Excel.Range 'データの入力セル範囲 xlRange3 = xlSheet.Range("A17:O31") 'セルへデータの入力 xlRange3.Value = strDat 'COM オブジェクトの解放 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange3) xlBooks.Close() xlApp.DisplayAlerts = False xlApp.Quit() 'COM オブジェクトの解放 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) 'Excel のプロセス終了 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) GC.Collect()

  • シートのコピーでプロセスが残ってしまう

    シートのコピーでプロセスが残ってしまう vb2008よりエクセルを起動し、シートを同一のブック内でコピーしようと思うのですが、 下記コードだとシートのコピーはできるのですがリソースが解放できず、プロセスが残ってしまいます。 wsh.Copy(wshh) の部分を wsh.Copy()にして違うブックにコピーすると問題無い。 Excel2003以降の複数のバージョンに対応させるため、CreateObjectを使用しています。 この場合、wsh.copy の部分はどのように記述すれば良いのでしょうか? わかりやすくするため例外等のコードは省いています。 Dim app As Object Dim wbs As Object Dim wb As Object Dim wshs As Object Dim wsh As Object Dim wshh As Object app = CreateObject("Excel.Application") wbs = app.Workbooks wb = wbs.Open("c:\hoge.xls") wshs = wb.Worksheets wsh = wshs.item(1) wshh = wshs.item(1) wsh.Copy(wshh) wb.Close() wbs.close() app.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(wshh) System.Runtime.InteropServices.Marshal.ReleaseComObject(wsh) System.Runtime.InteropServices.Marshal.ReleaseComObject(wshs) System.Runtime.InteropServices.Marshal.ReleaseComObject(wb) System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs) System.Runtime.InteropServices.Marshal.ReleaseComObject(app) wshh = Nothing wsh = Nothing wshs = Nothing wb = Nothing wbs = Nothing app = Nothing

専門家に質問してみよう