Я тестирую потенциальные улучшения производительности с помощью сложных формул для больших наборов данных и пробую копировать несколько формул SUMPRODUCT до конца набора данных, затем вычислять в ручном режиме и рассчитывать время расчета как для 64-битного офисного устройства, так и для 32-битного офисного device.
Для примера у меня были следующие результаты: 32 бита - 7 минут 64 бита - 1 час
Есть ли какая-либо причина, по которой приведенный ниже код будет работать по-другому? Я бы ожидал обратного, если есть какая-либо разница.
Function SysMemory()
Dim oInstance
Dim colInstances
Dim dRam As Double
Set colInstances = GetObject("winmgmts:").ExecQuery("SELECT * FROM Win32_PhysicalMemory")
For Each oInstance In colInstances
dRam = dRam + oInstance.Capacity
Next
SysMemory = dRam / 1024 / 1024 & "MB"
End Function
Sub Calc_Timer()
' Setup and start timer
Application.Calculation = xlCalculationManual
Dim StartTime As Double
Dim TimeTaken As String
StartTime = Timer
' Find last row in spreadsheet based on Column C then copy down all formulas
Dim Lastrow As Long
Lastrow = Range("C" & Rows.Count).End(xlUp).Row
Range("S2:Y102").FillDown
' Calculate then paste as values except for top row to keep live formulas
Application.Calculate
Range("S3:Y102").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
' Check office version
Dim OfficeVersion As String
If Win64 Then
OfficeVersion = "Excel Version: V" & Application.Version & " 64-Bit"
Else
OfficeVersion = "Excel Version: V" & Application.Version & " 32-Bit"
End If
' Report time taken
TimeTaken = Format((Timer - StartTime) / 86400, "hh:mm:ss")
Application.Calculation = xlCalculationAutomatic
MsgBox "Time Taken: " & TimeTaken & " (hours, minutes, seconds)" & vbCrLf & _
"Processor: " & CreateObject("WScript.Shell").RegRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\ProcessorNameString") & vbCrLf & _
"RAM: " & SysMemory() & vbCrLf & OfficeVersion & vbCrLf & "Operating System: " & Application.OperatingSystem
End Sub
Пример формул приведен ниже:
S2:
=SUMPRODUCT(--(ISNUMBER(SEARCH($C2,'Raw Data'!$A:$A)))*(((ROUNDDOWN(H2,0)>='Raw Data'!$L:$L)*(ROUNDDOWN(H2,0)<='Raw Data'!$W:$W))+((ROUNDUP(I2,0)>='Raw Data'!$L:$L)*(ROUNDUP(I2,0)<='Raw Data'!$W:$W))+((ROUNDDOWN(H2,0)<='Raw Data'!$L:$L)*(ROUNDUP(I2,0)>='Raw Data'!$W:$W))>0))
T2:
=SUMPRODUCT(--(ISNUMBER(SEARCH($C2,'Raw Data'!$A:$A)))*(((ROUNDDOWN(H2,0)>='Raw Data'!$L:$L)*(ROUNDDOWN(H2,0)<='Raw Data'!$W:$W))+((ROUNDUP(I2,0)>='Raw Data'!$L:$L)*(ROUNDUP(I2,0)<='Raw Data'!$W:$W))+((ROUNDDOWN(H2,0)<='Raw Data'!$L:$L)*(ROUNDUP(I2,0)>='Raw Data'!$W:$W))>0),'Raw Data'!$G:$G)
U2:
=SUMPRODUCT(--(ISNUMBER(SEARCH($C2,'Raw Data'!$A:$A)))*(((ROUNDDOWN(H2,0)>='Raw Data'!$L:$L)*(ROUNDDOWN(H2,0)<='Raw Data'!$W:$W))+((ROUNDUP(I2,0)>='Raw Data'!$L:$L)*(ROUNDUP(I2,0)<='Raw Data'!$W:$W))+((ROUNDDOWN(H2,0)<='Raw Data'!$L:$L)*(ROUNDUP(I2,0)>='Raw Data'!$W:$W))>0),'Raw Data'!$H:$H)
V2:
=U2/T2
W2:
=COUNTIF(B3:B2305,B2)
X2:
=ROUNDDOWN(H2,0)
Y2:
=ROUNDUP(H2,0)