Возможно, вы переполнены из-за максимального целочисленного размера; тип валюты на самом деле очень хорошо подходит для больших чисел (но остерегайтесь любых региональных проблем). См. Правки ниже для обсуждения Int64.
Согласно документации MSDN на IsNumeric :
IsNumeric возвращает True, если данные
тип выражения - логическое, байт,
Десятичный, Двойной, Целый, Длинный,
SByte, Short, Single, UInteger,
ULong, или UShort, или объект, который
содержит один из этих числовых типов.
Он также возвращает True, если Expression
Char или String, которые могут быть
успешно преобразован в число.
IsNumeric возвращает False, если выражение
имеет тип данных Дата или типа данных
Объект, и он не содержит
числовой тип. IsNumeric возвращает False
если Expression - это Char или String
который не может быть преобразован в число.
Поскольку вы получаете несоответствие типов, возможно, двойник мешает преобразованию. 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