0

次のコードでは、AutoFilter()の2回目の呼び出しでのみ、上記のエラーが発生します。

string FilterValue1 = tbSysCat1.Text.FilterDoesNotContain();
string FilterValue2 = tbSysCat2.Text.FilterDoesNotContain();
string FilterValue3 = tbSysCat3.Text.FilterDoesNotContain();

string[] SysCat = new string[6];    // EDIT: originally tried object[]; still got error
SysCat[0] = FilterValue1;
SysCat[1] = FilterValue1.ToUpper();
SysCat[2] = FilterValue2;
SysCat[3] = FilterValue2.ToUpper();
SysCat[4] = FilterValue3;
SysCat[5] = FilterValue3.ToUpper();

VApplication.ActiveSheet.Range[VWorkingRange].AutoFilter(9, Missing.Value, Missing.Value, Missing.Value, true);
VApplication.ActiveSheet.Range[VWorkingRange].AutoFilter(9, SysCat, MSExcel.XlAutoFilterOperator.xlFilterValues, Missing.Value, true);

注:FilterDoesNotContain()は、「含まない」のExcel固有のワイルドカードを追加するための拡張メソッドです。

私の他の調査によると、このエラーは、AutoFilterを実行時にRangeオブジェクトに関連付けることができなかったことを示しています(動的タイプであるため)。ただし、最初の呼び出しでは問題なく関連付けられていました。それは不可解な部分です。

最初の呼び出しは、列9のフィルターをクリアするためです。

環境:.NET 4.0を使用したVS2010のVSTO (編集:MS Excel 2007 Pro)

あなたの助けに感謝!

4

2 に答える 2

2

申し訳ありませんが、これを試すためのExcelがありません。
ただし、次の行を変更してください

VApplication.ActiveSheet.Range[VWorkingRange].AutoFilter(9, Missing.Value, Missing.Value, Missing.Value, true);

VApplication.ActiveSheet.Range[VWorkingRange].AutoFilter(Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

また

VApplication.ActiveSheet.Range[VWorkingRange].AutoFilter();

これは、をクリアする方法AutoFilterです。
つまり、自動フィルターボタンをクリックすると、特定の列ではなく、すべての列にフィルターが適用されます。
その結果、自動フィルターをクリアする必要があります(列を指定しないことにより)。

編集:それが役立つ場合に備えて、VBAで実行したいことのマクロを生成します。動作する場合は、c#に変換します。

編集:複数の基準を追加するために、ActiveSheet.AutoFilterプロパティへの参照を取得できます(自動フィルターが有効になったら)。このプロパティには、さらに基準を設定できます。

このページ、具体的にはを使用して基準を追加できるFiltersコレクションをご覧くださいFilters.Add

于 2013-02-19T18:40:33.350 に答える
0

質問を投稿する際に、エラーの原因を特定するために重要な情報を省略した可能性があります。私のデータが「含まれていない」基準についてテストされていることについては言及しませんでした。

さらに調査してこのリンクを見つけた後、演算子xlFilterValuesが「含まれていない」フィルター基準では機能しないことを知りました。

セル値の完全一致でのみ機能します。多分これはあなた方の何人かには明白です、それは私にはそうではありませんでした。「含まない」ことを示すために、Excelの特殊文字を含む配列にフィルター値を渡すことができると期待していました(例:「<> * data *」)

上記で明確でない場合は、xlFilterValues演算子を使用して配列に「<> *data*」を渡したことが原因でエラーが発生しました。

解決策:基準フィールドを含まないすべての列データを手動で収集するための別の関数を作成しました。この関数は、保持したいデータを含む配列を返しました。次に、xlFilterValues演算子を使用して、通常どおりこの配列をAutoFilter()に渡しましたが、すべて問題ありませんでした。それはハッキーな感じがしますが、この問題を調査した1日後、私はこの解決策で大丈夫です。

私を助けるためにあなたの時間と努力をしてくれたshahkalpeshに感謝します。うまくいけば、この答えはあなたも将来的に役立つでしょう。

于 2013-02-20T03:27:23.087 に答える