C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Excelでバックグラウンドのエラーチェックをさせない方法


(過去ログ 122 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■73151 / inTopicNo.1)  Excelでバックグラウンドのエラーチェックをさせない方法
  
□投稿者/ さとすけ (6回)-(2014/08/22(Fri) 16:27:49)

分類:[C#] 

お世話になっております。

C#でExcelファイルを生成するプログラムを作成しています。

バックグラウンドのエラーチェックをさせないExcelを作成したいのですが、
どうやってもこのエラーチェックがオンの状態になってしまいます。

もしご存知の方がいらっしゃいましたら教えてください。

@そもそもの目的
---------------------
1.セルに小数点以下の数字をいれたいが
  表示上は小数点以下を切り捨てた状態にしたい

2.=TRUNC(数字) をセルにセットする

3.ところどころのセルの左上に緑の三角マークが表示される

4.ファイル > オプション > 数式 > エラーチェック > バックグラウンドでエラーチェックを行う
  のチェックを外せば三角マークが消えることがわかる

5.C#上でそれを設定したい・・がうまくいかず ←いまここです
---------------------

@確認方法
---------------------
1.以下のソースのプログラムを実行

2.作成されたExcelファイルを開くとデータをセットした一部のセルの左上に三角マークが表示される

3.「バックグラウンドでエラーチェックを行う」にチェックされた状態になっている
---------------------

@ソース
---------------------
Excel.Application ExcelApp = new Excel.Application();
Excel.Workbook Book = ExcelApp.Workbooks.Add();
Excel.Worksheet sheet = Book.Sheets[1] as Excel.Worksheet;

// バックグラウンドのエラーチェックをしない・・はずだが機能せず
ExcelApp.ErrorCheckingOptions.BackgroundChecking = false;

Excel.Range range0 = sheet.Cells;
Excel.Range range1 = range0.Item[1, 1];
Excel.Range range2 = range0.Item[10, 10];
Excel.Range range3 = sheet.Range[range1, range2];

range3.NumberFormat = "#,##0";

sheet.Cells[3, 6] = "=TRUNC(9.74)";
sheet.Cells[3, 7] = "=TRUNC(9.38)";
sheet.Cells[3, 8] = "=TRUNC(10.1)";
sheet.Cells[3, 9] = "=TRUNC(9.38)";
sheet.Cells[3, 10] = "=TRUNC(10.82)";

Book.SaveAs(@"d:\tmp\a.xlsx");
Book.Close(false, Missing.Value, Missing.Value);

ExcelApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(range0);
System.Runtime.InteropServices.Marshal.ReleaseComObject(range1);
System.Runtime.InteropServices.Marshal.ReleaseComObject(range2);
System.Runtime.InteropServices.Marshal.ReleaseComObject(range3);
System.Runtime.InteropServices.Marshal.ReleaseComObject(Book);
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);
---------------------

@環境
---------------------
IDE :
 Visual Studio Professinal 2012 (11.0.60610.01 Update3)

Framework :
 .NET Framework 4.5.50709

参照設定に追加 :
 Microsoft.Office.Interop.Excel (14.0.0.0)
 Microsoft.Iffice.Core(Microsoft Office 15.0 Object Library)

Office :
 Office Home and Business 2010
---------------------


引用返信 編集キー/
■73152 / inTopicNo.2)  Re[1]: Excelでバックグラウンドのエラーチェックをさせない方法
□投稿者/ 魔界の仮面弁士 (95回)-(2014/08/22(Fri) 17:23:31)
No73151 (さとすけ さん) に返信
> 3.「バックグラウンドでエラーチェックを行う」にチェックされた状態になっている
一連の処理の前に、
 ExcelApp.Visible = true;
を付与し、Quit の前に一時停止してみてください。
その時点で、バックグラウンドエラーのアイコンは消えていますか?


もうひとつ。タスクマネージャーの[プロセス]タブに、
非表示な Excel.exe のゾンビが蠢いていたりはしませんか?
で、それらはかつて、BackgroundChecking = true だった頃に起動されたもので、
それが足を引っ張っているとか…。


> Excel.Workbook Book = ExcelApp.Workbooks.Add();
修正案:
 books = ExcelApp.Workbooks;
 Book = books.Add();
  :
  :
 Marshal.ReleaseComObject(Book);
 if(Marshal.IsComObject(books)) Marshal.ReleaseComObject(books);


> Excel.Worksheet sheet = Book.Sheets[1] as Excel.Worksheet;
修正案:
 sheets = Book.Sheets;
 sheet = (Excel.Worksheet)sheets1[1];
  :
  :
 Marshal.ReleaseComObject(sheet);
 if(Marshal.IsComObject(sheets)) Marshal.ReleaseComObject(sheets);

※「as」を使っている理由が、Sheets[1] が Worksheet で無い場合も
 ありえるから、という理由であるのならば、sheets[1] を
 一度 object か dynamic で受けてからキャストするべき。
 (今回は新規ワークブックなので、必ず Worksheet となりますが…)


> ExcelApp.ErrorCheckingOptions.BackgroundChecking = false;
修正案:
 errChkOpt = ExcelApp.ErrorCheckingOptions;
 errChkOpt.BackgroundChecking = false;
 Marshal.ReleaseComObject(errChkOpt);

> sheet.Cells[3, 6] = "=TRUNC(9.74)";
修正案:
 rng = range0.Item[3, 6];
 rng.FormulaR1C1 = "=TRUNC(9.74)"
 Marshal.ReleaseComObject(rng);
引用返信 編集キー/
■73156 / inTopicNo.3)  Re[2]: Excelでバックグラウンドのエラーチェックをさせない方法
□投稿者/ さとすけ (7回)-(2014/08/22(Fri) 20:49:32)
早速のご返信ありがとうございます。

ご指摘の通り、ゾンビで発生していてそれによる影響のようでした。

いつもご回答ありがとうございます。
とても助かりました。

>  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);
}
----------------------

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -