2017-03-24 5 views
0

ブックの構造は次のとおりです。大容量データセットの小計と索引/照合を組み合わせた先進的フィルタの代替方法

  1. 高度なフィルタは、そもそも、リスト内の1枚のレコードから派生した基準に基づいて、レコードのように戻るには、レコードの長いリスト(10万者)に対して実行されます。

  2. アドバンスフィルタには、各レコードの詳細を別のタブにプッシュして、さらなる計算(差異の調整)のために何かを提供するために小計を使用して番号が付けられます。

  3. "調整された"番号は、高度なフィルタタブに戻され、低から高にソートされます。

  4. フィルタ以外のタブの数値は、ファイルに書き込まれます。プロセスの実行速度を向上させるために

    1. 任意のアイデア:

    2. 全体のプロセスは、おそらく倍の千件の

    質問を繰り返し?私は、ボトルネックがループ内で非常に多くの再計算をしていることと、フィルタの一定の再実行があることを知っています。

  5. 私が考えていないさまざまな方法を使用するアイデアは、より効率的で合理的な方法で同じことを達成しますか?

残念ながら、サイズのためにWBやサンプルを投稿できません。

Sub EquityAutomated() 
    Dim i As Long 
    Dim StartNo As Long 
    Dim EndNo As Long 
    StartNo = InputBox("Enter the row on the Hsheet sheet you want the equity analysis to start on") 
    EndNo = InputBox("Enter the row on the Hsheet sheet you want the equity analysis to end on") 
    Dim wsProtestTest As Worksheet: Set wsProtestTest = Worksheets("ProtestTestData") 
    Dim wsES As Worksheet:   Set wsES = Worksheets("EquitySpreadsheet") 
    Dim wsEL As Worksheet:   Set wsEL = Worksheets("EquityList") 
    Dim wsDa As Worksheet:   Set wsDa = Worksheets("Res") 
    Dim subTotalsDa As Range:  Set subTotalsDa = wsDa.Range("A10:A647649") 
    Dim fltrRng As Range:   Set fltrRng = wsDa.Range("A9:T647649") 
    Dim fltrCritRng As Range:  Set fltrCritRng = wsDa.Range("A1:T2") 
    Dim valRngDa As Range:   Set valRngDa = wsDa.Range("T10:T647649") 
    Dim fullSrtRng As Range:  Set fullSrtRng = wsDa.Range("A9:S647649") 
    Dim sortValRng As Range:  Set sortValRng = wsDa.Range("T9") 
    Dim fullSortRngVal As Range: Set fullSortRngVal = 
    Application.ScreenUpdating = False 
    For i = StartNo To EndNo 
     LogRng = wsProtestTest.Cells(i + 2, 1).Value2 
     subTotalsDa.ClearContents 
     Application.Calculate 
      If Not Application.CalculationState = xlDone Then 
       DoEvents 
      End If 
     Application.Calculation = xlManual 
     fltrRng.AdvancedFilter Action:=xlFilterInPlace, _ 
      CriteriaRange:=fltrCritRng, Unique:=False 
     Application.Calculation = xlCalculationAutomatic 
     Application.Calculate 
     subTotalsDa.SpecialCells(xlCellTypeVisible).FormulaR1C1 = _ 
      "=Subtotal(3,R10C2:RC[1])" 
     valRngDa.SpecialCells(xlCellTypeVisible).Formula = _ 
      "=INDEX(EquitySpreadsheet!$C$12:$GT$29,16,(MATCH(INDIRECT(ADDRESS(ROW(),1)),EquitySpreadsheet!$C$12:$GS$12)+1))" 
     With wsDa.Sort 
      .SortFields.Clear 
      .SortFields.Add Key:=valRngDa, SortOn:=xlSortOnValues, _ 
       Order:=xlAscending, DataOption:=xlSortNormal 
      .SetRange fullSortRngVal 
      .Header = xlYes 
      .MatchCase = False 
      .Orientation = xlTopToBottom 
      .Apply 
     End With 
    Next 
    Application.ScreenUpdating = True 
End Sub 

Data Pull off Advanced Filter/Calc Tab

Tab with Advanced Filter/Many Records

+2

何千回ですか?一般に、シートからアレイへの読み取り、アレイでの処理、そしてシートへのライトバックがより迅速です。 – SJR

+0

私は同意します、問題は、シートに取られたデータが計算されてから返されることです。配列に関する私の限られた親しみは、これはできません。ステップ4では、私は同意しますが、これは実際にボトルネックではありません。主な問題は、高度なフィルタを実行し、ルックアップを使用して別のタブにデータを取り込んだ後にデータを計算し、その結果をフィルタに戻すことです。とにかくこのプロセスをショートカットすることはできません。 – Shawn007

+0

あなたが確かに配列の計算を実行することができます。 – SJR

答えて

0

私は実際にこの上PowerQueryを使用することになります。特に、新しいセルを計算してテーブルに入れることを検討している場合には、より迅速な場合があります。 PowerQueryはマイクロソフトから無料で、Excel 2010以降のものに優れています(2016年には "Get & Transform"として知られています)。計算はDAX/DMLで行われます。非常に強力で、VBAソリューションよりも速く/より直感的です。

+0

私はこの考えを持っていました。明らかに、私は使用したツールに偏っています。これを高度なフィルタの代替手段として使用しても、それを基準にすることはできますか?私はこれをさらに調べる必要があります。基本的には、そのアイデアは可能性が高いでしょう。 1.これをバックエンドの取引の種類として使用し、必要なレコードのみを通常のExcelテーブルに抽出します。 2.レコードを同じ方法で処理しますが、フィルタの問題がなくなるとパフォーマンスが向上します。 クエリの読み込みをExcelに自動化することができます。また、ブックブックデータに基づいてクエリのフィルタに条件をプラグインすることもできますか? – Shawn007

関連する問題