Этот пост о возвращении значений .NET NaN и Inifinite обратно в Excel 2010 VBA.
Я использую метод C # не под моим контролем, который (по-видимому) может возвращать .NET NaN или Neg, Pos Infinity. Результаты в VBA странные (т. Е. Более странные, чем обычно), и единственный способ, которым я смог придумать, чтобы справиться с ситуацией, - это сложное сравнение трех строк «-1. # IND» или «-1. # INF». или "1. # INF".
Есть ли лучший способ?
Я задокументировал странную часть здесь, если вам любопытно. (Примеры для NaN, но это же история для pos или neg infinity.)
double dVal = CSharpMethodReturningDouble() ' via .NET assembly / COM interop
variant vVal = CSharpMethodReturningDouble() ' via .NET assembly / COM interop
Если метод C # возвращает double.NaN, то имеем (в окне immed):
?dVal
-1.#IND
?vVal
-1.#IND
(в штучной упаковке) вариант, содержащий NaN-тесты, положительные для числовых, тип = double
?IsNumeric(vVal)
True
?TypeName(vVal)
Double
Сравнение работы (в штучной упаковке) варианта NaN, но с противоположными результатами, которые вы ожидаете.
Сравнения по (без коробки) двойным числам вызывают исключения переполнения
?vVal=1 '<== NaN comparisons should always return false
True
?vVal=0 '<== that's not what you get with -1.#IND
True
?dVal=0 '<== strangely, the same comparison on the unboxed double fails
(OverFlow Exc)
Операции над вариантом (в штучной упаковке) вызывают исключения переполнения
Операции над (без коробки) удваивают работу (и возвращают -1. # IND, как и ожидалось)
?vVal * 1.1 '<== even stranger, for arith ops its the boxed value that fails
(Overflow Exc)
?dVal * 1.1 '<== but the operation on the unboxed double goes through
-1.#IND
IsError, IsNumeric не помогает:
?IsError(vVal)
False
?IsError(dVal)
False
?IsNumeric(vVal)
True
?IsNumeric(dVal)
True
Всегда можно использовать сравнение строк для проверки:
?vVal = "-1.#IND"
True
?dVal = "-1.#IND"
True