Excel VBA 通过简单的除法抛出溢出错误

问题描述 投票:0回答:3

Excel 2013。VBA: 此代码:

Sub test()
On Error GoTo Err:
Dim p As Double

p = (362 * 100) / 2005
Exit Sub
Err:
    If Err.Description <> "" And Err.Source <> "" Then
        MsgBox Err.Description, vbCritical, Err.Source
    End If
End Sub

抛出溢出编号 6 错误。为什么?

excel vba integer
3个回答
4
投票

错误出现在

362 * 100
。被认为是
Integer
并且取决于
32767

尝试这样:

Public Sub TestMe()    
    Dim pct As Double
    pct = (CDbl(362) * 100) / 2005        
End Sub

问题是,如果以下 4 个数学表达式 (

+-/*
) 中的任何一个的值在
2^15-1
32767
下,VBA 会将它们视为
Integer
,并且尝试将结果解析为
Integer
,如下所示出色地。 (
Integer
值实际上是从
-32768
32767

因此,

32767+1
给出了推翻错误。如果你尝试使用
32768+1
那就没问题了,因为
32768
会被解析为
Long

对于幂运算符,

^
,VBA 解析为
Double
,这完全没问题 -
2 ^ 10 + 32000


3
投票

因为 VBA 中的

Integer
类型是 16 位有符号的,并且 36200 会溢出其最大值 32767。您可以通过将
&
附加到其中一个操作数以使其成为
Long
文字来避免这种情况,例如
(362& * 100) / 2005 
.


0
投票

我今天运行的这个“溢出”问题的另一个可能的解决方法是考虑将操作数 DIM 为“double常量”,如下面的代码...这使得“double const”获得“双结果” “操作后...(我的游戏是将 56 个颜色索引表中的 RGB 颜色转换为数字(但双倍)...)

Const BLUE_OFFSET As Double = 65536
Const GREEN_OFFSET As Double = 256
Const RED_OFFSET As Double = 1

Public Const colID01 As Double = (0 * RED_OFFSET) + (0 * GREEN_OFFSET) + (0 * BLUE_OFFSET) 'RGB(0, 0, 0)
Public Const colID02 As Double = (255 * RED_OFFSET) + (255 * GREEN_OFFSET) + (255 * BLUE_OFFSET) 'RGB(255, 255, 255)
© www.soinside.com 2019 - 2024. All rights reserved.