У вас может быть переполнение из-за максимального целочисленного размера; тип валюты на самом деле очень хорошо подходит для больших чисел (но остерегайтесь любых региональных проблем). См. изменения ниже для обсуждения Int64.
Согласно документации MSDN на IsNumeric:
IsNumeric возвращает значение True, если тип данных Expression — Boolean, Byte, Decimal, Double, Integer, Long, SByte, Short, Single, UInteger, ULong или UShort, или объект, который содержит один из этих числовых типов. Он также возвращает True, если Expression является символом или строкой, которую можно успешно преобразовать в число.
IsNumeric возвращает False, если Expression имеет тип данных Date или тип данных Object и не содержит числового типа. IsNumeric возвращает False, если Expression является символом или строкой, которую нельзя преобразовать в число.
Поскольку вы получаете несоответствие типов, возможно, преобразованию мешает 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
person
Ryan
schedule
22.01.2009