ブックの構造は次のとおりです。大容量データセットの小計と索引/照合を組み合わせた先進的フィルタの代替方法
高度なフィルタは、そもそも、リスト内の1枚のレコードから派生した基準に基づいて、レコードのように戻るには、レコードの長いリスト(10万者)に対して実行されます。
アドバンスフィルタには、各レコードの詳細を別のタブにプッシュして、さらなる計算(差異の調整)のために何かを提供するために小計を使用して番号が付けられます。
"調整された"番号は、高度なフィルタタブに戻され、低から高にソートされます。
フィルタ以外のタブの数値は、ファイルに書き込まれます。プロセスの実行速度を向上させるために
- 任意のアイデア:
全体のプロセスは、おそらく倍の千件の
質問を繰り返し?私は、ボトルネックがループ内で非常に多くの再計算をしていることと、フィルタの一定の再実行があることを知っています。
- 私が考えていないさまざまな方法を使用するアイデアは、より効率的で合理的な方法で同じことを達成しますか?
残念ながら、サイズのために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
何千回ですか?一般に、シートからアレイへの読み取り、アレイでの処理、そしてシートへのライトバックがより迅速です。 – SJR
私は同意します、問題は、シートに取られたデータが計算されてから返されることです。配列に関する私の限られた親しみは、これはできません。ステップ4では、私は同意しますが、これは実際にボトルネックではありません。主な問題は、高度なフィルタを実行し、ルックアップを使用して別のタブにデータを取り込んだ後にデータを計算し、その結果をフィルタに戻すことです。とにかくこのプロセスをショートカットすることはできません。 – Shawn007
あなたが確かに配列の計算を実行することができます。 – SJR