2010-10-13 8 views
6

मेरे पास वीबीए (जो एक्सेल 2007 वर्कबुक में रहता है) में निम्न कोड है:.NET में वीबीए फ़ंक्शन से रिटर्न वैल्यू एक्सेस करें?

Public Function Multiply(a As Double, b As Double) As Double 
    Multiply = a * b 
End Function 

अगर मैं अन्य वीबीए कोड से गुणा करता हूं, तो यह सही मान देता है। हालांकि, जब मैं सी #:

var excel = new Application {Visible = true}; 
excel.Workbooks.Open(filename); 
var returned = excel.Run("Sheet1.Multiply", (Double) a, (Double) b); 

से गुणा करता हूं ... गुणा होता है (मैं वीबीए में मल्टीप्ली फ़ंक्शन में ट्रेसिंग जोड़कर इसे सत्यापित कर सकता हूं) लेकिन लौटाया गया मूल्य मेरे सी # कोड में उपलब्ध नहीं है ; returned हमेशा null है।

क्या कोई मुझे बता सकता है कि मेरे सी # कोड से गुणा करने के वापसी मूल्य पर कैसे पहुंचे?

+0

मैं सेल के मान को वापसी मूल्य पर सेट करने और सी # से उस सेल के मान को पढ़ने के लिए मल्टीप्ली() को संशोधित करके इस पर काम करने में सक्षम हूं। बदसूरत लेकिन यह काम करता है। –

+0

कोई विचार यह मॉड्यूल से क्यों काम करता है लेकिन चादर से नहीं? – anakic

+0

कोई भी मुझे डर नहीं है। मैंने वास्तव में 2011 से माइक्रोसॉफ्ट सामान पर कोई महत्वपूर्ण काम नहीं किया है, इसलिए शायद यह अन-उत्तर देने जा रहा है जब तक कि कोई और मदद नहीं कर सकता ... –

उत्तर

4

आप Excel (नहीं एक पत्रक मॉड्यूल) में एक नियमित रूप से मॉड्यूल के लिए अपने कार्य चलती की कोशिश की है?

+0

मैंने एक नया मॉड्यूल बनाया, उस पर फ़ंक्शन को स्थानांतरित कर दिया, और "शीट 1। मल्टीप्ली" को "MyModule.Multiply" में बदल दिया। पूरी तरह से काम किया, धन्यवाद :-) सिर्फ एक प्रश्न: क्या यह अनुभव के माध्यम से प्राप्त एक अंतर्दृष्टि थी, या वास्तव में यह कहीं दस्तावेज है? एमएसडीएन इत्यादि की जानकारी वीबीए को कॉल करने के लिए काफी स्पैस है। इंटरॉप। –

+0

@ डंककेनबेन 'शीट 1' एक * ऑब्जेक्ट *, एक 'वर्कशीट' वर्ग का * उदाहरण * है। किसी वर्ग के सदस्यों में कॉल करने के लिए, आपको एक उदाहरण की आवश्यकता है - और 'शीट 1' इंस्टेंस केवल वीबीए रनटाइम में रहता है, नेट इसे नहीं देखता है। मानक मॉड्यूल केवल यही हैं: सार्वजनिक सदस्यों के माध्यम से निष्पादन योग्य कोड का खुलासा करने वाले प्रक्रियात्मक मॉड्यूल; आपको इसके सदस्यों को कॉल करने के लिए * तत्काल * करने की आवश्यकता नहीं है (आप वैसे भी नहीं कर सकते)। यही कारण है कि यह 'मॉड्यूल 1' में काम करता है और 'शीट 1' में नहीं। –

-4

अपने गुणा समारोह को संशोधित करने के लिए नीचे दिए गए कोड की तरह बनना का प्रयास करें:

Public Function Multiply(a As Double, b As Double) As Double 
    return a * b 
End Function 
+0

यह वैध वीबीए भी नहीं है। देखें: http://office.microsoft.com/en-in/excel-help/create-custom-functions-in-excel-2007-HA010218996.aspx –

+1

आप वीबीए में रिटर्न कीवर्ड का उपयोग नहीं कर सकते - आपको इसकी आवश्यकता है फ़ंक्शन नाम को फ़ंक्शन नाम पर सेट करें गुणा = ए * बी, जो मूल प्रश्न में था। – Jazza

+0

यह वीबी.Net है, वीबीए नहीं। – Icemanind

0

एक साधारण उदाहरण:

परीक्षण spreadsheet.xlsmModule1 है युक्त

Public Function test() As String 
    test = "hello 1234" 
End Function 

objExcel पहले से ही स्प्रेडशीट के लिए सेट के साथ ...

Dim result = objExcel.Run("Module1.test") 
MsgBox(result) 

... पॉप-अप संदेश में hello 1234 का उत्पादन करता है।

क्योंकि मैं मूल रूप से ? module1.test()(सफलतापूर्वक) VBA तत्काल विंडो में के साथ इस परीक्षण किया था, मैं शुरू में objExcel.Run("Module1.test()") काम करने के लिए प्राप्त करने के लिए कोशिश कर रहा था - लेकिन मैं एक त्रुटि हो रही थी: Cannot run the macro .... The macro may not be available in this workbook or all macros may be disabled. - हटाने के कोष्ठक चाल किया था।