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

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

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

Re[2]: Excelにフィルターを設定する方法


(過去ログ 125 を表示中)

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

■74310 / inTopicNo.1)  Excelにフィルターを設定する方法
  
□投稿者/ さとすけ (14回)-(2014/12/17(Wed) 14:47:34)

分類:[C#] 

2014/12/17(Wed) 14:54:30 編集(投稿者)
お世話になっております。

次のようなExcelのデータががあったときに
タイトル1やタイトル2にフィルターを設定したいと考えています。
(デフォルトの検索条件はなし)

----------+----------
タイトル1 | タイトル2
データ  | データ
データ  | データ
----------+----------
↓
------------+------------
タイトル1▼ | タイトル2▼
データ   | データ
データ   | データ
------------+------------

以下のソースを試したのですが

range1.AutoFilter();

の場所で例外が発生してしまいました。

「Range クラスの AutoFilter メソッドが失敗しました。」

調査の過程で「シートをアクティブ化していないとこのようなメッセージが出る」との投稿を見つけたので

sheet.Activate();

をフィルター化の前に設定したのですが効果はありませんでした。

どなたかご存知の方がいらっしゃいましたらご教授下さい。

よろしくお願いします。

---- ソース
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];

// データの設定
for (int x = 1; x <= 9; x++)
{
	// タイトルの設定
	String title = x + "の列";
	SetData(sheet, x, 1, title);

	// 数値の設定
	for (int y = 1; y <= 10; y++)
	{
		int data = y + (x - 1) * 10;
		SetData(sheet, x, y + 1, data.ToString());
	}
}

// オートフィルターの設定
// - 試しにA1をフィルター化
sheet.Activate();
SetFilter(sheet, 1, 1);

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

ExcelApp.Quit();

Marshal.ReleaseComObject(sheet);
Marshal.ReleaseComObject(sheets);
Marshal.ReleaseComObject(Book);
Marshal.ReleaseComObject(books);
Marshal.ReleaseComObject(ExcelApp);
		
---- 関数群
private void SetData(Excel.Worksheet sheet, int x, int y, String data)
{
	Excel.Range range0 = sheet.Cells;
	Excel.Range range1 = range0.Item[y, x];

	range1.Value2 = data;

	Marshal.ReleaseComObject(range1);
	Marshal.ReleaseComObject(range0);
}

private void SetFilter(Excel.Worksheet sheet, int x, int y)
{
	Excel.Range range0 = sheet.Cells;
	Excel.Range range1 = range0.Item[y, x];

	range1.AutoFilter();

	Marshal.ReleaseComObject(range1);
	Marshal.ReleaseComObject(range0);
}
----

以上。

引用返信 編集キー/
■74312 / inTopicNo.2)  Re[1]: Excelにフィルターを設定する方法
□投稿者/ 魔界の仮面弁士 (195回)-(2014/12/17(Wed) 17:54:16)
No74310 (さとすけ さん) に返信
> 次のようなExcelのデータががあったときに
> タイトル1やタイトル2にフィルターを設定したいと考えています。

提示のコードからして、C# 2010 以降をお使いのようですね。
であれば、
 // range1.AutoFilter();
 ((dynamic)range1).AutoFilter();
にすれば解決するかも知れません。



> for (int x = 1; x <= 9; x++)
ここでは、Int32 ではなく int を使っているのに対して、

> String title = x + "の列";
ここでは String なのですね。string ではなく。
引用返信 編集キー/
■74313 / inTopicNo.3)  Re[2]: Excelにフィルターを設定する方法
□投稿者/ さとすけ (16回)-(2014/12/17(Wed) 18:30:49)
魔界の仮面弁士様

いつもありがとうございます。

ご指摘の内容を反映したところ
無事にフィルターを設定することが出来ました。

dynamic型というのを今回初めて知りました。
とても勉強になります、ありがとうございます。

> C# 2010 以降をお使いのようですね

失礼しました。
環境を提示していませんでした。
仰る通りC# 2010以降(2012) です。

>ここでは String なのですね。string ではなく。

はい。

プリミティブ型(intなど)は全て小文字で、参照型(クラス)は初めは大文字に
というルールで作成していました。

ただ、他のPGには Int32 を使っている方もいて不思議に思っていました。
そちらの方が一般的でしょうか。
色々調査してみようと思います。

修正版のソースは以下のようになりました。

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];

// データの設定
for (int x = 1; x <= 9; x++)
{
	// タイトルの設定
	String title = x + "の列";
	SetData(sheet, x, 1, title);

	// 数値の設定
	for (int y = 1; y <= 10; y++)
	{
		int data = y + (x - 1) * 10;
		SetData(sheet, x, y + 1, data.ToString());
	}
}

// オートフィルターの設定
SetFilter(sheet);

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

ExcelApp.Quit();

Marshal.ReleaseComObject(sheet);
Marshal.ReleaseComObject(sheets);
Marshal.ReleaseComObject(Book);
Marshal.ReleaseComObject(books);
Marshal.ReleaseComObject(ExcelApp);
		
----関数群

private void SetData(Excel.Worksheet sheet, int x, int y, String data)
{
	Excel.Range range0 = sheet.Cells;
	Excel.Range range1 = range0.Item[y, x];

	range1.Value2 = data;

	Marshal.ReleaseComObject(range1);
	Marshal.ReleaseComObject(range0);
}

private void SetFilter(Excel.Worksheet sheet)
{
	Excel.Range range0 = sheet.Cells;
	Excel.Range range1 = range0.Item[1, 1];

	((dynamic)range1).AutoFilter();

	Marshal.ReleaseComObject(range1);
	Marshal.ReleaseComObject(range0);
}
----

以上。

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -