Excel 如果x<&燃气轮机;Int(x)始终为真,即使x=Int(x)。Can';我不知道为什么

Excel 如果x<&燃气轮机;Int(x)始终为真,即使x=Int(x)。Can';我不知道为什么,excel,vba,Excel,Vba,我在编码方面相当业余,但我正在尝试用excel开发一些自动化的业务表,以使我父亲的业务生活更轻松一些。 目的是创建一个表,其范围基于userform中的数字。 代码如下:(textbox1被重命名为nParc) 专用子Cmb1\u单击() 作为变体的Dim-nP nP=UserForm1.nParc.Value 如果nP=”“,则 MsgBox“错误0” 如果不是数字(nP),则 MsgBox“错误1” 否则,如果nP不大于0,则 MsgBox“错误2” ElseIf nP Int(nP)那么

我在编码方面相当业余,但我正在尝试用excel开发一些自动化的业务表,以使我父亲的业务生活更轻松一些。 目的是创建一个表,其范围基于userform中的数字。 代码如下:(textbox1被重命名为nParc)

专用子Cmb1\u单击()
作为变体的Dim-nP
nP=UserForm1.nParc.Value
如果nP=”“,则
MsgBox“错误0”
如果不是数字(nP),则
MsgBox“错误1”
否则,如果nP不大于0,则
MsgBox“错误2”
ElseIf nP Int(nP)那么
MsgBox“错误3”
其他的
ActiveSheet.ListObjects.Add(xlSrcRange,Range(单元格(1,1).Address(),单元格(nP,14).Address()),xlYes)。Name=“业务”
如果结束
端接头
我总是很紧张

错误3

当我点击“继续”按钮时,无论发生什么。如果我删除msgbox“error 3”和后面的else,它就会工作

我已经尝试过使用
ElseIf Not nP=Int(nP)
,但问题仍然存在


非常感谢您的帮助。

您的文本框返回的是文本,而不是数字。在尝试进行任何类型的数值比较之前,最好将值强制转换为数值类型:

如果Len(nP)=0,则
MsgBox“错误0”空白字符串
出口接头
如果结束
如果不是数字(nP),则
MsgBox“错误1”不是数字
出口接头
如果结束
我们已经确定它是数字的
将测试值设置为双精度
testValue=CDbl(nP)
如果testValue Int(testValue),则
MsgBox“错误3”包含小数
出口接头
如果结束
'您还可以检查它是否是有效的行号
也就是说,它不是太大

让我详细解释一下@bigben提供的答案,并解释到底发生了什么

比较 如果使用
VarType
函数查看
np
Int(np)
的值类型,您将看到
VarType(np)=8
,即
np
是字符串,
VarType(Int(np))=5
,即
Int(np)
是双精度。由于两者都声明为变量--Int根据---返回一个变量,因此将触发末尾的特殊情况

上表中的规则有一个例外,即两个操作数都具有声明的变量类型,其中一个操作数最初具有值类型字符串,而另一个操作数最初具有数值类型。在这种情况下,数字操作数被视为小于(且不等于)字符串操作数,而不管其值如何

这就是为什么比较返回
False

数字支票 您可能想知道为什么
IsNumeric(np)=True
虽然
np
是一个字符串。这实际上是VBA标准库中的一个错误。根据,每当变量的值类型为字符串时,
IsNumeric
应返回
False
。然而,实际上,它似乎试图转换为
Double
,并返回是否成功

补救
正如@bigben已经提到的,您应该将文本框中的输入转换为另一种类型。如果您只是将
np
声明为字符串,那么它是有效的,尽管在IsNumeric检查之后分配给Double类型的变量更合适。

useform中的数字是什么?我在userform中插入的数字通常在2到5之间。它将定义表格大小,因此它始终是正的和完整的。查看当您更改为
Dim nP As String
时会发生什么。好的,显然Dim nP As String解决了它。你能给我解释一下吗,或者给我指个地方,我能解释一下为什么会这样吗?无论如何,非常感谢您的解决方案!你真的不应该做
Dim nP As String
。。。给我一些时间补充一个答案。
Private Sub Cmb1_Click()

Dim nP As Variant

    nP = UserForm1.nParc.Value

If nP = "" Then
    MsgBox "Error 0"
ElseIf Not IsNumeric(nP) Then
    MsgBox "Error 1"
ElseIf Not nP > 0 Then
    MsgBox "Error 2"
ElseIf nP <> Int(nP) Then
    MsgBox "Error 3"
Else
ActiveSheet.ListObjects.Add(xlSrcRange, Range(Cells(1, 1).Address(), Cells(nP, 14).Address()), xlYes).Name = "Business"
End If

End Sub