分類:[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);
}
----
以上。