Excel 错误:无法获取Range类的AutoFilter属性

Excel 错误:无法获取Range类的AutoFilter属性,excel,vsto,autofilter,Excel,Vsto,Autofilter,在下面的代码中,我只在第二次调用AutoFilter()时收到上述错误 注意:FilterDoesNotContain()是一个扩展方法,用于为“不包含”添加Excel特定的通配符 根据我的另一项研究,该错误表明AutoFilter在运行时无法与Range对象关联(因为它是动态类型)。但是,在第一次调用中,它关联得很好这是令人困惑的部分。 第一个调用用于清除第9列的筛选器 环境:VS2010中的VSTO使用.NET 4.0(编辑:MS Excel 2007 Pro) 谢谢你的帮助 很抱歉,我没有

在下面的代码中,我只在第二次调用AutoFilter()时收到上述错误

注意:FilterDoesNotContain()是一个扩展方法,用于为“不包含”添加Excel特定的通配符

根据我的另一项研究,该错误表明AutoFilter在运行时无法与Range对象关联(因为它是动态类型)。但是,在第一次调用中,它关联得很好这是令人困惑的部分。

第一个调用用于清除第9列的筛选器

环境:VS2010中的VSTO使用.NET 4.0(编辑:MS Excel 2007 Pro)


谢谢你的帮助

很抱歉,我没有Excel可供试用。
但是,请更改以下行

vaapplication.ActiveSheet.Range[VWorkingRange].AutoFilter(9,缺少.Value,缺少.Value,缺少.Value,为真)

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

vaapplication.ActiveSheet.Range[VWorkingRange].AutoFilter()

这是清除
自动过滤器
的方法
i、 e.当您单击“自动筛选”按钮时,所有列都会得到筛选,而不是特定的筛选。
因此,您必须清除自动筛选(不告诉列)

编辑:以防有帮助,生成要在VBA中执行的宏。如果有效,请将其转换为c#

编辑:要添加多个条件,可以获取对
ActiveSheet.AutoFilter
属性的引用(一旦自动筛选生效)。对于此属性,您可以使用进一步的标准


看看这个,特别是
过滤器
集合,您可以使用
过滤器向其中添加标准。添加

在发布我的问题时,我可能遗漏了一些对查明错误原因至关重要的信息。我没有提到我的数据被测试的“不包含”标准

经过更多的研究和摸索,我了解到运算符xlFilterValues不适用于筛选条件“不包含”

它仅适用于单元格值的精确匹配。也许这对你们中的一些人来说是显而易见的,但对我来说不是。我希望可以将筛选器值传递到包含Excel特殊字符的数组中,以指示“不包含”(例如,“*data*”)

如果上面不清楚,则错误是由我使用xlFilterValues运算符在数组中传递“*data*”引起的

解决方案: 我创建了一个单独的函数来手动获取所有不包含我的条件字段的列数据。函数返回一个数组,其中包含我想要保留的数据。然后,我使用xlFilterValues操作符将这个数组正常地传递到AutoFilter()中,一切正常。这感觉有点不对劲,但经过一天的研究,我对这个解决方案没意见


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

谢谢你的帮助。问题是,这涉及到多个栏目。此代码位于筛选第9列的函数中。我确实使用您建议的AutoFilter()调用来清除所有列,然后再对其他列执行所有其他函数调用。我尝试了您的宏建议。我只能输入两个条件,因此宏代码使用xlAnd运算符,而不是xlFilterValues运算符。在其他地方,在其他函数中,我对两个标准使用了类似的代码,这很好。此特定案例使用6个标准。(我还有一个例子,我使用4个条件进行过滤,并使用与上面相同的调用AutoFilter的顺序两次——当然,这很好)我查看了您建议的MSDN页面。过滤器是只读的。Filters集合只显示已经添加的内容,我假设是将条件传递到AutoFilter()调用中的“正常”方法。我希望您确实使用您在评论中添加的链接回答了问题。AutoFilter是为满足两个条件而构建的。为了使用多个标准,我使用了Cindy Meister在中建议的方法。我已经在项目的其他部分成功地使用了这种方法。它只在这个特定的代码段中失败。
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);