0

我有一个包含这样列的文件:

  • ķ
  • ķ
  • ķ
  • SND
  • SND
  • ķ

...

列的长度例如为 20000。我使用以下 C# 代码沿此列移动:

        while (true)
        {
            // Find SND
            dest_cells = ex_cells.Find("SND", dest_cells, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlWhole, Excel.XlSearchOrder.xlByColumns,
                                   Excel.XlSearchDirection.xlNext, false, false, false);

            // END?
            if (dest_cells.Row < row)
                return false;

            row = dest_cells.Row;


            // Find K
            dest_cells = ex_cells.Find("K", dest_cells, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlWhole, Excel.XlSearchOrder.xlByColumns,
                                   Excel.XlSearchDirection.xlNext, false, false, false);

            // END?
            if (dest_cells.Row < row)
                return false;

            row = dest_cells.Row;

            // Some operations
            /*there were some operations, but I commented them. So they don't influence on performance*/
        }

每次后续搜索的持续时间都在增加。我没有测量时间。但只是为了解释,让它成为:第一个 Find 需要 0.1 秒,第二个 0.2 秒,第十个 1 秒,二十个 2 秒,依此类推。

为什么?我无法理解

4

2 回答 2

2

最快的方法取决于您要执行的操作:但可能最好的方法是将数据列分配给对象数组并处理它(对 Excel 对象模型的每个互操作调用都有非常高的开销)。有关各种方法的比较,请参阅http://fastexcel.wordpress.com/2011/10/26/match-vs-find-vs-variant-array-vba-performance-shootout/

于 2012-12-21T12:58:39.640 回答
0

当您循环时,您将dest_cells用作查找下一个匹配项的起点。K但是这个变量在查找和查找之间共享,并且这些变量SND的分布越多(在找到匹配项之后),代码就越需要在增加的区域中循环。使用不同的变量,例如matchKmatchSnd

于 2012-12-21T14:07:28.503 回答