2015-11-28 8 views
8

धारण करने वाले कक्षों की एक श्रृंखला में अंतिम खाली खाली पंक्ति खोजें, मैं सूत्रों को रखने वाले कक्षों की एक श्रृंखला में अंतिम पंक्ति कैसे प्राप्त कर सकता हूं, जहां सूत्र का परिणाम वास्तविक मान है और खाली नहीं है?फॉर्मूला

एक सरल तरीके से कहो कोशिकाओं ("E1:E10") की सीमा का मानना ​​है कि एक सूत्र A10 के माध्यम से कोशिकाओं A1 की चर्चा करते हुए के रूप में पालन =IF("A1"="","","A1")। लेकिन केवल ए 1 के माध्यम से ए 1 के पास एक मूल्य भरा हुआ है, इसलिए ई 7 से ई 10 के लिए सूत्र के परिणाम खाली हो जाएंगे।

साथ यह करने के लिए कोशिश कर रहा है: lastRow में

lastRow = ActiveSheet.Range("E" & Rows.Count).End(xlUp).Row 

परिणाम 10 का मूल्य हो रही है। मैं जो चाहता हूं वह इस उदाहरण में 0Rहोने के लिए अंतिम पंक्ति के मान के लिए है।

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

उत्तर

6

मुझे लगता है कि और अधिक सुरुचिपूर्ण तरीके से @D_Bester द्वारा प्रदान किया गया कक्षों की श्रृंखला के माध्यम से पाशन के बिना find() विकल्प का उपयोग करने के लिए है:

Sub test() 
    Dim cl As Range, i& 
    Set cl = Range("E1:E" & Cells(Rows.Count, "E").End(xlUp).Row) 
    i = cl.Find("*", , xlValues, , xlByRows, xlPrevious).Row 
    Debug.Print "Last row with data: " & i 
End Sub 

परीक्षण

enter image description here

इसके अलावा, अधिक कम उपरोक्त प्रदान किए गए कोड का संस्करण है:

Sub test2() 
    Debug.Print [E:E].Find("*", , xlValues, , xlByRows, xlPrevious).Row 
End Sub 
+2

श्रेणी के साथ लूपिंग लूपिंग हाँ यह बहुत ही सुरुचिपूर्ण है! धन्यवाद @ Vasily – Rosetta

+0

बहुत अच्छा काम करता है और मैं जो भी ढूंढ रहा था उससे ज्यादा था। मेरे पास सिर्फ एक प्रश्न है, परिवर्तनीय 'i' की घोषणा में एम्परैंड' & 'का अर्थ क्या है? (जैसा कि यह एम्पर्सेंड के बिना ही काम करता है) – Pascale

+2

@ पास्कले का मतलब है 'मैं जितना लंबा हूं', यदि आप '&' को हटा देंगे तो 'i' को 'वेरिएंट' घोषित किया जाएगा। यह कोडिंग का सिर्फ एक लघुरूप तरीका है, उदा। '%' 'इंटीजर' है,' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' है निर्दिष्ट 'Variant' – Vasily

2

यह मदद करनी चाहिए आप (sheet1 Sheet1 पर स्तंभ A में) एक सूत्र वाले अंतिम पंक्ति का निर्धारण:

lastRow = Split(Split(Sheet1.Range("A:A").SpecialCells(xlCellTypeFormulas).Address, ",")(UBound(Split(Sheet1.Range("A:A").SpecialCells(xlCellTypeFormulas).Address, ","))), "$")(2) 

SpecialCells सभी एक सूत्र वाले कक्षों की श्रृंखला निर्धारित करने के लिए प्रयोग किया जाता है। इस श्रेणी को Split का उपयोग करके पार्स किया गया है। Ubound के साथ इन अंतिम कोशिकाओं को पुनर्प्राप्त किया जा रहा है। परिणाम पंक्ति संख्या निकालने के लिए फिर से विभाजित किया जा रहा है।

+0

मैंने आपके कोड को लागू करने का प्रयास किया लेकिन यह पहली पंक्ति को इसमें सूत्र बना रहा है। (मेरी शीट में रेंज पंक्ति 3 से पंक्ति 26 तक है और आपका अंतिम पंक्ति 3 लौटाता है: जब मैं इसे मैगबॉक्स के साथ प्रिंट करता हूं, जब मुझे उम्मीद है कि यह 21 हो) मुझे यकीन नहीं है कि मुझे समायोजित करने की आवश्यकता है या भले ही यह एक अच्छा दृष्टिकोण है ।आप कहते हैं "यह आपको फॉर्मूला युक्त अंतिम पंक्ति निर्धारित करने में मदद कर सकता है" लेकिन मुझे अंतिम सूत्र की आवश्यकता है जिसमें सूत्र है जिसमें उस सूत्र का परिणाम "खाली स्ट्रिंग" नहीं है। क्षमा करें अगर मैंने आपके उत्तर को गलत समझा लेकिन मुझे वीबीए के साथ कोई अनुभव नहीं है, इसलिए मैं पूरी तरह से स्टैक ओवरफ्लो पर जो कुछ ढूंढता हूं उस पर भरोसा कर रहा हूं। – Pascale

+2

@ राल्फ पता पता संपत्ति 255-वर्ण स्ट्रिंग तक सीमित है, और इसलिए सूत्रों वाले सभी क्षेत्रों में शामिल नहीं हो सकता है। – shg

5

आप उस कॉलम में अंतिम सेल ढूंढना चाहते हैं जो खाली नहीं है और एक खाली स्ट्रिंग ("") नहीं है।

बस एक गैर-खाली सेल के लिए लूप जांच के साथ LastRow का पालन करें।

lastrow = ActiveSheet.Range("E" & ActiveSheet.Rows.Count).End(xlUp).Row 
Do 
    If ActiveSheet.Cells(lastrow, 5).Value <> "" Then 
     Exit Do 
    End If 
    lastrow = lastrow - 1 
Loop While lastrow > 0 

If lastrow > 0 Then 
    Debug.Print "Last row with data: " & lastrow 
Else 
    Debug.Print "No data in the column" 
End If 

सूचना है कि अपने Rows.count जो चादर निर्दिष्ट नहीं है। इसका मतलब है कि यह सक्रिय शीट का उपयोग करेगा। बेशक ActiveSheet.Range() सक्रिय शीट पर भी है। लेकिन Range या Rows.Range या .Rows के साथ मिश्रण करना बुरा अभ्यास है। यह एक विचारहीन उपयोग को इंगित करता है जो आपको ActiveSheet बदल देता है लेकिन निर्दिष्ट निर्दिष्ट संदर्भ नहीं बदलता है।

+0

मैंने पहले ही सुझाव दिया था कि आप उनके पीछे लूपिंग के बारे में सोचा था, लेकिन यह हासिल करने के लिए एक और शानदार तरीका की उम्मीद कर रहा था। – Pascale

+0

आपके उत्तर के लिए धन्यवाद और पंक्तियों के उपयोग में सुधार करने के तरीके के बारे में बताते हुए धन्यवाद। गणना और सक्रियशीट। – Pascale

+3

मुझे लगता है कि, "विभाजन और जीत" दृष्टिकोण का उपयोग करने का प्रयास करें। जैसा कि '2^20' 1048576 के बराबर है। यह 'पंक्तियों' का मूल्य है। उस ने कहा कि आपका 'डू ... लूप' कभी भी 'आखिरी' तक पहुंचने के लिए 20 गुना से अधिक नहीं दोहराएगा। – Rosetta

संबंधित मुद्दे