2017-08-16 232 views
0

我运行时错误'6'溢出当我执行下面的代码。运行时错误'6'溢出-VBA

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 
+1

听起来就像你试图除以零。检查Label9和Label27的值不为零。 – Olly

+0

否,零除会引起运行时错误11 – FunThomas

+0

哪条线会出错?变量崩溃时,你的'Label27'等等什么值? – YowE3K

回答

1

如果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)的每一个值的变量,分配值f标签,它并检查调试他们的价值观,如果运行时错误仍然发生:

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

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

+0

听起来不错,但是OP的代码使用'Val',这意味着所有的计算都应该以'Double'完成。 (至少一个'TypeName(Val(“1”))',甚至TypeName(Val(CInt(1)))'返回'Double',所以我看不到任何会将它放回一个Integer。) – YowE3K

+0

@YowEwK:你说得对,只是检查。 – FunThomas

1

听起来就像你试图将零除零。检查Label9Label27的值不为零。

通常被零除将产生

运行时错误 '11':被零除

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

运行时错误'6':溢出

错误。