由于最大整数大小,您可能会发生溢出;货币类型实际上对于大量数字来说效果很好(但要注意任何区域问题)。请参阅下面的编辑以了解 Int64 讨论。
根据 MSDN 文档是数字 http://msdn.microsoft.com/en-us/library/6cd3f6w1.aspx:
如果数据为 IsNumeric,则返回 True
表达式的类型为布尔型、字节型、
小数、双精度、整数、长整型、
SByte、短整型、单个、UInteger、
ULong,或 UShort,或一个对象
包含这些数字类型之一。
如果表达式是,它也会返回 True
一个字符或字符串可以是
成功转换为数字。
IsNumeric 如果表达式返回 False
数据类型为 Date 或数据类型
对象并且它不包含
数字类型。 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 密码过期示例 http://support.microsoft.com/kb/323750,但就像我说的,它可能会也可能不会在您的场景中起作用。如果你没有 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