2012-06-28 11 views
5

में सरणी तर्क पारित करने के लिए ऐरे आकार सीमाएं एक्सेल-वीबीए 2007 में तर्क के रूप में पारित सरणी के आकार पर 64k सीमा होती है।वीबीए

क्या किसी को किसी फिक्स या काम के बारे में पता है?

Public Function funA(n) 
    Dim ar() 
    ReDim ar(n) 
    funA = ar 
End Function 

Public Function funB(x) 
    funB = UBound(x) 
End Function 

एक्सेल से::

कोड यह

=funB(funA(2^16-1)) '65536 as expected 

=funB(funA(2^16)) 'Gives a #VALUE 

अंदर देख रहे हैं, Funa() ठीक काम करता है लेकिन, funB को पारित कर दिया, तर्क एक्स एक त्रुटि 2015

+1

यहां कुछ पृष्ठभूमि [एक्सेल 2007 वर्कशीट फ़ंक्शन में अधिकतम ऐरे आकार?] (Http://windowssecrets.com/forums/showthread.php/128704-Max-Array-size-in-Excel-2007-Worksheet-Function)। आपको वास्तव में यूडीएफ के साथ क्या करने की ज़रूरत है? यह हमारे सुझावों का मार्गदर्शन करेगा। – brettdj

+0

संदर्भ समस्या के एक प्रकार की तरह दिखता है। मुझे udf के साथ क्या करने की ज़रूरत है, जो आप देखते हैं वह बहुत अधिक है, सिवाय इसके कि सरणी संख्याओं (नमूना वितरण) से भर जाएगी और funB इसके साथ मजेदार और रोमांचक चीजें करता है। –

उत्तर

2
है

यह एक काम के करीब के रूप में लगता है जैसा कि मैं पा सकता हूं। अंतर-समारोह VBA

से कॉल करते हैं

यदि आप कुछ इस तरह

Public Function funBA(n As Variant) As Variant 
    funBA = funB(funA(n)) 
End Function 

यह काम करने के लिए लगता है बनाने के लिए एन = 2^24 = 2^8^3 (किसी भी तरह नहीं दिखता है जो VBA में डेटा प्रकार को तोड़ने बिंदु जो जहां लटका अप है, लेकिन यह एक बहुत बड़ी सरणी)

+0

यी-हा! उसने ऐसा किया। अच्छा पकड़ा। –

1

यह एक VBA मुद्दा नहीं है क्योंकि आप इस चलाने के लिए और कोई त्रुटि

Public Sub test() 

    x = funB(funA(2^16 - 1)) 
    y = funB(funA(2^16)) 

    Debug.Print x; y 

End Sub 

यह प्रतीत हो रहा है प्राप्त कर सकते हैं इसे पारित करने वाला एक मुद्दा एक्सेल पर वापस - अधिक दस्तावेज नहीं है लेकिन यह एक्सेल सीमा प्रतीत होता है।

यहाँ एक और कड़ी है, लेकिन कोई समाधान WorksheetFunction array size limit

और एक अन्य http://answers.microsoft.com/en-us/office/forum/office_2007-excel/passing-arrays-to-excel-worksheet-functions-in/56d76732-9a15-4fd2-9cad-41263a4045d4

3

मुझे लगता है कि यह स्प्रैडशीट सेल में ही, बल्कि VBA से की एक सीमा है। एक्सेल कार्यों के बीच 2^16 से बड़ा सरणी पास कर सकता है, लेकिन जाहिर है कि इसमें सेल के उस आकार की सरणी नहीं हो सकती है।

एक प्रयोग के रूप में, सेल सूत्र में funA(2^16) को हाइलाइट करें और F9 दबाएं - यह आपको '#VALUE!' त्रुटि देगा।

क्योंकि सूत्र पहले से ही funA का परिणाम की गणना की है इससे पहले कि यह funB शुरू की, यह तो एक समारोह है कि पहले से ही एक त्रुटि के गणना पर funB को चलाने के लिए कोशिश कर रहा है।

ऐसा लगता है कि एक ब्रैड ने पोस्ट किया है (यानी एक तीसरा फ़ंक्शन जो funB(funA(n)) की गणना करता है) गणना को पूरा होने तक सेल को समीकरण से बाहर रखता है, इसलिए यह ठीक काम करता है।

+0

मैं इसे वापस लेता हूं। यह वीबीई में ठीक काम करता है - मुझे नहीं पता कि पहली बार मैंने कोशिश क्यों की। –

2

क्योंकि कॉलम की एक पंक्ति के रूप में एकल-आयामी सरणी एक्सेल को वापस भेज दी जाती है, आपने कॉलम की संख्या (64K) पर एक्सेल 2007 सीमा को मारा है।

आप अपने सरणी करते हैं तो 2 आयामी और पंक्तियों के रूप में वापसी यह काम करना चाहिए:

Public Function funA(n) 
    Dim ar() 
    ReDim ar(n,1) 
    funA = ar 
End Function 

वैकल्पिक रूप से आप एक स्तंभ के लिए एक पंक्ति से सरणी बारी बारी से करने पक्षांतरित उपयोग कर सकते हैं, लेकिन यह शायद बनाने की तुलना में कम कुशल है पहली जगह में 2-आयामी सरणी।

+1

ए 2-डी कॉलम सरणी मंद (एन, 1) वास्तव में मूल कोड का उपयोग करता है और यह बिल्कुल वही लक्षण प्रदर्शित करता है। उदाहरण को सरल बनाने के लिए मैंने इसे एक आयाम में गिरा दिया। शायद मुझे नहीं होना चाहिए। –

+0

आप वीबीए फ़ंक्शन के लिए सही हैं। यह सी एक्सएलएल फ़ंक्शन के साथ नहीं होता है, इसलिए ऐसा लगता है कि बग कोड में है जो VBA संस्करण एरे को Excel कक्षों में वापस परिवर्तित करता है: इसे बड़े ग्रिड के लिए अपडेट नहीं किया गया है। –