|
早速のご返信ありがとうございます。
ご指摘の通り、ゾンビで発生していてそれによる影響のようでした。
いつもご回答ありがとうございます。
とても助かりました。
> ExcelApp.Visible = true;
> を付与し、Quit の前に一時停止してみてください。
> その時点で、バックグラウンドエラーのアイコンは消えていますか?
はい、バックグラウンドエラーのチェックは外れていました(消えていました)。
> 非表示な Excel.exe のゾンビが蠢いていたりはしませんか?
はい、ゾンビは発生していました。
解放処理が上手くなかったようで、
ご指摘のソースに修正したところ
ゾンビはなくなり、エラーチェックはオフになりました。
修正済みのソースは以下になりました。
@メイン部分
----------------------
Excel.Application ExcelApp = new Excel.Application();
Excel.Workbooks books = ExcelApp.Workbooks;
Excel.Workbook Book = books.Add();
Excel.Sheets sheets = Book.Sheets;
Excel.Worksheet sheet = (Excel.Worksheet)sheets[1];
// バックグラウンドのエラーチェックをしない
SetErrorCheck(ExcelApp, false);
// フォーマット設定
SetFormat(sheet, 1, 1, 10, 10, "#,##0");
// データ設定
SetMacro(sheet, 3, 6, "=TRUNC(9.74)");
SetMacro(sheet, 3, 7, "=TRUNC(9.38)");
SetMacro(sheet, 3, 8, "=TRUNC(10.1)");
SetMacro(sheet, 3, 9, "=TRUNC(9.38)");
SetMacro(sheet, 3, 10, "=TRUNC(10.82)");
Book.SaveAs(@"d:\tmp\a.xlsx");
Book.Close(false, Missing.Value, Missing.Value);
ExcelApp.Quit();
Marshal.ReleaseComObject(sheet);
if (Marshal.IsComObject(sheets)) Marshal.ReleaseComObject(sheets);
Marshal.ReleaseComObject(Book);
if (Marshal.IsComObject(books)) Marshal.ReleaseComObject(books);
Marshal.ReleaseComObject(ExcelApp);
----------------------
@関数群
----------------------
private void SetErrorCheck(Excel.Application excelApp, bool check)
{
Excel.ErrorCheckingOptions errChkOpt = excelApp.ErrorCheckingOptions;
errChkOpt.BackgroundChecking = check;
Marshal.ReleaseComObject(errChkOpt);
}
private void SetMacro(Excel.Worksheet sheet, int x, int y, String data)
{
Excel.Range range0 = sheet.Cells;
Excel.Range range1 = range0.Item[x, y];
range1.FormulaR1C1 = data;
Marshal.ReleaseComObject(range1);
Marshal.ReleaseComObject(range0);
}
private void SetFormat(Excel.Worksheet sheet, int startX, int startY, int endX, int endY, String format)
{
Excel.Range range0 = sheet.Cells;
Excel.Range range1 = range0.Item[startX, startY];
Excel.Range range2 = range0.Item[endX, endY];
Excel.Range range3 = sheet.Range[range1, range2];
range3.NumberFormat = format;
Marshal.ReleaseComObject(range0);
Marshal.ReleaseComObject(range1);
Marshal.ReleaseComObject(range2);
Marshal.ReleaseComObject(range3);
}
----------------------
|