2011-10-18 18 views
8

क्या सेल वर्कशीट फ़ंक्शन में प्रारंभिक सरणी से छोटे आकार के एक्सेल में सरणी प्राप्त करने का कोई तरीका है?वर्कशीट फ़ंक्शन में सरणी से सरणी कैसे निकालें?

तो अगर मैं था:

{23, "", 34, 46, "", "16"} 

मैं को रखना होगा:

{23, 34, 46, 16} 

जो मैं तो कुछ अन्य समारोह के साथ हेरफेर कर सकते हैं।

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

=IFERROR(INDEX($A$1:$A$6, SMALL(IF(($A$1:$A$6<>""),ROW($A$1:$A$6)),ROW(1:6))),"") 

जो सरणी सूत्र (CTRL-SHIFT-ENTER) के रूप में दर्ज किया जाना चाहिए। यदि प्रदर्शित किया जा रहा है तो परिणामस्वरूप परिणाम को परिणाम देने के लिए कम से कम एक क्षेत्र में प्रवेश किया जाना चाहिए।

+2

मैं यह कहने जा रहा हूं कि यूडीएफ के बिना यह संभव नहीं है। अगर कोई मुझे गलत साबित करता है तो मैं बहुत खुश हूं। – Excellll

+0

महान सवाल। मैं इसे कुछ चरम फॉर्मूला लोगों को ध्वजांकित करूंगा, लेकिन मैं इस – brettdj

+0

@ एक्सेलसेल पर एक्सेल के साथ सहमत हूं - एक संभावित फॉर्मूला विविधता नीचे शामिल है जिसे एसयूएम() जैसे कार्यों के अंदर भी इस्तेमाल किया जा सकता है। –

उत्तर

5

यदि सब आप क्या करना चाहते एक सरणी, के एक सबसेट हड़पने है और आप पहले से ही इच्छित तत्वों के पदों को पता है, तो आप सिर्फ INDEX सूचकांक तर्क के लिए एक सरणी के साथ उपयोग कर सकते हैं। यह है:

=INDEX({11,22,33,44,55},{2,3,5}) 

{22,33,55} देता है। लेकिन आमतौर पर यह बहुत उपयोगी नहीं होता है क्योंकि आप पदों को नहीं जानते हैं, और मुझे यूडीएफ के बिना उन्हें पाने का कोई तरीका नहीं है।

मैं इन-कार्यपत्रक सरणी निस्पंदन के इस प्रकार के लिए क्या किया निम्नलिखित फार्म के साथ एक यूडीएफ लिखने के लिए:

'Filters an input sequence based on a second "comb" sequence. 
'Non-False-equivalent, non-error values in the comb represent the positions of elements 
'to be kept. 
Public Function combSeq(seqToComb, seqOfCombValues) 

    'various library calls to work with 1xn or nx1 arrays or ranges as well as 1-D arrays 

    'iterate the "comb" and collect positions of keeper elements 

    'create a new array of the right length and copy in the keeper elements 

End Function 

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

तुम इतनी तरह इस तरह के एक यूडीएफ फोन चाहते हैं:

=combSeq({23, "", 34, 46, "", "16"}, {23, "", 34, 46, "", "16"} <> "") 

या

=combSeq(Q1:Q42, SIN(Z1:Z42) > 0.5) 

और एक्सेल के सामान्य सरणी यांत्रिकी का उपयोग करें "कंघी" उत्पन्न करने के लिए। यह अधिक हल्के, एक्सेल-फ्रेंडली तरीका है जो अधिक मानक filter(list-to-filter, test-function) फ़ंक्शन के कई लाभ प्राप्त करने के लिए है जो आप अन्य प्रोग्रामिंग सिस्टम में देख सकते हैं।

मैं "कंघी" नाम का उपयोग करता हूं क्योंकि "फ़िल्टर" आमतौर पर "इस फ़ंक्शन के साथ फ़िल्टर" का अर्थ है, और एक्सेल के साथ आपको निस्पंदन फ़ंक्शन को कॉल करने से पहले परीक्षण फ़ंक्शन को लागू करना होगा। इसके अलावा एक "कंघी" को मध्यवर्ती परिणाम के रूप में गणना करने के लिए उपयोगी हो सकता है और फिर इसे ... er, comb ... एकाधिक सूचियों का उपयोग करें।

+0

मुझे लगता था कि इन लाइनों के साथ कुछ होना होगा। पूर्ण उत्तर के लिए धन्यवाद। –

+0

@jtolle, मैं चाहता हूं कि आपका INDEX ({11,22,33,44,55}, {2,3,5}) समाधान काम करता है, लेकिन मेरे लिए यह केवल पहला मान देता है, 22. यह एक सरणी नहीं देता है । क्या आपने सत्यापित किया है कि यह काम करता है? क्या मैं इसे गलत कर रहा हूँ? thx –

+0

@johnywhy, क्या आपने इसे "Ctrl-Shift-Enter" के साथ एक सरणी सूत्र के रूप में दर्ज किया है? आपको एक श्रेणी भी चुननी होगी जो सरणी को वापस करने के लिए काफी बड़ी है, या यह केवल उतनी ही प्रदर्शित होगी जितनी कमरे के लिए है। इस बारे में अधिक जानकारी के लिए "एक्सेल सरणी सूत्र" पर एक खोज करें। – jtolle

5

इस साइट पर एक उत्तर है: http://www.mrexcel.com/forum/showthread.php?t=112002। यद्यपि ज्यादा स्पष्टीकरण नहीं है।

मान लें कि आपके पास कॉलम ए पर रिक्त कक्षों के साथ डेटा है और आप इसे कॉलम बी में डालते हैं; पंक्ति ($ B $ 1) सिर्फ एक चाल दे देंगे कि है -

  • पंक्ति(): कि कारतूस

    =INDEX( $A$1:$A$6, 
         SMALL( 
          IF(
           ($A$2:$A$6<>""), 
           ROW($A$2:$A$6) 
          ), 
         ROW()-ROW($B$1) 
         ) 
        ) 
    

    यहाँ स्पष्टीकरण लंघन है उसी क्रम में डेटा पुनः प्राप्त होगा आप एक incrementing संख्या (बी 1 में यानी 1, 2 बी 2 में ...)

  • IF (..., पंक्ति ($ A $ 2: $ A $ 6)) चाल का मुख्य हिस्सा है: यह पंक्ति एन की एक सरणी बनाता है umbers जहां अगर हालत सच है (ध्यान दें कि यदि कोई 'शेष' मान है)
  • छोटे (..) (दसवीं अरिक्त की संख्या कि सरणी के दसवीं सबसे छोटा मान वापस आ जाएगी हमारे मामले में पंक्ति), जहां X वर्तमान सेल की पंक्ति संख्या (बी 1 में 1 है ...)
  • सूचकांक तो अपने मूल्य के लिए पंक्ति संख्या से अनुवाद कर देगा
  • ध्यान दें कि सूचकांक और ROW शुरू एक पंक्ति वास्तविक तालिका के ऊपर हमेशा एक ऑफसेट की है> 0 (शून्य सूचकांक पसंद नहीं करता है)
+0

पंक्ति() - ROW ($ B $ 1) को ROWS ($ B $ 1: B1) के रूप में भी लिखा जा सकता है।एक और चाल, एक ही नौकरी – PPC

+0

अच्छा! अगर केवल एक्सेल फिल्टर में निर्मित समारोह के कुछ प्रकार को शामिल किया जाएगा, सूत्र जिमनास्टिक इस तरह की आवश्यक नहीं होगा ... – jtolle

+0

@jtolle: कुछ मामलों में आप मैक्रो के रूप में अपने कस्टम सूत्रों जोड़ सकते हैं। "कुछ मामलों में", मेरा मतलब है "अगर आपके ग्राहक" – PPC

1

एक संभावित कार्यपत्रक समारोह समाधान:

=INDEX(A1:A6,N(IF(1,MODE.MULT(IF(A1:A6<>"",ROW(1:6)*{1,1}))))) 

MODE.MULT समारोह का एक कम सरणी देता है सूचकांक और N(IF(1,.)) डाला गया है ताकि सरणी द्वारा INDEX फ़ंक्शन पर पारित हो।

+0

यह बहुत दिलचस्प लग रहा है। अब तक एक मुद्दा यह है कि इसे मेरे IFERROR कथन में लपेटने के लिए, मेरे समाधान के INDEX की तरह, मुझे अभी भी रिक्त स्थान पर # एन/ए त्रुटियां मिलती हैं। मैं निश्चित रूप से एक अच्छा स्पष्टीकरण प्यार करता हूं कि यह निर्माण कैसे काम कर रहा है, एक लिंक ठीक होगा। –

+0

सरणी के लिए कई कक्षों के ऊपर दर्ज हो सकता है इस तरह का प्रयास करें: 'IFERROR (यदि (1, )," ")'। ।: Http: 'एक्सेल" N (यदि (1, "' कुछ लिंक देता है, लेकिन मैं यह सही व्यवहार के लिए एक अच्छा विवरण नहीं मिला है, चीनी पदों में से कुछ का अनुवाद भी कुछ अतिरिक्त जानकारी दे सकता है –

+0

यह भी देख के लिए Googling //www.mrexcel.com/forum/excel-questions/904661-returning-sub-arrays-using-index.html –