Created
November 30, 2018 06:52
-
-
Save DuongAQ/fad91471cb8badc6685bb71ad14e3352 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sub RangeTimer() | |
DoCalcTimer 1 | |
End Sub | |
Sub SheetTimer() | |
DoCalcTimer 2 | |
End Sub | |
Sub RecalcTimer() | |
DoCalcTimer 3 | |
End Sub | |
Sub FullcalcTimer() | |
DoCalcTimer 4 | |
End Sub | |
Sub DoCalcTimer(jMethod As Long) | |
Dim dTime As Double | |
Dim dOvhd As Double | |
Dim oRng As Range | |
Dim oCell As Range | |
Dim oArrRange As Range | |
Dim sCalcType As String | |
Dim lCalcSave As Long | |
Dim bIterSave As Boolean | |
' | |
On Error GoTo Errhandl | |
' Initialize | |
dTime = MicroTimer | |
' Save calculation settings. | |
lCalcSave = Application.Calculation | |
bIterSave = Application.Iteration | |
If Application.Calculation <> xlCalculationManual Then | |
Application.Calculation = xlCalculationManual | |
End If | |
Select Case jMethod | |
Case 1 | |
' Switch off iteration. | |
If Application.Iteration <> False Then | |
Application.Iteration = False | |
End If | |
' Max is used range. | |
If Selection.Count > 1000 Then | |
Set oRng = Intersect(Selection, Selection.Parent.UsedRange) | |
Else | |
Set oRng = Selection | |
End If | |
' Include array cells outside selection. | |
For Each oCell In oRng | |
If oCell.HasArray Then | |
If oArrRange Is Nothing Then | |
Set oArrRange = oCell.CurrentArray | |
End If | |
If Intersect(oCell, oArrRange) Is Nothing Then | |
Set oArrRange = oCell.CurrentArray | |
Set oRng = Union(oRng, oArrRange) | |
End If | |
End If | |
Next oCell | |
sCalcType = "Calculate " & CStr(oRng.Count) & _ | |
" Cell(s) in Selected Range: " | |
Case 2 | |
sCalcType = "Recalculate Sheet " & ActiveSheet.Name & ": " | |
Case 3 | |
sCalcType = "Recalculate open workbooks: " | |
Case 4 | |
sCalcType = "Full Calculate open workbooks: " | |
End Select | |
' Get start time. | |
dTime = MicroTimer | |
Select Case jMethod | |
Case 1 | |
If Val(Application.Version) >= 12 Then | |
oRng.CalculateRowMajorOrder | |
Else | |
oRng.Calculate | |
End If | |
Case 2 | |
ActiveSheet.Calculate | |
Case 3 | |
Application.Calculate | |
Case 4 | |
Application.CalculateFull | |
End Select | |
' Calculate duration. | |
dTime = MicroTimer - dTime | |
On Error GoTo 0 | |
dTime = Round(dTime, 5) | |
MsgBox sCalcType & " " & CStr(dTime) & " Seconds", _ | |
vbOKOnly + vbInformation, "CalcTimer" | |
Finish: | |
' Restore calculation settings. | |
If Application.Calculation <> lCalcSave Then | |
Application.Calculation = lCalcSave | |
End If | |
If Application.Iteration <> bIterSave Then | |
Application.Iteration = bIterSave | |
End If | |
Exit Sub | |
Errhandl: | |
On Error GoTo 0 | |
MsgBox "Unable to Calculate " & sCalcType, _ | |
vbOKOnly + vbCritical, "CalcTimer" | |
GoTo Finish | |
End Sub |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment