VBA文本框比较提供不合逻辑的结果

时间:2014-04-30 20:27:00

标签: vba ms-access textbox type-conversion

前提:在子窗体文本框的AfterUpdate事件期间执行两个文本框之间的比较,一个在子窗体中,一个在父窗体中。进行此比较时,会返回不合逻辑的结果。

目标:返回这两个控件中包含的值之间的合法比较。

进度: 以下代码显示了输出到立即窗口的代码和明显的非法结果的示例。
代码:

Debug.Print IsNumeric(textBurnup) & IsNumeric(Parent!textBurnupLimit), _
            textBurnup & ">" & Parent!textBurnupLimit & " = " & _
             (textBurnup > Parent!textBurnupLimit)

textBurnup = Parent!textBurnupLimit - 100

Debug.Print IsNumeric(textBurnup) & IsNumeric(Parent!textBurnupLimit), _
            textBurnup & ">" & Parent!textBurnupLimit & " = " & _
           (textBurnup > Parent!textBurnupLimit)

结果:

TrueTrue      100>21500 = True
TrueTrue      21400>21500 = False`

我尝试过的事情:

  • 将文本框格式设置为“常规号码”。 修复问题,但我不想这样做。
  • 对任一控件执行算术运算。 修复问题,但我不想这样做。
  • 使用任一控件'.Value属性。 不起作用。
  • 将一个数字替换为Parent!文本框。 作品。击败了查看Parent的文本框的目的。
  • 我现在想不起的其他一些事情,因为我太惊讶于我设法打破逻辑。

文本框都是数字,应具有可比性。为什么会这样?为什么将其中一种格式设置为“常规数字”会修复它?

相关文章:
String Compare Logic (based on answers below)

来源信息:
Coding Horror (based on answers below)

2 个答案:

答案 0 :(得分:2)

在您的示例中,100 > 21500为True,因为它是一个字符串(" ascii-betical")比较,而不是数字。

虽然有一个皱纹......

? "100" > "21500"  --> False!
? "100" >" 21500"  --> True!

我猜测您的观察结果是因为您在第二个值上有一个前导空格:如果不是这样的情况那么它就无法评估为True。 ..

IsNumeric()不会检查变量值是否一个数字,只要它可以安全地转换为一个数字,所以

IsNumeric("100") = True 

即使" 100"是一个字符串。

如果您希望拉出的值表现为数字,那么正确的方法是

1)使用IsNumeric()检查它们是否可以安全地转换为数字类型,然后

2)使用CDbl()CLng()等将其转换为@simoco建议。

答案 1 :(得分:1)

CDbl(textBurnup) > CDbl(Parent!textBurnupLimit)?” - simoco

“在您的示例中,100> 21500为True,因为它是一个字符串(”ascii-betical“)比较,而不是数字。IsNumeric()不会检查变量值是否为数字,所以IsNumeric("100") = True即使“100”是一个字符串。如果你想要拉出的值表现为数字,那么正确的方法是1)使用IsNumeric()检查它们是否可以安全地转换为数字类型然后2)使用CDbl()CLng()等转换为@simoco建议“ - 蒂姆威廉姆斯