我遇到了一个奇怪的问题(恕我直言),这可能只是突出了我对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的问题?
答案 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
,那么比较将作为(按位)整数比较完成。
如果numLines
是Integer
,则不会发生此问题。
以下是一些例子:
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