2012-04-24 22 views
7

में ऐरे फ़ंक्शन मेरे पास वीबीए में एक फ़ंक्शन है जो तारों की एक सरणी उत्पन्न करता है। यह एक और वीबीए समारोह से बुलाया जाने पर ठीक काम करता है, लेकिन जब वर्कशीट से नहीं कहा जाता है।एक्सेल वीबीए

यह ऐसे इस्तेमाल किया जाना चाहिए:

  • चयन A1: A3
  • सूत्र बार =Test() में लिखने, तो Ctrl-Shift-Enter मारा यह एक सरणी समारोह
  • A1 A शामिल करना चाहिए बनाने के लिए, A2 चाहिए B, और ए 3 में C

जब मैं वास्तव में यह कोशिश करता हूं, तो पु सरणी के सभी तीन कोशिकाओं में टी A। मैं सरणी की विभिन्न कोशिकाओं में Test द्वारा वापस लौटा डेटा कैसे प्राप्त कर सकता हूं?


उन लोगों के लिए जो इसे देखना चाहते हैं, यहां फ़ंक्शन का कोड है। ध्यान रखें, फ़ंक्शन ठीक काम करता है जब अन्य कार्यों से बुलाया जाता है।

Function Test() As String() 
    Dim a(1 To 3) As String 
    a(1) = "A" 
    a(2) = "B" 
    a(3) = "C" 
    Test = a 
End Function 

उत्तर

8

यदि आप डेटा को ट्रांसफर करते हैं तो आप ठीक काम करते हैं। ऐसा करने के लिए, आप Variant() बजाय String() की जरूरत है:

Function Test() As Variant() 
    Dim a(1 To 3) As Variant 
    a(1) = "A" 
    a(2) = "B" 
    a(3) = "C" 
    Test = Application.Transpose(a) 
End Function 
+1

मुझे नहीं पता था कि सरणी की डिफ़ॉल्ट दिशा दाईं ओर दाईं ओर थी। – Joe

+0

दुर्भाग्य से, एक्सेल को या तो क्षैतिज या लंबवत सरणी भरने के लिए एक सरल स्वचालित तरीका प्रतीत नहीं होता है। हालांकि, वहां कुछ चाल हो सकती हैं। –

+0

यूप, जैसा कि @andy होलाडे बताते हैं, चिप पियरसन ने क्षैतिज/ऊर्ध्वाधर दुविधा को भी समझ लिया है। –

0

बस पता लगा समस्या - एक सरणी VBA से एक्सेल में जाने का पहला आयाम क्षैतिज, ऊर्ध्वाधर नहीं है। Test के आउटपुट को देखने के लिए, ए 1: सी 1 (ए 1: ए 3 नहीं) में सरणी फ़ंक्शन =Test() डालें।

+0

चार्ल्स विलियम्स से एक के ऊपर एक सा भ्रामक है के साथ संयोजन में इस उत्तर पढ़ना जरूरत नहीं है, हालांकि दोनों सही हैं। एक 1 डी वीबीए सरणी एक्सेल को एक पंक्ति के रूप में पास की जाती है (जैसा कि मूल परीक्षण यूडीएफ में देखा गया है)। कॉलम में पहले आयाम के साथ एक 2 डी वीबीए सरणी पारित की जाती है (जैसा कि चार्ल्स द्वारा पोस्ट किए गए टेस्ट यूडीएफ में देखा गया है)। –

4

आप Chip Pearson's advice on returning an array from a UDF जांच करना चाह सकते।

यह मेरी पहली प्रतिक्रिया है। मुझे उम्मीद है कि यह अनुचित नहीं है।

+0

चिप पियरसन की साइट का संदर्भ देना कभी गलत नहीं है। कम से कम मुझे उम्मीद नहीं है, क्योंकि मैं इसे हर समय करता हूं! +1 –

3

मैं इसे सरल हमेशा 2-आयामी सरणी के साथ काम करने लगता है, तो आप स्थानांतरित आदि

Function Test() As String() 
    Dim a(1 To 3, 1) As String 
    a(1, 1) = "A" 
    a(2, 1) = "B" 
    a(3, 1) = "C" 
    Test = a 
End Function