【问题标题】:VBA Textbox comparisons providing illogical resultsVBA 文本框比较提供不合逻辑的结果
【发布时间】: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! 文本框。 作品。破坏了查看父文本框的目的。
  • 其他一些我现在想不起来的事情,因为我太惊讶于我能打破逻辑。

文本框都是数字,应该具有可比性。为什么会这样?为什么将其中一种格式设置为“通用数字”可以解决问题?

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

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

【问题讨论】:

  • 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


【解决方案1】:

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

不过,其中有一个皱纹......

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

我猜你观察到的结果是因为你在第二个值上有一个前导空格:如果不是这样,它就不可能评估为 True...

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

IsNumeric("100") = True 

即使“100”是一个字符串。

如果您希望从中提取的值表现为数字,那么正确的方法是

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

2) 使用CDbl()CLng() 等按照@simoco 的建议进行转换。

【讨论】:

    【解决方案2】:

    "CDbl(textBurnup) > CDbl(Parent!textBurnupLimit)?" - 西莫科

    “在您的示例中,100>21500 为 True,因为它是一个字符串(“ascii-betical”)比较,而不是数字比较。IsNumeric() 不检查变量值是否为数字,所以 @987654323 @ 即使 "100" 是一个字符串。如果您希望从中提取的值表现为数字,那么正确的方法是 1) 使用 IsNumeric() 检查它们是否可以安全地转换为数字类型,然后 2) 使用 CDbl(), CLng() 等按照@simoco 的建议进行转换” - Tim Williams

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      相关资源
      最近更新 更多