2017-01-05 20 views
1

マイタスクは、特定の行に文字列が存在するかどうかに基づいてExcelブックの行を非表示/非表示にすることです。私が直面している問題は、次のコードで1000行でこのタスクを実行するのに約20秒かかります。ファイルに2k〜3k行の行があり、このローディング時間を短縮したいと考えています。VSTOアプリケーションでExcelの行を表示/非表示C#

私は、行全体を隠す/隠すコード(currentFind.EntireRow.Hidden =!isShown;)をコメントすると、ファイルの読み込みにはわずか4-5秒しかかかりません。これは、文字列部分の検索ではなく時間がかかる行隠蔽部分であると結論づけます。

 Worksheet activeWorksheet= Globals.ThisAddIn.Application.ActiveSheet; 
     Range usedRange = activeWorksheet.UsedRange; 

     Range currentFind = null; 
     Range firstFind = null; 

     currentFind = activeWorksheet.UsedRange.Find(searchInput); 

     while (currentFind != null) 
     { 
      // Keep track of the first range you find. 
      if (firstFind == null) 
      { 
       firstFind = currentFind; 
      } 

      // If you didn't move to a new range, you are done. 
      else if (currentFind.get_Address(XlReferenceStyle.xlA1) 
        == firstFind.get_Address(XlReferenceStyle.xlA1)) 
      { 
       break; 
      } 

      currentFind.EntireRow.Hidden = !isShown; 

      currentFind = usedRange.FindNext(currentFind); 
     } 

答えて

0

使用Globals.ThisAddin.Application.ScreeenUpdating =初め で偽と終了時にtrueに設定します。 また、 の開始時にGlobals.ThisAddin.Application.EnableEvents = falseをスローし、最後にtrueを返す可能性があります。

+0

ソリューションは機能しましたか?もしそれが答えとしてマークしてください – dgorti

0

私は、行(または範囲またはセル)に何かを行うのは、同じことが起こっているときに、常に1つの範囲内でそれを実行するよりも時間がかかるようです。たとえば、私は一度完全に空白の行をすべて削除したものを書いていましたが、これは1つのステートメント(Range.Delete)と比較して目を瞬きさせて実行していました。その精神で

、あなたがあなたのコードを再訪し、問題の文字列を含むすべての行を集め、その後、一度にすべてを隠した場合:

Excel.Range hideRange = null; 
Excel.Application xl = Globals.ThisAddIn.Application; 

foreach (Excel.Range row in activeWorksheet.UsedRange.Rows) 
{ 
    if (oApp.WorksheetFunction.CountIf(row, "*" + searchInput + "*") > 0) 
     hideRange = hideRange == null ? row : xl.Union(hideRange, row); 
} 

hideRange.EntireRow.Hidden = true; 

私は、このコードは高速です約束することはできませんが、それを試してみて、どのように比較するか教えてください。私は最後の行が速く走ると確信しています。何が見られるかは、出現を識別するループがどのように実行されるかである。

私はいくつかの偽のデータでそれをテストし、数百の行を隠している何千もの行については、コードの「隠す」行には156 msまたは0.15秒しかかかりませんでした。