首页 > 解决方案 > Visual Basic 中的溢出:数据类型使用

问题描述

VBA 程序需要对超过 100 的数字执行阶乘。我想知道是否有一种数据类型可以处理这么大的数字,或者我是否必须简化组合问题。

使用的等式是一个简单的组合,即 n!/(r!*(nr)!)。我应该简化这个问题以获得结果,还是可以处理数字的数据类型就足够了。

Private Sub CommandButton1_Click()
    Dim j As Integer, c As Integer, b As Integer, p As Single, val As Long
    c = 100
    b = 105
    p = 0.9

    For j = c + 1 To b
        val = fact(b) / (fact(j) * fact(b - j))
        Cells(2, j - 100).value = val
    Next j
End Sub

Public Function fact(x As Integer) As Long
    Dim facts As Long, k As Integer
    For k = 1 To x
        facts = facts * x
    Next k
    Exit Function
End Function

我期望给定组合的输出,但显示的错误是运行时错误“6”溢出。

图 1

标签: excelvba

解决方案


fact即使您将 Long 更改为 Double ,该函数也会出现一些错误:

  • 未初始化的事实
  • 未返回调用函数的事实

所以它应该看起来像这样:

 Sub test()
    Dim j As Integer, c As Integer, b As Integer, p As Single, val As Double
    c = 100
    b = 105
    p = 0.9    
    For j = c + 1 To b   
        val = fact(b) / (fact(j) * fact(b - j))
            Cells(2, j - 100).Value = val
    Next j
End Sub

Public Function fact(x As Integer) As Double
    Dim facts As Double, k As Integer
    facts = 1
    For k = 1 To x
        facts = facts * k
    Next k
    fact = facts
End Function

您可以对照 Excel 的Combin函数检查这一点——它给出了相同的结果。


推荐阅读