下面的代码通过记录进行循环,并从每个记录的高级过滤器/计算中返回某些值。我有大约2000条记录需要它通过。问题是处理时间是10-15秒的记录,这太慢了。改进高级过滤器处理时间
Sub EquityAutomatedDallas()
Dim Counter As Integer
Dim LogNo As String
Dim LogNoRange As Range
Dim NoRange As Range
Dim FilterRange As Range
Dim FilterCriteriaRange As Range
Dim ValueRange As Range
Dim FullSortRange As Range
Dim SortValueRange As Range
Dim FullSortRangeValues
Dim EquityRankRange As Range
Dim EquityOutOfRange As Range
Dim MedianRange As Range
Dim PropertyValueRange As Range
Dim DifferenceRange As Range
Dim MinRange As Range
Dim MaxRange As Range
Dim AverageRange As Range
Dim DallasRes As Worksheet
Set LogNoRange = Worksheets("EquitySpreadsheet").Range("B10")
Set NoRange = Worksheets("Dallas Res").Range("A10:A647649")
Set FilterRange = Worksheets("Dallas Res").Range("A9:T647649")
Set FilterCriteriaRange = Worksheets("Dallas Res").Range("A1:T2")
Set ValueRange = Worksheets("Dallas Res").Range("T10:T647649")
Set FullSortRange = Worksheets("Dallas Res").Range("A9:S647649")
Set SortValueRange = Worksheets("Dallas Res").Range("T9")
Set FullSortRangeValues = Worksheets("Dallas Res").Range("A10:T647649")
Set DallasRes = Worksheets("Dallas Res")
Set EquityRankRange = Worksheets("EquityList").Range("P5")
Set EquityOutOfRange = Worksheets("EquityList").Range("P4")
Set MedianRange = Worksheets("EquityList").Range("O6")
Set PropertyValueRange = Worksheets("EquityList").Range("D5")
Set DifferenceRange = Worksheets("EquityList").Range("O7")
Set MinRange = Worksheets("EquityList").Range("O8")
Set MaxRange = Worksheets("EquityList").Range("O9")
Set AverageRange = Worksheets("EquityList").Range("O10")
Application.ScreenUpdating = False
For Counter = 558 To 565
LogNo = Worksheets("Hirschy").Cells(1 + Counter, 1).Value
LogNoRange = LogNo
NoRange.ClearContents
Application.Calculate
If Not Application.CalculationState = xlDone Then
DoEvents
End If
Application.Calculation = xlManual
FilterRange.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=FilterCriteriaRange, Unique:=False
Application.Calculation = xlCalculationAutomatic
NoRange.SpecialCells(xlCellTypeVisible).FormulaR1C1 = "=Subtotal(3,R10C2:RC[1])"
ValueRange.SpecialCells(xlCellTypeVisible).Formula = "=INDEX(EquitySpreadsheet!$C$12:$GT$29,16,(MATCH(INDIRECT(ADDRESS(ROW(),1)),EquitySpreadsheet!$C$12:$GS$12)+1))"
DallasRes.Select
FullSortRange.Select
SortValueRange.Activate
ActiveWorkbook.Worksheets("Dallas Res").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Dallas Res").Sort.SortFields.Add Key:=ValueRange, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Dallas Res").Sort
.SetRange FullSortRangeValues
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Worksheets("Dallas Res").Calculate
Worksheets("EquitySpreadsheet").Calculate
Worksheets("EquityList").Calculate
Worksheets("Hirschy").Cells(1 + Counter, 6) = EquityRankRange
Worksheets("Hirschy").Cells(1 + Counter, 7) = EquityOutOfRange
Worksheets("Hirschy").Cells(1 + Counter, 8) = MedianRange
Worksheets("Hirschy").Cells(1 + Counter, 9) = PropertyValueRange
Worksheets("Hirschy").Cells(1 + Counter, 10) = DifferenceRange
Worksheets("Hirschy").Cells(1 + Counter, 11) = MinRange
Worksheets("Hirschy").Cells(1 + Counter, 12) = MaxRange
Worksheets("Hirschy").Cells(1 + Counter, 13) = AverageRange
Next Counter
Application.ScreenUpdating = True
End Sub
有没有反正我可以加快这个宏?
反正你可以发布工作簿?有了这样的问题,如果没有它,在你面前真的很难。 –
如果您不需要**查看**每次迭代所做的更改,请将'ScreenUpdating'移到循环外部。避免'.Select','.Activate'。使用适当的变量来访问工作表和范围,并在访问同一对象的代码中使用'With ... End With'多次。如果可能,也使用命名范围。 – PatricK
我接受了你的建议并清理了代码。请参阅上面的更新代码。还有什么我可以做的吗?它仍然需要约10秒的记录。 Excel英雄,不幸的是,我不能因为它太大。虽然我感谢你的帮助。 – Shawn007