2017-07-20 55 views
1
Sub TestFunction() 
    Dim var As Double 
    var = 25 * 24 * 23 * 22 * 21 * 20 
End Sub 

我收到此vba操作的溢出錯誤。當我在一個單元格中運行它我得到127,512,000excel VBA溢出錯誤,當它不應該

什麼可能是這個錯誤?這應該遠遠低於這種數據類型的大小限制嗎?

回答

5

VBA惱人地將第一項轉換爲整數,因爲在你的情況下,它足夠小。

修改這條線,它明確地轉換爲double:

var = CDbl(25) * 24 * 23 * 22 * 21 * 20

+0

另一種方法是通過添加'&'字符來定義第一個數字,例如'25&'。這也可以用於常量定義(不允許調用'CDbl'的函數)。 – FunThomas

+2

@FunThomas如果你打算使用類型提示,並且你需要一個double,你可以使用'Const myDouble = 25#'或'Const myDouble = 25.0'(它會通過VBE漂亮的打印機自動糾正'Const myDouble = 25#') – ThunderFrame

2

試試這樣說:

Option Explicit 
Sub TestFunction() 
    Dim var As Double 
    var = 25 
    var = var * 24 * 23 * 22 * 21 * 20 
    Debug.Print var 
End Sub 

你的情況的問題是,當VBA試圖總結數字有它自己的邏輯,首先經過Integer,然後解析它到左邊的數字。 如果第一個數字大於整數(32767)或明確轉換爲Double,Long,Single,則表示沒問題。在這裏,你不會有任何問題,因爲43333被自動轉換爲long,它是確定:

Option Explicit 
Sub TestFunction()  
    Dim var As Double 
    var = 43333 * 6 * 6   
End Sub 

在你的情況下,如果第一個數字是25.1,而不是25,它就會自動轉換爲加倍,從而以後你會不會有問題,就Double*Integer = Double

Sub TestFunction() 
    Dim var As Double 
    var = 25.1 * 24 * 23 * 22 * 21 * 20 
    Debug.Print var 
End Sub 

去得更深一些,用VarType() function。聲明k爲Variant,看看VBA將其轉換爲,根據其價值和算術運算:

​​

所有debug.print回報True

+0

不是Excel。 VBA。這種行爲與主機應用程序無關。 –

+0

@ Mat'sMug - true。 – Vityata