代码之家  ›  专栏  ›  技术社区  ›  jakebasile

重新排序Excel表列,筛选器保持不变

  •  1
  • jakebasile  · 技术社区  · 14 年前

    我通过vsto 3.0遇到了Excel2007的问题。在我的项目中,我需要偶尔移动列。通常情况下,这样做很好,但我最近发现,当数据被过滤并且匹配的数据是非连续的时,会出现问题。

    例如,使用此数据集:

    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) 方法。

    我已经在这件事上苦思冥想太久了,似乎在我自己的头脑里或是在广大的互联网上都找不到解决办法。任何帮助都将不胜感激。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Gabriel McAdams    14 年前

    我将研究如何删除和重新创建过滤器。如果你看到了问题,那么你应该解决这些问题。

    看看 listObject.autofilter.filters.过滤器 收集。

    here 更多信息。