닫기

मैं किसी अन्य सरणी सूत्र द्वारा लौटाए गए प्रत्येक मान पर एक सरणी सूत्र कैसे लागू कर सकता हूं?

image

मैं माइक्रोसॉफ्ट 365 का उपयोग कर रहा हूं और 2डी तालिका प्राप्त करने के लिए एक्सेल में ऐरे फॉर्मूले - एक को दूसरे के आउटपुट पर - क्रमिक रूप से लागू करने का एक तरीका ढूंढना चाहता हूं।

विशेष रूप से, मैं कैप्चर के साथ एक रेगेक्स लागू करना चाहता हूं उपयोगकर्ता द्वारा प्रदत्त पाठ के ब्लॉक में समूह। एक आदर्श दुनिया में REGEXEXTRACT() एक 2D सरणी लौटाएगा जहां प्रत्येक पंक्ति एक मैच से मेल खाती है, और प्रत्येक कॉलम एक कैप्चर समूह से मेल खाता है। हालाँकि, REGEXEXTRACT() वर्तमान में केवल रिटर्न देता है (रिटर्न_मोड तर्क का उपयोग करके) या तो एक 1D सरणी जिसमें पहले मैच के कैप्चर समूह होते हैं, या एक 1D सरणी जिसमें प्रत्येक मैच पूर्ण होता है (कैप्चर समूहों का कोई हिसाब नहीं)।

तो मैंने जो समाधान योजना बनाई थी वह REGEXEXTRACT() से सभी मैचों को आउटपुट करने के लिए दूसरे विकल्प का उपयोग करना था, फिर उन्हें TRANSPOSE() करना था ताकि वे लंबवत रूप से चल सकें। अगले कॉलम में एक दूसरा REGEXEXTRACT(), उसी रेगेक्स को लागू करते हुए, प्रत्येक मैच पर काम करेगा और कैप्चर समूहों को क्षैतिज रूप से आउटपुट करेगा।

दुर्भाग्य से, हालांकि 1) पहला REGEXEXTRACT() ठीक काम करता है 2) दूसरा REGEXEXTRACT() पहले से प्रत्येक पंक्ति आउटपुट पर मैन्युअल रूप से लागू होने पर ठीक काम करता है, मैं कितनी भी पंक्तियों के लिए सूत्र को सफलतापूर्वक स्वचालित रूप से दोहराने का कोई तरीका नहीं ढूंढ पाया हूं। यदि मैं स्पिल्ड रेंज ऑपरेटर # का उपयोग करता हूं, हालांकि सूत्र तब लंबवत रूप से फैलता है, यह क्षैतिज रूप से कुछ भी आउटपुट नहीं करता है, जिसका अर्थ है कि केवल पहला कैप्चर समूह वापस आ जाता है।

यहां दो REGEXEXTRACT() सूत्रों को दिखाने वाला एक सरल उदाहरण दिया गया है पहली पंक्ति के लिए काम करना:



यहां एक उदाहरण दिया गया है जो दिखाता है कि स्पिल क्षैतिज और लंबवत दोनों तरह से काम नहीं कर रहा है:



मुझे यकीन है कि ऐसा हो सकता है VBA में किया गया लेकिन मैं उस रास्ते पर नहीं जाना पसंद करूंगा। मुझे लगता है कि कुछ सरल चीज़ है जो मुझसे छूट रही है - क्या ऐसा है?

एक्सेल में सरणी प्रसंस्करण की एक ज्ञात (और अच्छी तरह से उचित) सीमा है जिसे अक्सर "सरणी-सरणी सीमा" के रूप में वर्णित किया जाता है।

इस सीमा के आसपास काम करने के कई तरीके हैं। शायद सबसे आम में से एक तथाकथित कम/vstack पैटर्न है।

मोटे तौर पर कहें तो, हम इनपुट सरणी पर पुनरावृति करने के लिए REDUCE का उपयोग करते हैं और इसके LAMBDA के भीतर, हम प्रत्येक इनपुट को संसाधित करने के परिणामों को जमा करने के लिए VSTACK का उपयोग करते हैं पंक्ति।

मान लीजिए कि मेरे पास B3:B4 में आपका उदाहरण डेटा और एक अन्य पंक्ति है (यह प्रदर्शित करने के लिए कि यह कई पंक्तियों पर काम करेगी), तो यह सूत्र लौटाता है परिणाम:



चूंकि आपकी समस्या इस पैटर्न को दो बार लागू करने की है (पहले एकल सेल की विभाजित रेखाओं को संसाधित करने के लिए, फिर इनपुट कॉलम में प्रत्येक सेल को संसाधित करने के लिए), आपकी रुचि इसमें हो सकती है STACKER नामक एक LAMBDA फ़ंक्शन का उपयोग करना, जिसे मैंने सामान्य मामले में इस पैटर्न को लागू करने के लिए लिखा था।

STACKER फ़ंक्शंस को एक्सेल लैब्स में उन्नत फॉर्मूला वातावरण में आयात करने के बाद:



आपको अपनी एक पंक्ति को हल करने के लिए केवल एक फ़ंक्शन को परिभाषित करने की आवश्यकता है इनपुट:



और फिर आपकी समस्या को हल करने का सूत्र सरल हो जाता है:



=VSTACKER(SPLITDIMENSIONS)(VSTACKER(SPLITLINES)(B3: बी4))

यदि आप STACKER के बारे में अधिक जानना चाहते हैं, तो आप इस वीडियो और इस अनुवर्ती वीडियो की समीक्षा कर सकते हैं।

STACKER का उपयोग करने का लाभ आप हैं पैटर्न को लागू करने के लिए सिंटैक्स को याद रखने की आवश्यकता नहीं है - आप बस अपने इनपुट की एक पंक्ति को संसाधित करने के लिए एक फ़ंक्शन को परिभाषित करते हैं और फिर ऐसे इनपुट की एक सरणी को संसाधित करने के लिए इसे STACKER के साथ लपेटते हैं।

संपादित करें:

एक पंक्ति को संसाधित करने के लिए, आप इस सूत्र का उपयोग कर सकते हैं:

EDIT2:

मैं केवल यह नोट करना चाहता हूं कि इस विशिष्ट समस्या के लिए जब केवल 1 सेल को विभाजित करने की आवश्यकता होती है, तो सबसे सरल उत्तर वास्तव में TEXTSPLIT है। मैंने उसके लिए एक अलग उत्तर पोस्ट किया है।

एक्सेल 365 के साथ, आप पायथन फ़ंक्शन का भी उपयोग कर सकते हैं।

आपके मामले में यह बहुत सरल समाधान प्रतीत होता है:

[ cell.split("x") for cell in xl("B2").splitlines()]



आपने मेरे अन्य अधिक सामान्य उत्तर पर एक टिप्पणी में उल्लेख किया है कि आपको केवल इसकी आवश्यकता है इसे एकल कक्ष पर लागू करें. उस स्थिति में, संभवतः सबसे आसान तरीका यह है:

जहां "x" कॉलम सीमांकक है और CHAR(10), जो एक लाइन फ़ीड का प्रतिनिधित्व करता है, पंक्ति सीमांकक है।
AI에게 물어보기
#1 #2 #3 #4 #5 #6 #7 #8 #9 #10 #11 #12 #13 #14 #15 #16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31 #32 #33 #34 #35 #36 #37 #38 #39 #40 #41 #42 #43 #44 #45 #46 #47 #48 #49 #50 #51 #52 #53 #54 #55 #56 #57 #58 #59 #60 #61 #62 #63 #64 #65 #66 #67 #68 #69 #70 #1 #2 #3 #4 #5 #6 #7 #8 #9 #10 #11 #12 #13 #14 #15 #16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31 #32 #33 #34 #35 #36 #38 #39 #41 #42 #43 #44 #45 #46 #47 #48 #49 #50 #51 #53 #56 #58 #60 #62 #63 #67 #68 #70
어플전용 할인코드 호텔 8% 할인
선착순 마감 [아고다]
AGODADEAL8
클릭하면 자동복사
전세계 호텔 15% 할인코드
선착순 마감 [아고다]
AGODASPONSORED
클릭하면 자동복사