2010-03-11 9 views
21

में सूत्र में एक त्रुटि आप =ISERR(A1) या =ISERROR(A1)यदि एक सेल एक एक्सेल सूत्र में सी #

उपयोग कर सकते हैं एक VBA मैक्रो में है कैसे पता है कि तुम IsError(sheet.Cells(1, 1))

उपयोग कर सकते हैं लेकिन एक VSTO Excel ऐड परियोजना का उपयोग करने के मुझे माइक्रोसॉफ्ट.ऑफिस.इंटरोप.एक्ससेल एपीआई के तहत समान कार्य नहीं मिला। मैं केवल यह जानना चाहता हूं कि सेल में कोई त्रुटि है या नहीं, मुझे वास्तव में त्रुटि के प्रकार में रूचि नहीं है।

मेरे वर्तमान workaround सभी मौजूदा त्रुटि संदेश के लिए यह करने के लिए है .:

if (((Range)sheet.Cells[1, 1]).Text == "#N/A" || ...) 

वहाँ यह करने के लिए एक बेहतर तरीका है। क्या इसके लिए एपीआई में कोई आसान काम है?

+0

'(शीट। कैल्स [1,1] रेंज के रूप में) .क्स्ट' बेहतर दिखता है। –

+0

यह बेहतर दिखता है लेकिन अगर किसी कारण से सेल [1,1] प्रकार रेंज नहीं है तो हमारे पास अमान्य कैस्टेक्सप्शन के बजाय एक NullReferenceException होगा। मैं इस मामले में पठनीयता सुधारने की तुलना में अधिक सटीक अपवाद प्रकार प्राप्त करना पसंद करता हूं। – Pascal

उत्तर

12

आप WorksheetFunction विधि का उपयोग कर सकते हैं:

Globals.ThisAddIn.Application.WorksheetFunction.IsErr(...) 

या

[Your Excel Object].WorksheetFunction.IsErr(...) 

IsErr शब्दार्थ Excel वर्कशीट समारोह, बजाय केवल वास्तविक मूल्य में कक्ष संदर्भ पास करने के लिए समान है - AFAIK ।

+2

त्वरित नोट: 'वर्कशीटफंक्शन। आईएसईआरआर' डिजाइन द्वारा # एन/ए मानों के लिए झूठी वापसी करेगा। इसलिए, इस दृष्टिकोण का उपयोग करने के लिए, किसी को 'वर्कशीटफंक्शन.इसर त्रुटि' का उपयोग करना चाहिए। यदि आपको * विशेष * सीवीआरआरआर मान लेने की आवश्यकता है, तो आप 'वर्कशीटफंक्शन.इएसएनए' का उपयोग करके # एन/ए मान ले सकते हैं, लेकिन किसी अन्य विशेष सीवीआरआर प्रकार के लिए, आपको उस दृष्टिकोण का उपयोग करना होगा जिसे मैंने रेखांकित किया है नीचे। –

+0

स्पष्टीकरण के लिए धन्यवाद, माइक! – code4life

+0

किसी कारण से वर्कशीटफंक्शन। आईएसरर() मेरे लिए काम नहीं करता है, लेकिन दूसरा समाधान ('Int32' के लिए परीक्षण) काम करता है। – earcam

58

.NET में CVErr मानों से निपटना एक बहुत ही मुश्किल विषय है। समस्या यह है कि .NET (सही ढंग से) CVErr को त्रुटि प्रबंधन के संबंध में अप्रचलित मानता है। CVErr मान, हालांकि, अभी भी एक्सेल कोशिकाओं में उपयोग किए जाते हैं, इसलिए यह Excel स्वचालन के लिए एक बड़ा बड़ा चूक है।

सौभाग्य से, एक कामकाज है। सीवीआरआर मूल्यों की जांच करने का तरीका सेल द्वारा आयोजित डेटा प्रकार की जांच करना है। यदि आयोजित मूल्य को इंटीजर (इंट 32) के रूप में टाइप किया जाता है तो आयोजित मूल्य एक सीवीआरआरआर होता है। (ध्यान दें कि सेल में आयोजित संख्यात्मक मान सामान्य रूप से डबल के रूप में टाइप किए जाते हैं, केवल सीवीएआर मान इंटीजर के रूप में आ सकते हैं।)

सीवीआरआरआर मूल्य के परीक्षण के लिए, सबसे सरल स्तर पर, आपको बस इतना करना है कि आपको बस इतना करना है निम्नलिखित समारोह का उपयोग करें:

bool IsXLCVErr(object obj) 
{ 
    return obj is Int32; 
} 

आप एक विशिष्ट CVErr मूल्य के लिए जाँच करने के लिए की जरूरत है (जैसे, # N/A), तो आप पहले सुनिश्चित करें कि डेटा प्रकार एक पूर्णांक (Int32) है बनाने के लिए जाँच करेगा और फिर इस तालिका के अनुसार सेल द्वारा आयोजित विशिष्ट मान की जांच करें:

  • -2146826281 = # DIV/0!
  • -2146826246 = # N/A
  • -2146826245 = #GETTING_DATA
  • -2146826259 = #NAME?
  • -2146826288 = #NULL!
  • -2146826252 = #NUM!
  • -2146826265 = #REF!
  • -2146826273 = #VALUE!

उदाहरण के लिए, अपने कोड ऐसा दिखाई दे सकता:

enum CVErrEnum : Int32 
{ 
    ErrDiv0 = -2146826281, 
    ErrGettingData = -2146826245, 
    ErrNA = -2146826246, 
    ErrName = -2146826259, 
    ErrNull = -2146826288, 
    ErrNum = -2146826252, 
    ErrRef = -2146826265, 
    ErrValue = -2146826273 
} 

bool IsXLCVErr(object obj) 
{ 
    return (obj) is Int32; 
} 

bool IsXLCVErr(object obj, CVErrEnum whichError) 
{ 
    return (obj is Int32) && ((Int32)obj == (Int32)whichError); 
} 

मैं कुछ साल पहले इस पर एक विस्तृत दो भाग लेख लिखा था:

लेख VB.NET के लिए लिखे गए हैं, लेकिन सिद्धांत बिल्कुल सी # के समान हैं। आपको अनुवाद करने में कोई परेशानी नहीं होनी चाहिए, लेकिन अगर आपको कोई समस्या है, तो कृपया पूछें। (कुछ दिन मुझे उम्मीद है कि इस आलेख को सी # के लिए अपडेट करने का समय होगा। यदि यह किसी बिंदु पर होता है, तो मैं एक लिंक शामिल करने के लिए पोस्ट संपादित करूंगा।)

आशा है कि इससे मदद मिलती है!

+10

इस तरह का उत्तर है जो लोगों को चाहता है कि एसओ 'एक दिवसीय सुपर-अपवोट' सुविधा – AakashM

+0

धन्यवाद माइक यह वह जानकारी है जिसे मैं पूरे दिन ढूंढ रहा हूं। पंक्तियों की एक अजीब संख्या वापस आ रही थी और महसूस नहीं किया था कि वीबीए एक सीवीईआरआर के साथ अलग-अलग सीनेट के साथ कोशिकाओं का इलाज करता है (जो सिर्फ उन्हें एक इंट मान के रूप में मानता है। –

+0

खुशी हुई इससे मदद मिली! जब मैंने पहली बार कुछ साल पहले इस समस्या पर मारा, तो यह वास्तव में मुझे एक लूप के लिए खटखटाया। यह हल करने के लिए एक असंभव असंभव समस्या है। इसलिए एक बार जब मुझे पता चला कि इसे कैसे संभालना है, तो मुझे बस इसे लिखना पड़ा। –

संबंधित मुद्दे