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

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

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

Re[8]: C#でExcelオートフィルタ結果削除


(過去ログ 98 を表示中)

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

■58785 / inTopicNo.1)  C#でExcelオートフィルタ結果削除
  
□投稿者/ 5dogsFuji (1回)-(2011/04/26(Tue) 14:47:49)

分類:[.NET 全般] 

VisualStudio2008(C#)でExcelオブジェクトを利用したアプリ開発をしております。

21列3000行ほどあるデータをExcelオートフィルタで絞りこみました。
その結果を同シート内の最終行にコピーした上で、絞込み結果を削除(行削除し上に詰める)を行いたいのですが、項目行まで削除されてしまいます。
コピーの時は項目行もコピーしたいのですが、削除はデータのみの削除をしたいです。

オートフィルタとコピーは下記プログラムで実現できています。
setRange1 = ((Excel.Range)this.xlsSSheet.get_Range(xlsSSheet.Cells[1, 1], xlsSSheet.Cells[xlsSSheet.UsedRange.Rows.Count, xlsSSheet.UsedRange.Columns.Count]));
setRange1.AutoFilter(21, "*確認対象外*", Excel.XlAutoFilterOperator.xlAnd, Type.Missing,false);
setRange1.SpecialCells(XlCellType.xlCellTypeVisible, Type.Missing).Copy(Type.Missing);
setRange2 = (Excel.Range)this.xlsSSheet.Cells[this.xlsSSheet.UsedRange.Rows.Count+3, 1];
setRange2.PasteSpecial(XlPasteType.xlPasteAll, XlPasteSpecialOperation.xlPasteSpecialOperationNone, Type.Missing, Type.Missing);

項目行を除いた見えているセルをどのようにしてRangeオブジェクトにセットするのかが
分からず困っています。

何とぞご教授をお願い致します。 


引用返信 編集キー/
■58787 / inTopicNo.2)  Re[1]: C#でExcelオートフィルタ結果削除
□投稿者/ ちりめん (1回)-(2011/04/26(Tue) 15:04:56)
No58785 (5dogsFuji さん) に返信

項目行と削除対象行の違いは何ですか?
シート状に項目行と削除対象行がどのように配置されているか分からないのですが、
行削除時は削除対象行のみをフィルタすればいいのでは?
引用返信 編集キー/
■58789 / inTopicNo.3)  Re[1]: C#でExcelオートフィルタ結果削除
□投稿者/ shu (653回)-(2011/04/26(Tue) 15:16:25)
No58785 (5dogsFuji さん) に返信

Excelのマクロ記録でやりたい事の動きを保存してみるといいですよ。
引用返信 編集キー/
■58792 / inTopicNo.4)  Re[2]: C#でExcelオートフィルタ結果削除
□投稿者/ 5dogsFuji (2回)-(2011/04/26(Tue) 16:00:49)
ちりめんさん 早速のコメントありがとうございます。

項目行と削除対象行の違いは、タイトルとデータです。(トンチンカンな答えですか?)
フィルタ事態は希望通り行えているので問題ないのですが、フィルタ結果の
可視範囲を先頭を1行オフセットした範囲をRangeオブジェクトにセットしたいのです。


No58787 (ちりめん さん) に返信
> ■No58785 (5dogsFuji さん) に返信
>
> 項目行と削除対象行の違いは何ですか?
> シート状に項目行と削除対象行がどのように配置されているか分からないのですが、
> 行削除時は削除対象行のみをフィルタすればいいのでは?
引用返信 編集キー/
■58794 / inTopicNo.5)  Re[2]: C#でExcelオートフィルタ結果削除
□投稿者/ 5dogsFuji (3回)-(2011/04/26(Tue) 16:06:39)
shuさん コメントありがとうございます。

はい、投稿前にマクロ記録し、その上での質問でした。

setRange1.SpecialCells(XlCellType.xlCellTypeVisible, Type.Missing).Copy(Type.Missing);
のところで、先頭行を外した可視行という選択ができないものかな?と思ったのです。

No58789 (shu さん) に返信
> ■No58785 (5dogsFuji さん) に返信
>
> Excelのマクロ記録でやりたい事の動きを保存してみるといいですよ。
引用返信 編集キー/
■58795 / inTopicNo.6)  Re[3]: C#でExcelオートフィルタ結果削除
□投稿者/ shu (654回)-(2011/04/26(Tue) 17:23:27)
No58794 (5dogsFuji さん) に返信
> shuさん コメントありがとうございます。
>
> はい、投稿前にマクロ記録し、その上での質問でした。
>
> setRange1.SpecialCells(XlCellType.xlCellTypeVisible, Type.Missing).Copy(Type.Missing);
> のところで、先頭行を外した可視行という選択ができないものかな?と思ったのです。
>
> ■No58789 (shu さん) に返信
>>■No58785 (5dogsFuji さん) に返信
>>
>>Excelのマクロ記録でやりたい事の動きを保存してみるといいですよ。

Excel上での操作が出来ないとなるとデータ範囲内のRangeのValueを配列に取得して、
配列内の入れ替えをしてから戻すという方法もあります。ただし書式の入れ替えは出来ないので、
各行の書式は統一されている必要があります。
引用返信 編集キー/
■58797 / inTopicNo.7)  Re[4]: C#でExcelオートフィルタ結果削除
□投稿者/ 5dogsFuji (4回)-(2011/04/26(Tue) 17:52:02)
No58795 (shu さん) に返信
> ■No58794 (5dogsFuji さん) に返信
>>■No58789 (shu さん) に返信
> >>■No58785 (5dogsFuji さん) に返信

> Excel上での操作が出来ないとなるとデータ範囲内のRangeのValueを配列に取得して、
> 配列内の入れ替えをしてから戻すという方法もあります。ただし書式の入れ替えは出来ないので、
> 各行の書式は統一されている必要があります。

Excel上では操作できます。
オートフィルタ後の結果を選択して、編集-ジャンプ-セル選択で選択オプションの可視セルを
選び削除するとタイトル行とその他データ(フィルタ抽出外)を残して、削除ができます。

つまりフィルタ後の範囲を、タイトル行を除いてRangeオブジェクトにセットできれば
できると思っています。

このRangeオブジェクトセットが分からないのです。

引用返信 編集キー/
■58798 / inTopicNo.8)  Re[5]: C#でExcelオートフィルタ結果削除
□投稿者/ shu (656回)-(2011/04/26(Tue) 18:12:34)
No58797 (5dogsFuji さん) に返信

例えば提示されている
> setRange1.SpecialCells(XlCellType.xlCellTypeVisible, Type.Missing)
この部分ですがこれはRangeオブジェクトになってますが、これでは処理が出来ないということでしょうか?

引用返信 編集キー/
■58812 / inTopicNo.9)  Re[6]: C#でExcelオートフィルタ結果削除
□投稿者/ 5dogsFuji (5回)-(2011/04/27(Wed) 09:07:22)
No58798 (shu さん) に返信
> ■No58797 (5dogsFuji さん) に返信
>
> 例えば提示されている
>>setRange1.SpecialCells(XlCellType.xlCellTypeVisible, Type.Missing)
> この部分ですがこれはRangeオブジェクトになってますが、これでは処理が出来ないということでしょうか?


shuさん、お付き合いいただき本当にありがとうございます。
下記の通り、このsetRange1はオートフィルタを行うための範囲(タイトル行含む)をセットしています。

setRange1 = ((Excel.Range)this.xlsSSheet.get_Range(xlsSSheet.Cells[1, 1], xlsSSheet.Cells[xlsSSheet.UsedRange.Rows.Count, xlsSSheet.UsedRange.Columns.Count]));
setRange1.AutoFilter(21, "*確認対象外*", Excel.XlAutoFilterOperator.xlAnd, Type.Missing,false);

つまり、このsetRange1の可視セルとするとタイトル行も含まれてしまうのです。
オートフィルタ後の結果に対して新たに、「タイトル行を抜いた範囲」をRangeオブジェクトにセットするか、
setRange1からタイトル行を省いて削除という処理ができないものかと・・・。

引用返信 編集キー/
■58814 / inTopicNo.10)  Re[7]: C#でExcelオートフィルタ結果削除
□投稿者/ shu (661回)-(2011/04/27(Wed) 09:18:45)
No58812 (5dogsFuji さん) に返信

> setRange1 = ((Excel.Range)this.xlsSSheet.get_Range(xlsSSheet.Cells[1, 1], xlsSSheet.Cells[xlsSSheet.UsedRange.Rows.Count, xlsSSheet.UsedRange.Columns.Count]));
ここにタイトル行が含まれているのだから、1行目でなく2行目からにすればいいのでは?




引用返信 編集キー/
■58838 / inTopicNo.11)  Re[8]: C#でExcelオートフィルタ結果削除
□投稿者/ 5dogsFuji (6回)-(2011/04/27(Wed) 16:43:51)
No58814 (shu さん) に返信
> ■No58812 (5dogsFuji さん) に返信
>
>>setRange1 = ((Excel.Range)this.xlsSSheet.get_Range(xlsSSheet.Cells[1, 1], xlsSSheet.Cells[xlsSSheet.UsedRange.Rows.Count, xlsSSheet.UsedRange.Columns.Count]));
> ここにタイトル行が含まれているのだから、1行目でなく2行目からにすればいいのでは?

この時間まで、ああでもないこうでもないと試行錯誤しましたが、結局アドバイスの通り
タイトル行を先にコピーし、オートフィルタをタイトル行を除いた範囲で実行し、その結果を
貼り付けたタイトル行の下に貼り付けました。

オートフィルタ後の行オフセットができると便利だなぁと思ってたのですが、とりあえず
やりたい事が実現できたので、解決済みとさせていただきます。

shuさん、アドバイスありがとうございました。
また何かありましたら、よろしくお願い致します。
解決済み
引用返信 編集キー/
■58839 / inTopicNo.12)  Re[7]: C#でExcelオートフィルタ結果削除
□投稿者/ ちりめん (2回)-(2011/04/27(Wed) 16:47:44)
No58812 (5dogsFuji さん) に返信

あぁ、なるほど。項目行の意味が分かりました。
フィルタの▼の表示される、見出し行のことですね。
それならば、フィルタをかけた後にのRangeを項目行を含まない範囲にして、それで行削除したらいいのでは?
(これは、具体的にどのようにRangeが取得されるか、マクロの記録を使って確認した方がいいでしょう。)
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -