2016-02-12 2 views
5

मैंने एक यूडीएफ बनाया है जो एक ही चादर पर काम करता है। समस्या एकाधिक चादरों के साथ होती है। यदि मेरे पास एकाधिक चादरों पर सूत्र है, और यदि मैं इसे एक शीट पर लोड करता हूं, तो यह अन्य सभी चादरों में भी आउटपुट बदलता है।वीबीए यूडीएफ सभी चादरों पर मूल्य बदलता है। एक को कैसे सीमित करें?

ऐसा क्यों होता है? मैं ActiveWorksheet या सक्रिय सेल या इसी तरह का उपयोग नहीं कर रहा हूं।

Function customreturn(security As Range, datacheck As Range) As Variant 

    Dim row_num As Integer 
    Dim row_num2 As Integer 
    Dim price1 As Double 
    Dim price2 As Double 
    Dim perfo As Double 
    Dim blank_end As Boolean 

    row_num = security.Row 
    col_num = security.Column 
    row_num2 = row_num + 1 
    col_num2 = datacheck.Column 

    If WorksheetFunction.IsError(datacheck.Value) = True Then 
     customreturn = "No data" 
    Else 
     price1 = Cells(row_num, col_num).Value 

     Do While WorksheetFunction.IsError(Cells(row_num2, col_num2).Value) = True 
      row_num2 = row_num2 + 1 
     Loop 

     price2 = Cells(row_num2, col_num).Value 

     perfo = price1/price2 - 1 

     customreturn = perfo 
    End If 
End Function 
+2

यह सूत्र को पुनः लोड करता है, जिसका अर्थ है कि यह पुन: गणना करता है? या सूत्र के शीट पर डेटा का उपयोग करने के बजाय, यह सभी चादरों में समान जानकारी का पुनर्मूल्यांकन करता है, और उसी जानकारी का उपयोग करता है? (...क्या इसका कोई मतलब है?)। इसके साथ [अस्थिरता] (http://www.mrexcel.com/forum/excel-questions/271165-udf-volatile-vs-not.html) – BruceWayne

+0

1) यदि मैं एक शीट में सूत्र लोड करता हूं मैन्युअल रूप से 2) यह सभी अन्य चादरों में समान मान का उपयोग करता है - हाँ – sandboxj

+0

इसके अलावा, वर्कशीट वैरिएबल ('वर्कशीट के रूप में मंद डब्ल्यूएस', 'सेट ws = शीट्स (security.parent.name)' जोड़ने का प्रयास करें, फिर बस 'ws' जोड़ें 'सेल()' के सभी उपयोगों से पहले। यह सुनिश्चित करेगा कि शीट 'सुरक्षा' से डेटा आ रहा है। – BruceWayne

उत्तर

6

कोई माता पिता कार्यपत्रक आप उपयोग Range.Cells property तो माता-पिता कार्यपत्रक ActiveSheet property सामान्य रूप से किया जाता है तीन बार से किसी के लिए निर्दिष्ट नहीं है। इसे With ... End With statement के साथ संशोधित किया जा सकता है जो कि श्रेणी पैरामीटर 'Range.Parent property में से एक के वर्कशीट संदर्भ प्रदान करता है।

Function customreturn(security As Range, datacheck As Range) As Variant 
    Dim row_num As Long, row_num2 As Long, col_num As Long, col_num2 As Long 
    Dim price1 As Double, price2 As Double, perfo As Double 
    Dim blank_end As Boolean 

    row_num = security.Row 
    col_num = security.Column 
    row_num2 = row_num + 1 
    col_num2 = datacheck.Column 

    With security.Parent 
     If IsError(datacheck) Then 
      customreturn = "No data" 
     Else 
      price1 = .Cells(row_num, col_num).Value 

      Do While IsError(.Cells(row_num2, col_num2)) 
       row_num2 = row_num2 + 1 
      Loop 

      price2 = .Cells(row_num2, col_num).Value 

      perfo = price1/price2 - 1 

      customreturn = perfo 
     End If 
    End With 
End Function 

के साथ भीतर ... के साथ समाप्त, Cells के सभी दिखाने के लिए कि माता-पिता के साथ कार्यपत्रक में निर्दिष्ट एक ... के साथ समाप्त होता है .Cells के रूप में संदर्भ हैं।

आप स्पष्ट रूप से कार्यपत्रक के ISERROR या तुलना करने के लिए की जरूरत नहीं है VBA के IsError functionसही पर। यह पहले से ही जानता है कि यह सच है या गलत है।

यह इंगित किया गया था (धन्यवाद BruceWayne) कि आपके पास दो अविकसित चर, col_num और col_num2 थे। घोषणा क्षेत्र में प्रत्येक कोड शीट के शीर्ष पर Option Explicit ¹ जोड़कर इसे टाला जा सकता है।


स्थापना VBE के उपकरण के भीतर चर घोषणा आवश्यकता ► विकल्प ► संपादक संपत्ति पेज प्रत्येक नव निर्मित कोड चादर के शीर्ष पर Option Explicit बयान डाल देंगे ¹ । यह गलत वर्तनी की तरह गलती कोडिंग गलतियों से बचने के साथ-साथ परिवर्तनीय घोषणा में सही परिवर्तनीय प्रकार का उपयोग करने के लिए आपको प्रभावित करेगा। घोषणा के बिना ऑन-द-फ्लाई बनाया गया वेरिएंट सभी प्रकार/ऑब्जेक्ट प्रकार हैं। का उपयोग कर विकल्प स्पष्ट व्यापक रूप से 'सर्वोत्तम अभ्यास' माना जाता है।

+1

तो मैं शीट को स्पष्ट करने का सुझाव देते समय कुछ पर था? हाँ! मुझे जानना अच्छा लगा' यूडीएफ में सही रास्ते पर मी (मैं अभी भी उन्हें सीख रहा हूं)। अच्छा स्पष्टीकरण! (एफवाईआई कुछ अविकसित चर, 'col_num' और' col_num2') हैं। मैं वीबीए में कभी भी 'विकल्प स्पष्टीकरण' जोड़ने की सलाह दूंगा – BruceWayne

+1

हां, ऐसा लगता है कि इस मुद्दे पर मैं सबसे अच्छा मुद्दा बता सकता हूं; ओपी पुष्टि कर सकता है। अब- एक दिन, हर बार जब मैं 'सेल' देखता हूं और नहीं '.ल्स' अलार्म घंटी मेरे सिर में चली जाती है। – Jeeped

+1

... और अविकसित वर्रों को नोट करने के लिए धन्यवाद; मैंने इसे प्रतिबिंबित करने के लिए अपने उत्तर में संशोधन किया है। – Jeeped

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