【问题标题】:EXCEL 2016 VBA: WorksheetFunction.Power() NOT returning a numberEXCEL 2016 VBA:WorksheetFunction.Power() 不返回数字
【发布时间】:2019-01-07 19:10:32
【问题描述】:

我在 EXCEL 2016 VBA 中的 WorksheetFunction.Power() 函数遇到了与此处讨论的有关 Fact() 函数的问题类似的问题:

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

当我运行我的代码时,我收到以下错误消息:

对于大数字,Power() 函数不返回数字。这是电子表格中的快速演示:

但是,避免 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

感谢任何帮助。

【问题讨论】:

  • 感谢您的回复。是的,我在问我的问题之前阅读了那篇文章:这就是我使用数字 1.79769313486232E+308 的原因——我从那篇文章中得到的。不过,我的问题不是变量输入问题:我没有将结果存储在发生错误的语句中的变量中: If IsNumeric(WorksheetFunction.Power(NTestvar, NTestvar)) = True Then
  • KS_2 声明为双精度?
  • 错误发生在 IF 语句 BEFORE KS_2 赋值语句。
  • 我认为 IsNumeric 有一个限制。在对其进行测试时,1.0e309 会引发溢出错误,而 1.0e308 不会。

标签: excel vba function numbers


【解决方案1】:

如果错误被抛出,可能最容易处理。将 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 = say -1000 它会引发“除以零”。

【讨论】:

    【解决方案2】:

    我最终概括了 Chris 的方法并编写了这个函数,可以在我的应用程序的其他部分使用(对于我的使用,指数是正定的,所以我不需要担心这种可能性)。非常感谢克里斯!你的方法是要走的路!!

    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
    

    【讨论】:

    • 谢谢克里斯!这是一条重要的线。我已经在上面添加了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    相关资源
    最近更新 更多