【发布时间】:2014-04-30 20:26:59
【问题描述】:
前提:在子表单文本框的更新后事件期间,在两个文本框之间执行比较,一个在子表单中,一个在父表单中。进行这种比较时,会返回不合逻辑的结果。
目标:返回这两个控件中包含的值之间的合法比较。
进展:
以下代码显示了代码示例以及输出到“立即”窗口的明显非法结果。
代码:
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! 文本框。 作品。破坏了查看父文本框的目的。
- 其他一些我现在想不起来的事情,因为我太惊讶于我能打破逻辑。
文本框都是数字,应该具有可比性。为什么会这样?为什么将其中一种格式设置为“通用数字”可以解决问题?
【问题讨论】:
-
CDbl(textBurnup) > CDbl(Parent!textBurnupLimit)? -
在您的示例中 100>21500 为 True,因为它是字符串(“ascii-betical”)比较,而不是数字比较。
IsNumeric()不检查变量值是否是 数字,所以IsNumeric("100") = True即使“100”是一个字符串。如果您希望从中提取的值表现为数字,那么正确的方法是 1) 使用 IsNumeric() 检查它们是否可以安全地转换为数字类型,然后 2) 使用CDbl()、CLng()等将它们转换为 @simoco建议。 -
谢谢@TimWilliams。 100 不会出现在任何以 2 ascii-betically 使其“小于”开头的东西之前吗?将控件设置为“通用数字”是否会使它们成为双精度数/长整数(似乎比为大约 20 个表单编辑大量代码更容易)?如果您愿意,请提供答案,以便我提供甜蜜的业力。否则,baclkhawk 会得到它:P
-
已经回答了我的第二个问题。将所有文本框设置为固定或通用数字格式即可解决。
标签: vba ms-access textbox type-conversion