0

在以下代码中,我仅在第二次调用 AutoFilter() 时收到上述错误。

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 列的过滤器。

环境:VS2010 中的 VSTO 使用 .NET 4.0 (编辑: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(),一切都很好。感觉很hacky,但经过一天的研究这个问题,我对这个解决方案没问题。

感谢 shahkalpesh 花费时间和精力帮助我。希望这个答案也能帮助你。

于 2013-02-20T03:27:23.087 回答