gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:26:55 24 4
gpt4 key购买 nike

我有一个简单的错误检查问题。在我的子程序开始时,我要确保范围加起来为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com