在以下代码中,我仅在第二次调用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列的过滤器。
环境:使用.NET 4.0的VS2010中的VSTO (编辑:MS Excel 2007专业版)
感谢您的帮助!
答案 0 :(得分: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);
OR
VApplication.ActiveSheet.Range[VWorkingRange].AutoFilter();
这是清除AutoFilter
的方法。
即,当您单击自动过滤器按钮时,所有列都会获得过滤器,而不是特定的过滤器
因此,您必须清除自动过滤器(通过不告诉列)。
编辑:万一它有所帮助,生成你想要在VBA中做什么的宏。如果有效,请将其翻译为c#。
编辑:要添加多个条件,您可以引用ActiveSheet.AutoFilter
属性(一旦自动过滤器生效)。对于这个属性,你可以进一步标准化。
请查看此page,特别是Filters
集合,您可以使用 Filters.Add
向其添加标准。
答案 1 :(得分:0)
在发布我的问题时,我可能省略了一些对查明错误原因至关重要的信息。我没有提到我的数据正在针对“不包含”标准进行测试。
经过更多的研究和绊脚on this link,我了解到运算符xlFilterValues不适用于“不包含”的过滤条件。
它仅适用于单元格值的精确匹配。也许对你们这些人来说这是显而易见的,这对我来说并非如此。我希望可以将过滤器值传递到包含Excel特殊字符的数组中,以指示“不包含”(例如,“<> * data *”)
如果上面不清楚,错误是由于我使用xlFilterValues运算符在数组中传递“<> * data *”引起的。
解决方案: 我创建了一个单独的函数来手动收集不包含我的条件字段的所有列数据。该函数返回一个数组,其中包含 我想保留的数据 。然后,我正常使用xlFilterValues运算符将此数组传递给AutoFilter(),一切都很顺利。感觉很乱,但经过一天研究这个问题后,我对这个解决方案没问题。
感谢shahkalpesh帮助我的时间和精力。希望这个答案可以帮助您顺利完成任务。