2012-02-09 76 views
28

這篇文章是關於.NET NaN的& Inifinite值傳遞迴Excel 2010 VBA。在VBA中無限擴展

我使用的C#方法不在我的控制之下(顯然)可以返回.NET NaN或Neg,Pos Infinity。在VBA中的結果是奇怪的(即比平常更奇怪),我想出的安全處理這種情況的唯一方法是不合理的三串比較「-1。#IND」或「-1。#INF」或「1.#INF」。

有沒有更好的方法?

如果您好奇,我已經記錄了這裏的怪異部分。 (例子是NaN的,但它是正或負無窮大,同樣的故事。)

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的測試呈陽性的數字,類型=雙上(盒裝)的變體NaN的工作

?IsNumeric(vVal) 
True 
?TypeName(vVal) 
Double 

比較,但相反的結果,你會期望。在(無盒裝)雙打 比較導致溢出異常

?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 
+4

參見:http://stackoverflow.com/q/2731445/50776 – casperOne 2012-02-09 02:42:57

回答

2

由於Double.NAN字段表示的值不是一個數字,您很有可能會使用字符串比較正確的軌道上。

如果您採用其他方式(即將值從VB中傳遞出去),則ByRef和ByVal是常見的嫌疑犯。

VB的IsNumeric()函數並不總是直觀的。例如,如果字母數字代碼偶然出現在科學記數法中,它將返回True。

1

我同意David的觀點,您目前的解決方法是可以接受的。請務必測試外語安裝!

你給出的例子可能是解決方案的一部分:同時等於1和0的值不是正常數字。該測試可以將NaN與正常數字區分開來。可能你可以找到類似的規則來找到+/-無窮大。

0

請確保您考慮當前的區域設置。 根據小數點分隔符設置,NaN可以是"-1.#IND""-1,#IND"。爲了避免這種

一種方式可以是InStr函數比較:

InStr(CStr(dVal), "#IND") <> 0