【问题标题】:VBA identical nrs not matching in if statementVBA相同的nrs在if语句中不匹配
【发布时间】:2021-09-29 02:23:36
【问题描述】:

我很抱歉,我意识到这可能已经被问过无数次了,但我已经尝试过寻找,但找不到像我这样的情况。我还在学习,我之前也从未在这里发过帖,所以请对我温柔一点。

我正在使用 Excel VBA。我有两个单元格(PICKAmt 和 INVAamt,同一张表),它们每个都有完全相同的数字,例如399.80.

  1. 即使在将单元格格式化为 0.00 VBA 后,仍将它们都读取为“399.8”,但仍表示它们不一样

  2. 他们都是“双打”

  3. 同样的计算在完全相同的情况下在不同的工作表上工作

  4. 我的代码说:

    Private Function INVACalc(ByVal INVAamt As Double, Holdcell As String, lastcell1 As String) As Double   
    Dim PICKAmt As Double  
    Dim APSDamt As Double  
    Dim lastcell3 As String  
    Dim SUND As String  
    Dim APIE As String
    
    Worksheets("GL").Activate  
    Range(lastcell1).Offset(0, 9).NumberFormat = "0.00"  
    Range(lastcell1).Offset(0, 9).Value = Application.WorksheetFunction.Sum(Range("AL:AL"))         'add up total of all lines  
    PICKAmt = Range(lastcell1).Offset(0, 9).Value  
    If PICKAmt = INVAamt Then    
       'do stuff  
    Else  
      'do something else  
    End if
    

它直接进入“Else”,好像这两个金额不相同,它们是。它们没有多余的空格或字符。我可以在它们之间找到的唯一区别是 INVAAmt 单元格被格式化为“自定义”,而 PICKAmt 单元格被格式化为“数字”,但是同样的代码在其他具有相同格式的工作表上也能正常工作。我很茫然。

【问题讨论】:

  • 从一个数字中减去另一个数字以查看差异。不要依赖格式化的值。如果有区别,会去Else
  • 我已经做到了 - 没有区别。
  • 你的意思是debug.print(PICKAmt - INVAamt)还是debug.print(INVAamt - PICKAmt)返回0?
  • 嗯,这很有趣......昨晚我在工作表本身而不是代码中做了减法,它变成了 0。今天早上,当我看到 shahkalpeshp 的评论时,我在代码中添加了这一行并再次运行它,期望它是纯 0。我得到的是:-1.13686837721616E-13....我没想到
  • 关于如何绕过它的任何建议?

标签: excel vba if-statement trailing


【解决方案1】:

问题是小数用二进制表示的方式,如here 所述。 “相同”的小数可以有多个浮点表示,例如

Sub explain()
   Dim n As Double, m As Double, k As Double
   n = 0.6
   m = 0.3 + 0.3
   k = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1
   Debug.Print Format(m - n, "0.000000000000000000")
   Debug.Print Format(k - n, "0.000000000000000000")   
End Sub

第一个结果是0.000000000000000000,第二个结果是0.000000000000000111。一种解决方案是将双精度设置为字符串并比较字符串。

If Format(PICKAmt,"0.00") = Format(INVAamt,"0.00") Then

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2016-12-16
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多