前提:在子窗体文本框的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`
我尝试过的事情:
文本框都是数字,应具有可比性。为什么会这样?为什么将其中一种格式设置为“常规数字”会修复它?
答案 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建议“ - 蒂姆威廉姆斯