2012-02-09 12 views
28

में अनंतता और उससे परे के लिए यह पोस्ट .NET NaN के & के बारे में है अनंत मूल्यों को Excel 2010 VBA पर वापस भेज दिया जा रहा है।वीबीए

मैं अपने नियंत्रण में नहीं एक सी # विधि का उपयोग करता हूं जो (स्पष्ट रूप से) .NET NaN या Neg, Pos Infinity वापस कर सकता है। वीबीए में परिणाम अजीब हैं (यानी सामान्य से कमजोर), और एकमात्र तरीका जिस तरह से मैं सुरक्षित रूप से स्थिति से निपटने के लिए आया हूं वह एक अनूठा ट्रिपल-स्ट्रिंग तुलना है "-1। # IND" या "-1। # आईएनएफ" या "1. # आईएनएफ"।

क्या कोई बेहतर तरीका है?

यदि आप उत्सुक हैं तो मैंने यहां अजीब हिस्सा दस्तावेज किया है। (उदाहरण NaN लिए कर रहे हैं, लेकिन यह स्थिति या neg अनंत के लिए एक ही कहानी है।)

double dVal = CSharpMethodReturningDouble() ' via .NET assembly/COM interop 
variant vVal = CSharpMethodReturningDouble() ' via .NET assembly/COM interop 

सी # विधि देता है, तो एक double.NaN, तो हम (immed विंडो में) है:

?dVal    
-1.#IND    
?vVal     
-1.#IND    

(बॉक्स्ड) वेरिएंट NaN पकड़े सांख्यिक, प्रकार के लिए सकारात्मक परीक्षण = डबल (बॉक्स्ड) वेरिएंट NaN काम पर

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

तुलना, लेकिन विपरीत परिणामों के साथ आप उम्मीद थी। (अनबॉक्स्ड) युगल पर तुलना (, और वापसी -1। # आईएनडी की उम्मीद के रूप में) (बॉक्स्ड) वेरिएंट कारण अतिप्रवाह अपवाद पर (अनबॉक्स्ड) संचालन काम दोगुना हो जाता है पर अतिप्रवाह अपवाद

?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) 

संचालन कारण

?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

उत्तर

2

चूंकि एक डबल.NAN फ़ील्ड एक मान का प्रतिनिधित्व करता है जो संख्या नहीं है, तो आप एक स्ट्रिंग तुलना का उपयोग कर सही रास्ते पर हैं।

यदि आप दूसरी तरफ जा रहे थे (यानी, वीबी से मूल्यों को पारित करना), ByRef और ByVal सामान्य संदिग्ध हैं।

वीबी का IsNumeric() फ़ंक्शन हमेशा सहज नहीं होता है। उदाहरण के लिए, यदि यह अल्फान्यूमेरिक कोड होता है, तो मौका से, वैज्ञानिक नोटेशन में एक संख्या होने पर यह सही हो जाएगा।

1

मैं डेविड से सहमत हूं कि आपका वर्तमान कार्यप्रणाली स्वीकार्य है। यद्यपि विदेशी भाषा इंस्टॉल पर परीक्षण करना सुनिश्चित करें!

उदाहरण है कि आप समाधान का हिस्सा हो सकते हैं: एक मान जो 1 और 0 के बराबर है, एक सामान्य संख्या नहीं है। वह परीक्षण सामान्य संख्या से नाएन को अलग कर सकता है। संभवतः आप +/- अनंतता खोजने के लिए इस तरह के समान नियम पा सकते हैं।

0

सुनिश्चित करें कि आप वर्तमान लोकेल खाते में ध्यान दें। दशमलव विभाजक सेटिंग्स के आधार पर NaN "-1.#IND" या "-1,#IND" हो सकता है।

एक तरीका यह से बचने के लिए InStr तुलना हो सकती है:

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