EXCEL 2016 VBA: WorksheetFunction.Power () НЕ возвращает число - PullRequest
0 голосов
/ 07 января 2019

Я столкнулся с подобной проблемой, связанной с функцией WorksheetFunction.Power () в EXCEL 2016 VBA, с той, которая обсуждалась здесь в отношении функции Fact ():

https://www.excelforum.com/excel-general/468208-range-of-factorial-function.html

Когда я запускаю свой код, я получаю это сообщение об ошибке:

enter image description here

Для больших чисел функция Power () не возвращает число. Вот краткая демонстрация в таблице:

enter image description here

Однако избежать проблемы Fact () было относительно легко: я просто написал условное утверждение, подобное этому:

If NTestvar < 170 Then
    KS = WorksheetFunction.Fact(NTestvar)
Else
    KS = 7.2574E+306
End If

ОДНАКО, с таким количеством комбинаций основание / экспонента, это немного более многомерно. Я пробовал это, но все равно получаю то же сообщение:

    If IsNumeric(WorksheetFunction.Power(NTestvar, NTestvar)) = True Then
        KS_2 = 1 - ((2 / WorksheetFunction.Power(NTestvar, NTestvar))
    Else
        KS_2 = 1 - (2 / 1.79769313486232E+308)
    End If

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

В итоге я обобщил подход Криса и написал эту функцию, которую я могу использовать в других частях своего приложения (для моего использования показатель степени положительно определен, поэтому мне не нужно было беспокоиться об этой возможности). Большое спасибо Крис! Твой подход был подходом !!

Function MyPower(Base As Variant, Exp As Variant) As Double
    On Error GoTo MyPowerErr
    MyPower = WorksheetFunction.Power(Base, Exp)
    Exit Function
MyPowerErr:
    MyPower = 1.79769313486232E+307
End Function
0 голосов
/ 08 января 2019

Вероятно, проще всего справиться с ошибкой, если она сгенерирована. Упаковка Power в свою собственную функцию также может быть более аккуратной.

Sub Demo()
    Dim KS_2 As Double
    On Error GoTo EH

    KS_2 = MyPower(100, 200)
    Debug.Print "KS_2 = ", KS_2
Exit Sub
EH:
    Err.Raise Err.Number
End Sub

Function MyPower(Base As Double, Exp as Double) As Double
    On Error GoTo EH
    MyPower = 1# - (2# / WorksheetFunction.Power(Base, Exp))
Exit Function
EH:
    If Err.Number = 1004 Then
        MyPower = 1#
    Else
        Err.Raise Err.Number
    End If
End Function

Обратите внимание, что ваша функция может выдавать другие ошибки, например, если NTestvar = скажем -1000, она выбрасывает "Деление на ноль".

...