Vbscript VBS数值常量不在>;=循环的比较

Vbscript VBS数值常量不在>;=循环的比较,vbscript,Vbscript,我遇到了一个奇怪的问题(IMHO),这可能只是突出了我对VBS和其他编程语言的无知。下面是我在.VBS文件顶部的内容 Option Explicit Const MAXROWSFOREXCEL2010 = 1048576 然后在循环中进行以下条件检查: If numLines >= MAXROWSFOREXCEL2010 Then wscript.echo "Inside the numLines If Then Statement" wscript.echo "numLin

我遇到了一个奇怪的问题(IMHO),这可能只是突出了我对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的100多万个值

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

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

If numLines >= 1048576 Then
   wscript.echo "Inside the numLines If Then Statement"
   wscript.echo "numLines = " & numLines & " >= " & MAXROWSFOREXCEL2010
则IF语句输入不正确


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

好的,我认为这是VBS试图确定数据类型的一种奇怪方式。我还相信您是
numLines
变量,它被评估为
String

您可以执行
Wscript.Echo TypeName(numLines)
来验证这一点。当我将
numLines
设置为
“107563”
而不是
107563
时,我可以复制您的问题

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

如果
numLines
是一个
整数
,则不会发生此问题

以下是更多的例子:

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
问题是
numLines
不是数字,而不是
Const
值有问题,在这种情况下,这个问题回答了问题


记录的行为是,在比较中,数字总是小于字符串。在的文档中提到了这一点。改写本页底部的表格:

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

记住这一点,您只需使用显式转换确保变量
numLines
显式为数值

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

@JNevill为什么这会得到一个投票?VBScript是无类型的,所有内容都是变体或其子类型。说真的,有多少人不知道VBScript、VBA和VB之间的区别希望你能否决这些评论…@Lankymart请原谅。我误解了这个问题。我将删除该评论。你可能想删除或重写你讨厌的反问句。尽管如此,这仍然让人感觉OP可能正在运行字典排序。@SliderJeff,基于字典排序假设(这是一个很大的假设),可能会尝试
If numLines>=(0+MAXROWSFOREXCEL2010)
查看该变量是否强制在此上下文中充当数字。@Lankymart这可能是个问题,因为我没有明确地将numLines类型定义为数字类型。我会这样做,让你知道会发生什么。谢谢是的,我的numLines似乎被视为一个字符串,因此当我执行'result=VarType(numLines)'时,结果值等于8是的,就像,在这种情况下,它是重复的。@Langstrom对不起,你能解释一下“装箱”的评论吗?有没有一种方法可以迫使numline被视为LONG,以及const被视为LONG,从而使比较成为真正的算术比较?对不起,我对这件事一无所知。也许我需要执行CLng(numLines)?@SliderJeff这正是你应该做的。是的,这很有效。作为参考,numLines实际上是一个函数返回的值,该函数计算CSV文件中的行数。我只是使用CLng(numLines)转换作为返回函数值之前的最后一步,现在比较都很好。谢谢你们的帮助,伙计们!谢谢正如我在下面所说的,我在返回函数的返回值之前做了这件事,该函数实际计算并将行数返回到numline中。再次感谢你的帮助!