我通过VSTO 3.0遇到了Excel 2007的问题。在我的项目中,我需要偶尔对列进行洗牌。通常情况下,这种方法很好但我最近发现,当数据被过滤并且适合的数据是非连续的时,会出现问题。
例如,使用此数据集:
Ohio Eastern Kentucky Eastern Illinois Central California Pacific Florida Eastern
如果第二列上的过滤器排除了Pacific或Central,则以下代码会产生错误。
ListObject table = FindReportTable();
// Get data to shuffle around.
ListColumn tempColumn = table.ListColumns.Add(missing);
Range range1 = table.ListColumns[column1].Range;
Range range2 = table.ListColumns[column2].Range;
Range tempRange = tempColumn.Range;
// Swap the rows.
range1.Copy(tempRange); // This is where an error is thrown.
range2.Copy(range1);
tempRange.Copy(range2);
tempColumn.Delete();
抛出的错误是System.Runtime.InteropServices.COMException
,错误代码为-2146827284,并显示消息“该命令不能用于多个选择”。
我尝试了很多东西,似乎没有一件事完全奏效。如果我使用table.AutoFilter.ShowAllData()
,我可以继续没有任何问题,但我已经清除了用户的过滤器,并且无法按照我的假设使用table.AutoFilter.ApplyFilter()
取回它们。
我无法可靠地存储和重新创建过滤器有两个原因:一,迭代table.AutoFilter.Filters
并且如果过滤器中的数据集太大,存储过滤器的数据可能会导致问题。参考我的示例数据,如果过滤器要从第2列中排除Central,则尝试检索过滤器的信息会导致互操作错误。其次,要重新创建过滤器,我需要知道过滤器最初在哪一行传递到table.Range.AutoFilter(object, object, XlFilterOperator, object, object)
方法。
我一直在反对这个问题太久了,似乎无法在我自己的脑海中或在庞大的互联网上找到解决方案。任何帮助将不胜感激。
答案 0 :(得分:1)