运行时错误6在vba中溢出excel

时间:2017-06-06 16:09:26

标签: excel vba excel-vba

我正在运行以下程序,并在程序到达a后第一次迭代时出现溢出错误。根据我的理解,这不应该发生,因为我使用的是具有荒谬容量的双打,而且是Long,但是因为它目前只有100,所以它应该无关紧要,并且代码在此之前很久就失败了。这是我的原始输入:

h0 = 1000, v0 = 0, a0 = g = -9.80665, dt = .01, m = 752.2528, b = .287875

这是代码:

Sub drag()
    Dim h0 As Double
    Dim v0 As Double
    Dim a0 As Double
    Dim dt As Double
    Dim m As Double
    Dim b As Double
    Dim g As Double
    Dim i As Long
    Dim h As Double
    Dim v As Double
    Dim a As Double

    h0 = Worksheets("Drag").Cells(2, 8).Value
    v0 = Worksheets("Drag").Cells(2, 9).Value
    a0 = Worksheets("Drag").Cells(2, 10).Value
    g = Worksheets("Drag").Cells(2, 10).Value
    dt = Worksheets("Drag").Cells(2, 7).Value
    m = Worksheets("Drag").Cells(2, 4).Value
    b = Worksheets("Drag").Cells(2, 5).Value
    Debug.Print h0 & v0 & a0 & dt & m & b

    For i = 1 To 100
        v = v0 + a0 * dt
        h = 0.5 * a0 * (dt ^ 2) + v0 * dt + h0
        a = m * g - b * (v ^ 2)   'Line where overflow occurs
        v0 = v
        h0 = h
        a0 = a
        Cells(i + 2, 8) = h0
        Cells(i + 2, 9) = v0
        Cells(i + 2, 10) = a0
        Next i
    Debug.Print h0 & v0 & a0 & dt & m & b
End Sub

希望这是一个简单的解决方案。

2 个答案:

答案 0 :(得分:5)

  

当i = 14(第14次通过循环)和v = -1.689 x 10 ^ 209时,会发生溢出。我不知道你想要做什么,但是v正在爆炸。如果你描述你想要做的事情会有所帮助。 - 约翰科尔曼17分钟前

     @John Coleman我现在看到了这个问题,我正在做拖曳等式,我忘了把一个术语除以m,谢谢。 - Anthrochange 9分钟前

您已经确定了需要做什么。

现在解释为什么溢出m * g - b * (v ^ 2)。我添加了一个手表,如下所示

考虑前后截图

在计算v = v0 + a0 * dt之前

enter image description here

计算v = v0 + a0 * dt

enter image description here

你在这里看到的是一种非常奇特的行为。类型Double更改为Integer

这是不正常的,以前经历过。不幸的是,Excel中存在这个问题很长一段时间,遗憾的是Excel 2016中也存在此问题。仅当您使用非常大的数字时才会出现此问题。这些错误非常罕见,但是,确实存在。

使用MOD时可以获得类似的体验,如下面链接

中所述

The MOD Function

答案 1 :(得分:1)

正在获得溢出的变量是v。您将其定义为double,这意味着您只能将数字放在1.79769313486232 * 10 ^ 308到4.94065645841247 * 10 ^ -324的范围内。 VBA使用8个字节来保存双数据。超出这个巨大范围的任何数字都会导致溢出。 (有关DBA数据类型的更多信息,请参阅here

你期待的数字有多大? rough estimate fo the number of atoms in the universe是1 * 10 ^ 82,双值范围几乎是2 * 10 ^ 308。如果您需要使用较大的数字,那么您将不得不使用different method,因为它根本不适合标准的VBA数据类型。