Быстрее ли использовать логическое выражение в уравнении Excel, чем функцию if? - PullRequest
0 голосов
/ 03 мая 2018

У меня очень медленная рабочая книга, и я пытаюсь сделать ее быстрее.

Улучшает ли это скорость, если я использую логическое значение в числовых формулах?

Например, у меня есть что-то вроде этого:

=offset(A1, if(month(b1)>6, 4 + month(b1), 2 + month(b1)), 0)

Вместо этого я собираюсь использовать это:

=offset(A1, month(b1) + 2 + 2 * (month(b1)>6), 0)

1 Ответ

0 голосов
/ 04 мая 2018

Если вы используете Excel для Windows и если вам нужно измерить время вычисления Excel для сравнения, рассмотрите этот мощный код из статьи в Microsoft Developer Network. Это поможет вам сравнить две формулы выше и любую формулу, которая может появиться в будущем. Пожалуйста, следуйте инструкциям:

Чтобы включить инструменты разработчика на ленте:

Откройте Excel -> Файл -> Параметры -> Настроить ленту -> Настроить Лента (раскрывающееся) -> Основные вкладки -> Разработчик (установите флажок) -> ОК

Для доступа к редактору VBA:

Вкладка разработчика -> Visual Basic -> Вставить модуль -> Вставить найденный код ниже в редактор VBA

#If VBA7 Then
    Private Declare PtrSafe Function getFrequency Lib "kernel32" Alias _
        "QueryPerformanceFrequency" (cyFrequency As Currency) As Long
    Private Declare PtrSafe Function getTickCount Lib "kernel32" Alias _
         "QueryPerformanceCounter" (cyTickCount As Currency) As Long
#Else
    Private Declare Function getFrequency Lib "kernel32" Alias _                                            "QueryPerformanceFrequency" (cyFrequency As Currency) As Long
    Private Declare Function getTickCount Lib "kernel32" Alias _
        "QueryPerformanceCounter" (cyTickCount As Currency) As Long
#End If
Function MicroTimer() As Double
'

' Returns seconds.
    Dim cyTicks1 As Currency
    Static cyFrequency As Currency
    '
    MicroTimer = 0

' Get frequency.
    If cyFrequency = 0 Then getFrequency cyFrequency

' Get ticks.
    getTickCount cyTicks1                            

' Seconds
    If cyFrequency Then MicroTimer = cyTicks1 / cyFrequency 
End Function


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

Если вы хотите легко получить доступ к этим инструментам, например с ленты, прокрутите вверх и следуйте инструкциям по настройке ленты. Когда вы окажетесь там, выберите Macros из выпадающего списка Choose commands from, затем добавьте к существующей вкладке, или вы также можете создать новую вкладку для этих инструментов.

Для подробного объяснения того, как использовать эти инструменты, вы можете проверить ссылки оригинального источника внизу, в разделе Ссылки. Первая ссылка для 32-битной Windows, вторая для 32-битной Windows и 64-битной Windows.

Надеюсь, это поможет ..


Ссылки:

Повышение производительности в Excel 2007 Чарльз Уильямс

Производительность Excel: повышение производительности вычислений Чарльз Уильямс

Decision Models Ltd

...