2009-08-31 9 views
9

एक्सेस में वीबीए में अधिकतम अधिकतम (x, y) फ़ंक्शन गणितीय अधिकतम दो या दो से अधिक मानों को खोजने के लिए एक सरल Max(x,y) फ़ंक्शन का अभाव है। मैं पहले से ही बेस एपीआई जैसे कि पीआरएल/पीएचपी/रूबी/पायथन इत्यादि से आने वाले बेस एपीआई में ऐसा फ़ंक्शन रखने का आदी हूं।एक्सेस

मुझे पता है कि यह किया जा सकता है: IIf(x > y, x,y)। क्या कोई अन्य समाधान उपलब्ध है?

उत्तर

7

मैं सवाल व्याख्या पढ़ने के लिए होगी:

एक Access में एक समारोह है कि संख्या की एक सरणी के अधिकतम/न्यूनतम रिटर्न कैसे लागू करता है? यहाँ कोड मैं का उपयोग करें (IIf साथ नाम "आइमैक्स" सादृश्य द्वारा, यानी, "तत्काल तो"/"तत्काल मैक्स"):

Public Function iMax(ParamArray p()) As Variant 
    ' Idea from Trevor Best in Usenet MessageID [email protected] 
    Dim i As Long 
    Dim v As Variant 

    v = p(LBound(p)) 
    For i = LBound(p) + 1 To UBound(p) 
     If v < p(i) Then 
     v = p(i) 
     End If 
    Next 
    iMax = v 
    End Function 

    Public Function iMin(ParamArray p()) As Variant 
    ' Idea from Trevor Best in Usenet MessageID [email protected] 
    Dim i As Long 
    Dim v As Variant 

    v = p(LBound(p)) 
    For i = LBound(p) + 1 To UBound(p) 
     If v > p(i) Then 
     v = p(i) 
     End If 
    Next 
    iMin = v 
    End Function 

क्यों पहुँच इसे लागू नहीं होगा करने के लिए के रूप में, यह एक बहुत ही आम है चीज की ज़रूरत है, मुझे लगता है। यह या तो बहुत "डेटाबेस" नहीं है। डोमेन पर और पंक्तियों के सेट में अधिकतम/न्यूनतम खोजने के लिए आपको पहले से ही आवश्यक सभी कार्य मिल चुके हैं। इसे लागू करने के लिए भी बहुत मुश्किल नहीं है, या केवल एक बार तुलना के रूप में कोड की आवश्यकता है जब आपको इसकी आवश्यकता हो।

शायद उपर्युक्त किसी की मदद करेगा।

+1

प्रश्न के एक साल बाद नीचे वोटों की तुलना में यह अधिक उपयोगी है। :) – DGM

+2

मुझे आश्चर्य है कि यह जल्द ही उत्तर नहीं मिला, यह देखते हुए कि समस्या कितनी छोटी है।शायद ऐसा इसलिए है क्योंकि सवाल टकराव था (यानी, बुडमाउथिंग एक्सेस) ताकि लोगों को जो जवाब पता था, वे भी किसी ऐसे व्यक्ति की मदद करने के लिए परेशान हो गए थे, जो उसके कंधे पर चिप का कुछ लगता है। –

+1

आप समझते हैं कि क्यों एक डेटाबेस विकास उपकरण में ऐसा कोई फ़ंक्शन नहीं बनाया गया है, है ना? इस तरह के एक समारोह से डेटाबेस से संबंधित बहुत अधिक चूक हैं। –

1

क्योंकि उन्होंने शायद सोचा था कि आप डीएमएक्स और डीएमआईएन या एसक्यूएल MAX का उपयोग करेंगे और केवल डेटाबेस में उपयोग के साथ काम करेंगे?

मैं भी इस बारे में उत्सुक क्यों हूं .. ऐसा लगता है कि यह एक टेम्पल-टेबल बनाने और तालिका में फॉर्म मान जोड़ने के लिए एक ओवरकिल जैसा लगता है और फिर परिणाम प्राप्त करने के लिए तालिका पर एक DMAX या MAX-query चलाता है ...

+0

हाँ, और मेरे द्वारा उपयोग किए जाने वाले मान डेटाबेस में हैं, लेकिन एक ही पंक्ति के दो कॉलम में हैं। यह सिर्फ एक अधिकतम मैक्स नहीं है, बल्कि एक साधारण गणितीय मैक्स है। – DGM

1

मुझे इनसे निपटने के लिए केवल एक छोटा projMax() फ़ंक्शन बनाने के लिए जाना जाता है। ऐसा नहीं है कि वीबीए शायद कभी बढ़ाया जाएगा, लेकिन अगर वे कभी भी उचित मैक्स (और न्यूनतम) फ़ंक्शन जोड़ते हैं, तो यह मेरे कार्यों के साथ संघर्ष नहीं करेगा। बीटीडब्लू, मूल पोस्टर आईआईएफ करने का सुझाव देता है ... यह काम करता है, लेकिन मेरे काम में, मैं आमतौर पर फ़ंक्शन को बर्बाद करने से रोकने के लिए कुछ Nz() को फेंक देता हूं।

1

मुझे डीआईजीएम के आईआईएफ कथन और डेविड के फोर/नेक्स्ट लूप का उपयोग पसंद आया, इसलिए मैं उन्हें एक साथ जोड़ रहा हूं।

क्योंकि एक्सेस में वीबीए में सख्त प्रकार की जांच नहीं है, इसलिए मैं सभी संख्याओं, पूर्णांक और दशमलव को संरक्षित करने के लिए विविधता का उपयोग कर रहा हूं, और वापसी मूल्य को दोबारा टाइप कर सकता हूं।

मेरे पैरामीटर सत्यापन को पकड़ने के लिए हंसअप के लिए कुडोस :)
टिप्पणियां कोड को और अधिक मित्रवत बनाने के लिए जोड़ा गया।

Option Compare Database 
Option Base 0 
Option Explicit 

Function f_var_Min(ParamArray NumericItems()) As Variant 
If UBound(NumericItems) = -1 Then Exit Function ' No parameters 
Dim vVal As Variant, vNumeric As Variant 
vVal = NumericItems(0) 
For Each vNumeric In NumericItems 
    vVal = IIf(vNumeric < vVal, vNumeric, vVal) ' Keep smaller of 2 values 
Next 
f_var_Min = vVal ' Return final value 
End Function 

Function f_var_Max(ParamArray NumericItems()) As Variant 
If UBound(NumericItems) = -1 Then Exit Function ' No parameters 
Dim vVal As Variant, vNumeric As Variant 
vVal = NumericItems(0) 
For Each vNumeric In NumericItems 
    vVal = IIf(vNumeric < vVal, vVal, vNumeric) ' Keep larger of 2 values 
Next 
f_var_Max = vVal ' Return final value 
End Function 

2 कार्यों के बीच एकमात्र अंतर आईआईएफ कथन में vVal और vNumeric का क्रम है।
प्रत्येक खंड के लिए लूपिंग और सरणी सीमाओं को जांचने के लिए आंतरिक वीबीए तर्क का उपयोग करता है, जबकि "बेस 0" सरणी सूचकांक 0

+1

'इस्नुल (न्यूमेरिक इटम्स)' कभी भी 'सत्य' नहीं होगा। यदि आप कोई तर्क के साथ बुलाए जाने पर फ़ंक्शन से बाहर निकलना चाहते थे, तो 'यूबाउंड (न्यूमेरिक इटम्स) = -1' – HansUp

+0

अच्छी आंख की जांच करने का प्रयास करें, कुछ नमूना डेटा पर आपके सुझावों का उपयोग किया और यह विज्ञापन के रूप में काम किया, इसे जारी रखें! – CoveGeek

0

दोनों कार्यों में नल के साथ समस्याएं होती हैं। मुझे लगता है कि यह बेहतर होगा।

Public Function iMin(ParamArray p()) As Variant 
    Dim vVal As Variant, vMinVal As Variant 

    vMinVal = Null 
    For Each vVal In p 
    If Not IsNull(vVal) And (IsNull(vMinVal) Or (vVal < vMinVal)) Then _ 
     vMinVal = vVal 
    Next 

    iMin = vMinVal 
End Function 
0

आप पहुँच VBA भीतर Worksheetfunction.max() या worksheetfunction.min() कर सकते हैं। उम्मीद है की यह मदद करेगा।