VBS数值常数不适用于> =循环

时间:2017-03-27 14:32:14

标签: vbscript

我遇到了一个奇怪的问题(恕我直言),这可能只是突出了我对VBS与其他编程语言的无知。这是我在.VBS文件顶部的内容。

Option Explicit
Const MAXROWSFOREXCEL2010 = 1048576

然后我在循环中进行以下条件检查:

If numLines >= MAXROWSFOREXCEL2010 Then
   wscript.echo "Inside the numLines If Then Statement"
   wscript.echo "numLines = " & numLines & " >= " & MAXROWSFOREXCEL2010

例如,假设numLines等于107563,这显然小于分配给MAXROWSFOREXCEL2010作为上述全局const的100万以上的值。

无论出于何种原因,即使numLines明显小于const,也会执行IF语句。

但是,如果我在比较中删除了const的使用,只需将MAXROWSFOREXCEL2010的硬编码值放入循环中,例如:

If numLines >= 1048576 Then
   wscript.echo "Inside the numLines If Then Statement"
   wscript.echo "numLines = " & numLines & " >= " & MAXROWSFOREXCEL2010

然后未正确输入IF语句。

有人能告诉我为什么会这样吗?我应该以某种方式将const声明为特定的数据类型吗?是否存在某种截断const的问题?

2 个答案:

答案 0 :(得分:2)

我会inclined to suggest问题是numLines不是数字而不是Const值存在问题,在这种情况下,此问题可以解决问题。

  

A:VBScript implicit conversion in IF statement different from variable to literals?来自@cheran-shunmugavel
  记录的行为是,在比较中,数字总是小于字符串。这在Comparison Operators的文档中提到。释义页面底部附近的表格:

     

如果 一个表达式是数字,另一个是字符串,数字表达式小于字符串表达式。

考虑到这一点,您只需要确保变量numLines使用显式强制转换显式为数值。

'Explicitly cast variable to Long
numLines = CLng(numLines)

答案 1 :(得分:0)

好的,我相信正在发生的事情是VBS尝试确定数据类型的方式的一个怪癖。我还认为您numLines变量被评估为String

您可以Wscript.Echo TypeName(numLines)进行验证。当我将numLines设置为"107563"而不是107563时,我可以复制您的问题。

如果VBS中的值为“盒装”,则在const MAXROWSFOREXCEL2010的情况下,引擎将尝试以不同的方式执行比较操作。在这种情况下,因为numLines是字符串,所以比较是针对盒装变量,它会尝试进行(按位)字符串比较。如果numLines是一个字符串,并且比较是针对显式的Integer,那么比较将作为(按位)整数比较完成。

如果numLinesInteger,则不会发生此问题。

以下是一些例子:

strOne = "1"
intOne = 1
If "1" = 1 Then WScript.Echo "true" Else WScript.Echo "false"
If "1" = intOne Then WScript.Echo "true" Else wscript.Echo "false"
If strOne = 1 Then WScript.Echo "true" Else wscript.Echo "false"
If strOne = intOne Then WScript.Echo "true" Else wscript.Echo "false"

输出

true
true
true
false