0

次のような列を持つファイルがあります。

  • K
  • K
  • K
  • SND
  • P
  • P
  • SND
  • K

...

列の長さは、たとえば 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 秒、2 番目は 0.2 秒、10 番目は 1 秒、20 番目は 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、これらの分布が (一致が見つかった後に) 分離されるほど、コードは増加した領域を循環する必要があります。matchKやなどのさまざまな変数を使用するmatchSnd

于 2012-12-21T14:07:28.503 に答える