2013-10-26 5 views
11

मैं एक वीबीए नौसिखिया हूं, और मैं एक ऐसा फ़ंक्शन लिखने की कोशिश कर रहा हूं जिसे मैं Excel कक्ष से कॉल कर सकता हूं, जो बंद की गई कार्यपुस्तिका खोल सकता है, सेल मान देख सकता है, और इसे वापस कर सकता है।एक्सेल सेल से वीबीए फ़ंक्शन को कैसे कॉल करें?

अब तक मैं जानता हूँ कि कैसे इस तरह एक मैक्रो लिखने के लिए:

Sub OpenWorkbook() 
    Dim path As String 
    path = "C:\Users\UserName\Desktop\TestSample.xlsx" 

    Dim currentWb As Workbook 
    Set currentWb = ThisWorkbook 


    currentWb.Sheets("Sheet1").Range("A1") = OpenWorkbookToPullData(path, "B2") 
End Sub 


Function OpenWorkbookToPullData(path, cell) 

    Dim openWb As Workbook 
    Set openWb = Workbooks.Open(path, , True) 

    Dim openWs As Worksheet 
    Set openWs = openWb.Sheets("Sheet1") 

    OpenWorkbookToPullData = openWs.Range(cell) 

    openWb.Close (False) 

End Function 

मैक्रो OpenWorkbook() बिल्कुल ठीक चलाता है, लेकिन जब मैं एक एक्सेल सेल से सीधे OpenWorkbookToPullData (...) कॉल करने के लिए कोशिश कर रहा हूँ , यह काम नहीं करता है। कथन:

Set openWb = Workbooks.Open(path, , True) 

कुछ भी नहीं देता है।

क्या कोई जानता है कि इसे एक वर्किंग वीबीए फ़ंक्शन में कैसे चालू किया जाए जिसे एक्सेल सेल से बुलाया जा सके?

+3

http://www.wikihow.com/Create-a- उपयोगकर्ता- परिभाषित- समारोह- में- माइक्रोसॉफ्ट- एक्सेल रुचि का हो सकता है। – pnuts

+1

सहायता के लिए धन्यवाद। @ पनट्स मेरी समस्या हालांकि सामान्य रूप से वीबीए फ़ंक्शन लिखना नहीं है, लेकिन अधिक विशेष रूप से यहां। OpenWorkbookToPullData (...) को कॉल किया जाता है और मैं कदम उठा सकता हूं। लेकिन समस्या उस लाइन पर है जहां वर्कबुक। ओपन (...) निष्पादित किया गया है, यह कुछ भी नहीं है। उप OpenWorkbook(), जो OpenWorkbookToPullData (...) को कॉल करता है, ठीक काम करता है। – user780069

+0

धन्यवाद @ पोर्टलैंडरनर हालांकि, यह कार्य स्वयं इस अर्थ में "काम करता है" कि मैक्रो सब ओपनवर्क्सबुक() ठीक काम करता है। समस्या वास्तव में वाक्यविन्यास नहीं है। समस्या यह है कि, यदि आप एक्सेल सेल से OpenWorkbookToPullData (...) को कॉल करते हैं, तो लाइन वर्कबुक। ओपन (...) कुछ भी नहीं देता है। अगर इसे सबराउटिन से बुलाया जाता है, तो यह ठीक काम करता है। – user780069

उत्तर

1

आपके द्वारा सामना किया गया मुद्दा यह है कि UDF एस एक्सेल पर्यावरण को संशोधित नहीं कर सकता है, वे केवल कॉलिंग सेल पर एक मान वापस कर सकते हैं।

कई विकल्प

  1. नमूने के लिए दिए गए आप वास्तव में VBA की जरूरत नहीं है रहे हैं। यह फार्मूला काम
    ='C:\Users\UserName\Desktop\[TestSample.xlsx]Sheet1'!$B$2

  2. चारों ओर एक नहीं बल्कि गंदा काम का उपयोग करेगा: See this answer

  3. आप उपयोग कर सकते हैं ExecuteExcel4Macro या OLEDB

+0

@ क्रिसिसिलसन, धन्यवाद। वाक्यविन्यास = 'filepath' के साथ समस्या यह है कि कार्यपुस्तिका को खोला जाना है। लगभग 100 कार्यपुस्तिकाएं झूठ बोल रही हैं, और मैं उनमें से प्रत्येक से विशिष्ट कोशिकाओं को चाहता हूं। क्या आपके पास अन्य कामकाज हैं? मैंने ExecuteExcel4Macro को आजमाया, लेकिन यह एक्सेल सेल कॉल के तहत चलाने में असमर्थ लगता है। क्या आपके पास ओएलईडीडीबी का उपयोग कर उदाहरण है? – user780069

+0

एफवाईआई, मैं विकल्प # 2 देख रहा हूं। यह आशाजनक लगता है। क्या आपके पास इसे संशोधित करने के बारे में कोई संकेत है? मुझे पूरा यकीन नहीं है कि मैं इसे क्या करना चाहता हूं ... – user780069

+0

सूत्र विकल्प के साथ, wb _not_ को खोलने की आवश्यकता नहीं है। यही कारण है कि मैंने इसे जवाब में शामिल किया। –

0

एक समारोह काम नहीं करेगा, और न ही यह आवश्यक है:

Sub OpenWorkbook() 
    Dim r1 As Range, r2 As Range, o As Workbook 
    Set r1 = ThisWorkbook.Sheets("Sheet1").Range("A1") 
    Set o = Workbooks.Open(Filename:="C:\TestFolder\ABC.xlsx") 
    Set r2 = ActiveWorkbook.Sheets("Sheet1").Range("B2") 
    [r1] = [r2] 
    o.Close 
End Sub 
+0

धन्यवाद। मुझे पता है कि सबराउटिन कैसे लिखना है, लेकिन मुझे एक ऐसा काम चाहिए जो एक ही काम कर सके। यदि आप एक सबराउटिन लिखते हैं तो आपको पथ, सेल स्थान इत्यादि को हार्डकोड करना पड़ता है। मैं कुछ ऐसा अपडेट करने की कोशिश कर रहा हूं जो मेरे पास मौजूद 100 एक्सेल कार्यपुस्तिकाओं में से प्रत्येक से कुछ कोशिकाओं को खींच सके, और एक फ़ंक्शन है बहुत अधिक लचीला। – user780069

+0

मुझे लगता है कि आप सबसे अच्छा कर सकते हैं फाइलों, शीटनाम, और सेल पते को सरणी में स्टोर करना और लूप में मेरा जैसे कोड चलाएं .... शुभकामनाएँ! –

25

Here's the answer

चरणों का अनुसरण करें:

  1. ओपन दृश्य मूल संपादक। Excel में, Alt + F11 विंडोज पर हैं, Fn + विकल्प + F11 एक मैक पर अगर मारा।

  2. एक नया मॉड्यूल डालें। मेनू से: सम्मिलित करें -> मॉड्यूल।

  3. Public फ़ंक्शन बनाएं। उदाहरण:

    Public Function findArea(ByVal width as Double, _ 
             ByVal height as Double) As Double 
        ' Return the area 
        findArea = width * height 
    End Function 
    
  4. तो आप किसी भी अन्य समारोह की तरह किसी भी सेल में इसका इस्तेमाल करते हैं: =findArea(B12,C12)

+0

जैसे ही मैं दूसरे पैरामीटर (ऊंचाई) के लिए एक मान दर्ज करता हूं, यह मुझे मेरे सूत्र के साथ "कुछ सामान्य समस्या" के बारे में रिपोर्ट करता है और इसे सेल में संग्रहीत करने से इंकार कर देता है। दुर्भाग्यवश, यह जर्मन में रिपोर्ट करता है, इसलिए मैं यहां एक उदाहरण के रूप में पाठ प्रदान नहीं कर सकता। – Paul

+0

@ पॉल त्रुटि संदेश, संस्करण और पर्यावरण विवरण के बिना इस – FloatingRock

+2

में आगे खोदना मुश्किल है आमतौर पर मैंने सोचा कि मैं केवल निर्देशों का पालन करने से बेहतर कर सकता हूं। चरण 2 महत्वपूर्ण है! – Adam

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