【发布时间】:2017-12-05 17:15:47
【问题描述】:
我正在使用 VBA 从电子表格中比较两次。 在我的示例中,表单的实际值是两个单元格中的 23:00。我将它们用于 if 语句,这些值都来自 Variant 类型的两个不同数组。
if dataArr(v1) = rowArr(v2) Then
如果我调试这两个值,它会像这样显示这两个值
0,958333333333333 / 0,958333333333333
它们看起来相同,但 if 语句中的比较返回 false
所以我把这两个值相减,看看结果是否为零。
dataArr(v1) - rowArr(v2)
在这种情况下,结果不是零,而是
3,33066907387547E-16
所以表示时间的比较或两个双精度值有问题。
我找到的唯一可行的解决方案是将它们转换为字符串值
CStr(dataArr(v1)) = CStr(rowArr(v2))
它应该返回 true。
我不是很喜欢这个解决方案,因为它不是真正应该如何工作的。我还调查了这些值在比较之前会发生什么,但我找不到任何错误。实际上,dataArr 中的所有值都来自电子表格 (ListObject.DataBodyRange.Value),然后某些值从 dataArr 复制到 rowArr,因此它确实应该是相同的值。
有什么建议吗?谢谢!
【问题讨论】:
-
如何加载数组中的值?在您的示例中它是一维的,所以我猜您不是从范围读取到数组。显示加载过程。
-
由于代码非常复杂,示例被简化。我刚刚用 CStr 测试了代码,结果证明,如果我手动将时间添加到单元格中,它就可以工作。我首先使用的值也被一个子复制。所以我认为问题在于单元格中的值。即使看起来相同并且具有相同的单元格格式。
-
double 的精度为 17 位,但表示仅为 15。因此,两个 double 可以不同,即使它们在转换为字符串后看起来相同。所以结果没有问题。要比较两个日期的相等性,您需要四舍五入到 24 小时 x 60 分钟 x 60 秒的精度:
Round(date1 * 86400) = Round(date2 * 86400).
标签: excel vba if-statement compare double