由于最大整数大小,您可能会溢出;货币类型实际上非常适合大量数字(但要注意任何区域问题)。有关 Int64 讨论,请参阅下面的编辑。
根据IsNumeric上的 MSDN 文档:
如果 Expression 的数据类型为 Boolean、Byte、Decimal、Double、Integer、Long、SByte、Short、Single、UInteger、ULong 或 UShort,或包含其中一种数字类型的 Object,则 IsNumeric 返回 True。如果 Expression 是可以成功转换为数字的 Char 或 String,它也返回 True。
如果 Expression 的数据类型为 Date 或 Object 的数据类型并且它不包含数值类型,则 IsNumeric 返回 False。如果 Expression 是不能转换为数字的 Char 或 String,IsNumeric 将返回 False。
由于您遇到类型不匹配,因此 Double 可能会干扰转换。IsNumeric 不保证它是一个整数,只是它匹配一种数字可能性。如果数字是双精度数,则可能是区域设置(逗号与句点等)导致异常。
您可以尝试将其转换为双精度,然后再转换为整数。
' Using a couple of steps
Dim iValue As Integer
Dim dValue As Double
dValue = CDbl(SourceValue)
iValue = CInt(iValue)
' Or in one step (might make debugging harder)
iValue = CInt(CDbl(SourceValue))
编辑:在您澄清之后,您似乎正在获得溢出转换。首先尝试使用 Long 和 CLng() 而不是 CInt()。仍然有可能入口是 Int64,这在使用 VB6 时更加困难。
我已将以下代码用于 LARGE_INTEGER 和 Integer8 类型(均为 Int64),但它可能不适用于您的情况:
testValue = CCur((inputValue.HighPart * 2 ^ 32) + _
inputValue.LowPart) / CCur(-864000000000)
此示例来自LDAP 密码过期示例,但就像我说的那样,它可能适用于您的场景,也可能不适用。如果您没有 LARGE_INTEGER 类型,它看起来像:
Private Type LARGE_INTEGER
LowPart As Long
HighPart As Long
End Type
搜索 LARGE_INTEGER 和 VB6 以获取更多信息。
编辑:对于调试,暂时避免错误处理然后在通过令人不安的行后重新打开它可能很有用:
If IsNumeric(strMaxAlternatives) And strMaxAlternatives <> "" Then
On Error Resume Next
iGlobalMaxAlternatives = CInt(strMaxAlternatives)
If Err.Number <> 0 Then
Debug.Print "Conversion Error: " & strMaxAlternatives & _
" - " & Err.Description
EndIf
On Error Goto YourPreviousErrorHandler
End If