vba

2013-08-11 8 views
12

फ़ंक्शन करने के लिए सीमा के रूप में कक्षों के समूह को पास करता है I मुझे कोशिकाओं का समूह मिल रहा है और नीचे दिए गए कार्यों में कुछ गणना कर रहा हूं।vba

यह काम करता है अगर मैं एक सीमा पहले पैरामीटर के रूप (: संकेत के साथ) पास है, लेकिन यह सफल नहीं होता तो मैं अपनी सीमा (A1, A3, B6, B9) के रूप में कुछ कोशिकाओं चुनें। यह पहले पैरामीटर के रूप में अल्पविराम से पहले पहले सेल प्राप्त करता है। लेकिन मुझे पूरी कोशिकाएं चाहिए।

मैं क्या कर सकता हूं? (गुजर श्रेणियों के लिए तार का उपयोग कर को छोड़कर)

Function calculateIt(Sessions As Range, Customers As Range) As Single 
    ' calculate them... 
End Function 

एक बात और अधिक: यह एक पैरामीटर के रूप तिथियों के समूह पारित करने के लिए संभव है? कैसे?

+0

ParamArray के लिए एक विकल्प के रूप में, संबंध तोड़ना कोशिकाओं के अपने सेट करने के लिए एक परिभाषित किया जाता है नाम निर्दिष्ट करेंगे और उसे नाम पारित कर सकते हैं कर सकते हैं। –

उत्तर

19

जैसा लिखा है, आपका फ़ंक्शन केवल दो श्रेणियों को तर्क के रूप में स्वीकार करता है।

फ़ंक्शन में उपयोग की जाने वाली श्रेणियों की एक चर संख्या की अनुमति देने के लिए, आपको अपनी तर्क सूची में पैरामरे संस्करण संस्करण घोषित करने की आवश्यकता है। फिर, आप सरणी में प्रत्येक श्रेणी को बदले में संसाधित कर सकते हैं।

उदाहरण के लिए,

Function myAdd(Arg1 As Range, ParamArray Args2() As Variant) As Double 
    Dim elem As Variant 
    Dim i As Long 
    For Each elem In Arg1 
     myAdd = myAdd + elem.Value 
    Next elem 
    For i = LBound(Args2) To UBound(Args2) 
     For Each elem In Args2(i) 
      myAdd = myAdd + elem.Value 
     Next elem 
    Next i 
End Function 

इस समारोह तो एक से अधिक श्रेणियों जोड़ने के लिए वर्कशीट में इस्तेमाल किया जा सकता।

myAdd usage

अपने कार्य के लिए, वहाँ सवाल अवधियों में (या कोशिकाओं) कि समारोह के लिए पारित कर सकते हैं जिनमें से कर रहे हैं 'सत्र' और जो कर रहे हैं '' ग्राहक है।

निपटने का सबसे आसान मामला होगा यदि आपने तय किया कि पहली श्रेणी सत्र है और बाद की श्रेणियां ग्राहक हैं।

Function calculateIt(Sessions As Range, ParamArray Customers() As Variant) As Double 
    'This function accepts a single Sessions range and one or more Customers 
    'ranges 
    Dim i As Long 
    Dim sessElem As Variant 
    Dim custElem As Variant 
    For Each sessElem In Sessions 
     'do something with sessElem.Value, the value of each 
     'cell in the single range Sessions 
     Debug.Print "sessElem: " & sessElem.Value 
    Next sessElem 
    'loop through each of the one or more ranges in Customers() 
    For i = LBound(Customers) To UBound(Customers) 
     'loop through the cells in the range Customers(i) 
     For Each custElem In Customers(i) 
      'do something with custElem.Value, the value of 
      'each cell in the range Customers(i) 
      Debug.Print "custElem: " & custElem.Value 
     Next custElem 
    Next i 
End Function 

आप सत्र पर्वतमाला और ग्राहकों के किसी भी संख्या की सीमा के किसी भी संख्या शामिल करना चाहते हैं, तो आप एक तर्क है कि समारोह बता इतना है कि यह अलग कर सकते हैं सत्र पर्वतमाला से ग्राहकों लेकर जाएगा शामिल करना होगा।

यह तर्क उस कार्य के लिए पहला, संख्यात्मक, तर्क के रूप में स्थापित किया जा सकता है जो यह पहचान लेगा कि निम्नलिखित में से कितने तर्क सत्र हैं, शेष तर्कों के साथ ग्राहक सीमाएं हैं। समारोह के हस्ताक्षर तो होगा:

Function calculateIt(numOfSessionRanges, ParamAray Args() As Variant) 

या यह एक "गार्ड" तर्क है कि अलग करती ग्राहकों पर्वतमाला से सत्र पर्वतमाला हो सकता है। फिर, आपके कोड को यह देखने के लिए प्रत्येक तर्क का परीक्षण करना होगा कि यह गार्ड था या नहीं।

calculateIt(sessRange1,sessRange2,...,"|",custRange1,custRange2,...) 

कार्यक्रम तर्क तो की तर्ज पर हो सकता है::

Function calculateIt(ParamArray Args() As Variant) 

जैसा कॉल कुछ के साथ शायद: समारोह कैसा दिखेगा

Function calculateIt(ParamArray Args() As Variant) As Double 
    ... 
    'loop through Args 
    IsSessionArg = True 
    For i = lbound(Args) to UBound(Args) 
     'only need to check for the type of the argument 
     If TypeName(Args(i)) = "String" Then 
      IsSessionArg = False 
     ElseIf IsSessionArg Then 
      'process Args(i) as Session range 
     Else 
      'process Args(i) as Customer range 
     End if 
    Next i 
    calculateIt = <somevalue> 
End Function 
+0

धन्यवाद, लेकिन यह मेरे लिए थोड़ा अस्पष्ट है। क्या आप कृपया मुझे एक उदाहरण उपयोग दे सकते हैं? अगर मैं अपने 'myAdd' फ़ंक्शन से अपने' गणना 'समारोह के साथ मेल खाना चाहता हूं, तो' Arg1' 'सत्र' और 'Arg2' 'ग्राहक' होगा? – mrdaliri

+0

वाह! आश्चर्यजनक! एक गार्ड तर्क का उपयोग जवाब है। एक बार फिर धन्यवाद! – mrdaliri

+0

@chuff, मुझे कोई परिणाम नहीं मिला। मैंने कोड में 'स्टॉप' भी लगाया है, लेकिन * तत्काल विंडो * में कोई भी तर्क नहीं देखा जा सकता है। समारोह भी 0 देता है। कोई विचार क्या गलत है? –

5

वहाँ करने के लिए एक और तरीका है एक समारोह में एकाधिक श्रेणियां पास करें, जो मुझे लगता है कि उपयोगकर्ता के लिए बहुत साफ है।जब आप स्प्रेडशीट में अपने फ़ंक्शन को कॉल करें आप उदाहरण के लिए कोष्ठक में पर्वतमाला के प्रत्येक सेट लपेट,: calculateIt((A1,A3), (B6,B9))

ऊपर कॉल मानती है कि आपके दो सत्र A1 और A3 में हैं, और आपके दो ग्राहकों बी -6 और B9 में हैं।

यह काम करने के लिए, आपके फ़ंक्शन को इनपुट श्रेणियों में Areas में से प्रत्येक के माध्यम से लूप की आवश्यकता है। उदाहरण के लिए:

Function calculateIt(Sessions As Range, Customers As Range) As Single 

    ' check we passed the same number of areas 
    If (Sessions.Areas.Count <> Customers.Areas.Count) Then 
     calculateIt = CVErr(xlErrNA) 
     Exit Function 
    End If 

    Dim mySession, myCustomers As Range 

    ' run through each area and calculate 
    For a = 1 To Sessions.Areas.Count 

     Set mySession = Sessions.Areas(a) 
     Set myCustomers = Customers.Areas(a) 

     ' calculate them... 
    Next a 

End Function 

अच्छी बात यह है, यदि आप एक सन्निहित रेंज के रूप में अपने दोनों आदानों है, तो आप इस समारोह बस के रूप में कॉल कर सकते हैं आप एक सामान्य से एक है, उदा calculateIt(A1:A3, B6:B9)

आशा में मदद करता है :)

+0

जबकि 'पैरामरे' जाने का एक अच्छा तरीका है, यह विकल्प बहु-सेल तर्कों के लिए एक बहुत ही साफ तरीका प्रदान करता है। इसे कई और वोट मिलना चाहिए था ... –