vba - 使用 double 进行错误处理不起作用 - VBA excel

标签 vba excel sum double

我有一个简单的错误检查问题。在我的子程序开始时,我要确保范围加起来为 100%。我通过使用 Range.value 获取单元格“F3”的值并将其存储为 double 值来实现此目的。 F3 包含一个用于检查另一个范围的 SUM 公式。

我可以看到在 locals 窗口中 double 的值为 1(因为这些值加起来为 100%),但是,代码仍然进入下面的 If 语句并退出 sub。

Sub dataCollection()

'Define sheets
Dim ipt As Worksheet
Set ipt = Sheets("Input form")

'Check that allocation is 100%
Dim alloc As Double
alloc = ipt.Range("F3").Value

If alloc <> 1 Then
    MsgBox "Error, allocation does not equal 100%"
    Exit Sub
End If

...

End Sub

以这种方式使用 double 是否有问题?

最佳答案

在计算机语言中使用double或任何 float 是一个众所周知的问题。因此,您永远不应该比较 double 值。或者,这样做时您应该小心。根据您的情况,请使用类似以下内容的内容:

如果 Abs(alloc-1) > 0.000000001 则

更多内容请阅读: Floating point inaccuracy examples

一般来说,要了解发生的情况,请在新的 Excel 工作簿中尝试以下代码:

Option Explicit

Public Sub TestMe()

    Dim cntSum      As Double

    Cells.Clear

    Cells(1, 1) = 0.3
    Cells(2, 1) = 0.2
    Cells(3, 1) = 0.2
    Cells(4, 1) = 0.2
    Cells(5, 1) = 0.1

    cntSum = Cells(1, 1) + Cells(2, 1) + Cells(3, 1) + Cells(4, 1) + Cells(5, 1)

    Debug.Print cntSum
    Debug.Print cntSum = 1
    Debug.Print cntSum - 1

End Sub

您将在控制台中看到以下内容:

 1 
False
-1,11022302462516E-16 

这意味着cntSum1(第一行),但它不等于1(第二行),并且它和1之间的绝对差是-1,11~E-16

在 Excel 中,解决此问题的一种方法是使用货币 格式。添加这一行:

Range("A1:A5").Style = "Currency"

Cells.Clear代码之后并再次运行它。现在结果不同了。

关于vba - 使用 double 进行错误处理不起作用 - VBA excel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47094275/

相关文章:

r - R中零点之间向量的总和元素

excel - 查找范围内第一次出现的值,向上

vba - 将字符串拆分为多个字符的函数

python - 将许多小 DataFrame 导出到单个 Excel 工作表

mysql - 在对employee_id进行内部联接时如何获取每个唯一员工的销售额总和

oracle - 查询查找总和小于某个金额的行

VBA 代码循环遍历 Outlook 中的每个文件夹和子文件夹

excel - 基于Excel版本的条件编译

vba - 如何在vba中构建一个可以区分0的默认空对象?

C# 不从电子表格中读取 excel 日期