两个不是两个 - 选择案例条件从不匹配

时间:2015-04-24 09:13:25

标签: excel vba excel-formula excel-2007

我想知道我的函数在VBA中的某种行为是否是错误,或者我的代码是否有问题。我也很感激建议,如果它是一个错误,我怎么能解决问题。

Option Explicit

Public Function someFunction(dblWeight As Double) As Integer
  Dim x As Integer

  Select Case dblWeight
    Case Is <= 0.25: x = 1
    Case Is <= 0.5: x = 2
    Case Is <= 0.75: x = 3
    Case Is <= 1: x = 4
    Case Is <= 1.25: x = 5
    Case Is <= 1.5: x = 6
    Case Is <= 1.75: x = 7
    Case Is <= 2: x = 8
    Case Is <= 3: x = 9
    Case Is <= 4: x = 10
    Case Is <= 5: x = 11
    Case Is <= 10: x = 12
    Case Else: x = 13
  End Select

  someFunction = x
End Function

如果我直接从VBA代码调用此函数,则所有结果都符合预期。如果我从Excel中的单元格调用此函数,它会变得奇怪:

         A       B       C
1      1.9       8       '=someFunction(A1)
2      2.0       9       '=someFunction(A2)
3      2.1       9       '=someFunction(A3)

在A栏中,针对该功能检查的值将作为数字输入 - 而不是作为文本输入 在B列中,您会看到返回的结果 在C栏中,我展示了函数调用,它导致了B列中显示的结果。

问题是:为什么2.0不小于或等于2?

我已经尝试过:

  • 给出函数的参数&#34; ByRef&#34;而不是&#34; ByVal&#34;
  • 通过添加#来强制显然不是双倍的值(例如&#34; Case Is&lt; = 2#:x = 8&#34;)
  • 用if构造
  • 替换switch构造
  • 给出可靠范围(例如&#34;案例1.751至2:x = 8&#34;)
  • 认为它可能是一个乱糟糟的Excel安装或有缺陷的Excel工作簿,但它也发生在具有全新工作簿的其他机器上

所有这些都没有帮助。更令人神秘的是事实,它只发生在值2.如果我将excel表中的值从2.0更改为1.0,我得到的结果为4而不是5 - 所以这种行为甚至不均匀是一致的。

我完全感到困惑,并没有找到解决方法,所以任何帮助都会很棒。

问候

曼努埃尔

1 个答案:

答案 0 :(得分:2)

  

问题是:为什么2.0不小于或等于2?

2 不是 2.000000000000000 但是以无限小的数量关闭时。 Excel适用于15位浮点精度。第15位数四舍五入的差异很小,导致浮点误差。

我建议像这样四舍五入 dblWeight

  Select Case Round(dblWeight, 4)

4位精度应该足以满足2位十进制数的范围。

请参阅Floating-point arithmetic may give inaccurate results in Excel