【问题标题】:runtime error '6' overflow-vba运行时错误“6”溢出-vba
【发布时间】:2017-08-16 23:29:24
【问题描述】:

执行以下代码时出现运行时错误“6”溢出。

Private Sub ComboBox1_CLICK()

If val(Label27) >= 0 And val(Label27) <= val(Label9) Then    
    Label35 = (val(Label13) - val(Label14) + 1) * val(Label27)/val(Label9)    
ElseIf val(Label27) >= val(Label9) And val(Label27) <= val(Label6) Then    
    Label35 = val(Label13) + 1    
Else     
    Label35 = (val(Label13) + 1) * val(Label6) / val(Label27)            
End If

end sub

【问题讨论】:

  • 听起来你正试图除以零。检查 Label9 和 Label27 的值不为零。
  • 否,除以零会引发运行时错误 11
  • 您在哪一行得到错误?你的Label27等变量在崩溃时的值是多少?
  • 当我在用户窗体中运行组合框时,标签 27 还没有值,我认为它默认为零。
  • 啊-0 / 0 溢出,所以@Olly 可能是正确的。因此,如果Label9Label27 都为零或空白,则您的第一行Label35 = 将被执行并溢出。

标签: vba excel


【解决方案1】:

听起来您正试图将零除以零。检查Label9Label27的值不为零。

通常除以零会产生一个

运行时错误“11”:除以零

错误,但如果 Label9 为零(或空白)并且 (val(Label13) - val(Label14) + 1) * val(Label27) 的计算结果为零(可能是因为 Label27 为零),您将计算 0 / 0,这会导致 VBA生成一个

运行时错误“6”:溢出

错误。

【讨论】:

    【解决方案2】:

    如果 VBA 使用 int 作为数据类型并且中间结果超过了 int 的大小,则可能会发生溢出 - 即使最终结果小到足以放入 int 中也是如此

    Dim i As Integer
    i = 1000 * 1000 / 2000    ' Will raise overflow
    

    您应该强制 VBA 使用数据类型 long。 所以不要使用函数val,而是使用函数CLng

    Dim i As Integer
    i = CLng(1000) * 1000 / 2000    ' Okay
    i = CLng("1000") * CLng("1000") / cLng("2000")    ' Okay
    

    正如 YowEwK 所说,这可能无法解决您的问题。如果不是,请为您正在处理的每个值定义一个变量(如longdouble),将标签的值分配给它,如果运行时错误仍然发生,请在调试器中检查它们的值:

    Dim val27 As doubble
    Dim val19 As doubble
    val27 = Val(Label27)
    val9 = Val(Label9)
    ...
    

    顺便说一句:您应该考虑用有意义的名称命名所有字段和变量。并且不要忘记添加Option explicit

    【讨论】:

    • 听起来不错,但 OP 的代码使用的是 Val,这意味着所有的计算都应该使用 Double。 (至少TypeName(Val("1")),甚至TypeName(Val(CInt(1))),返回Double,所以我看不到任何将它放回Integer的东西。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多