2010-01-21 18 views
5

मैं माइक्रोसॉफ्ट.ऑफिस.इंटरोप.एक्ससेल का उपयोग कर रहा हूं, और मुझे चयनित पंक्तियों को वापस करने का कोई तरीका नहीं मिल रहा है। "चुने गए" से मेरा क्या मतलब है, जब आप बाईं ओर पंक्ति गटर पर क्लिक करते हैं तो पंक्ति संख्याएं स्वयं होती हैं और एक या अधिक संगत या गैर-संगत पंक्तियां (जो पूरी पंक्ति को हाइलाइट करती हैं) का चयन करती हैं। यह किसी क्षेत्र का चयन करने से अलग है या खुद शीट पर क्षेत्र।एक्सेल: चयनित पंक्तियों को वापस प्राप्त करना

अब तक, मैंने ऐप को देखा है। चयन, ऐप। कैल्स, ऐप.रो, और इनमें से कोई भी मुझे पंक्तियां देने के लिए प्रकट नहीं होता है। ऐप। चयन मुझे वास्तविक सेल सामग्री देता है, जो मैं नहीं चाहता हूं।

कोई विचार? धन्यवाद!

उत्तर

8

ऐसा करने के लिए, आपको रेंज में प्रत्येक क्षेत्र की गणना करने की आवश्यकता है, और उसके बाद प्रत्येक क्षेत्र के भीतर पंक्तियों का आकलन करें। कुछ हद तक भ्रमित, Excel.Range.Rows संपत्ति श्रेणियों का संग्रह (प्रत्येक पंक्ति का प्रतिनिधित्व करती है) लौटाती है, जबकि Excel.Range.Row संपत्ति श्रेणी में शीर्ष-बाएं सेल की पंक्ति संख्या लौटाती है।

इसलिए, पंक्ति संख्या प्राप्त करने के लिए, आपको क्षेत्र और पंक्ति संग्रहों का आकलन करना चाहिए और फिर श्रेणी का उपयोग करना चाहिए। पंक्ति। उदाहरण के लिए:

Excel.Range range = (Excel.Range)excelApp.Selection; 

List<int> rowNumbers = new List<int>(); 

// Enumerate the Rows within each Area of the Range. 
foreach (Excel.Range area in range.Areas) 
{ 
    foreach (Excel.Range row in area.Rows) 
    { 
     rowNumbers.Add(row.Row); 
    } 
} 

// Report the results. 
foreach (int rowNumber in rowNumbers) 
{ 
    MessageBox.Show(rowNumber.ToString()); 
} 

यदि आप चाहें तो भी लिंक का उपयोग कर सकते हैं।

क्वेरी सिंटेक्स का उपयोग करना:

IEnumerable<int> rowNumbers = 
    from area in range.Areas.Cast<Excel.Range>() 
    from row in area.Rows.Cast<Excel.Range>() 
    select row.Row; 

का उपयोग करते हुए विधि सिंटेक्स:

IEnumerable<int> rowNumbers = 
    range.Areas.Cast<Excel.Range>() 
    .SelectMany(area => area.Rows.Cast<Excel.Range>() 
         .Select(row => row.Row)); 

अद्यतन: अलग पंक्ति नंबर लौटने के लिए कैसे:

अलग पंक्ति संख्या लौटने के लिए (जो तब हो सकता है जब बहु-क्षेत्र सीमा का चयन किया जाता है जहां क्षेत्रों में संपूर्ण पंक्तियां शामिल नहीं होती हैं)।

(1) सबसे आसान लिंकक का उपयोग करना और Distinct ऑपरेटर का उपयोग करना सबसे आसान है।

क्वेरी सिंटेक्स का उपयोग करना::

IEnumerable<int> distinctRowNumbers = 
    (from area in range.Areas.Cast<Excel.Range>() 
    from row in area.Rows.Cast<Excel.Range>() 
    select row.Row) 
    .Distinct(); 

विधि सिंटेक्स का उपयोग करना: उदाहरण के लिए

IEnumerable<int> distinctRowNumbers = 
    range.Areas.Cast<Excel.Range>() 
    .SelectMany(area => area.Rows.Cast<Excel.Range>() 
         .Select(row => row.Row)) 
    .Distinct(); 

(2) Linq का इस्तेमाल कर रही नहीं है, तो आप एक HashSet इस्तेमाल कर सकते हैं। उदाहरण के लिए:

Excel.Range range = (Excel.Range)excelApp.Selection; 

HashSet<int> distinctRowNumbers = new HashSet<int>(); 

// Enumerate the Rows within each Area of the Range. 
foreach (Excel.Range area in range.Areas) 
{ 
    foreach (Excel.Range row in area.Rows) 
    { 
     distinctRowNumbers.Add(row.Row); 
    } 
} 

// Report the results. 
foreach (int rowNumber in distinctRowNumbers) 
{ 
    MessageBox.Show(rowNumber.ToString()); 
} 

(3) शायद सबसे सहज दृष्टिकोण पहले पूरे पंक्तियों में अपने मूल सीमा को परिवर्तित करने के लिए, और फिर पंक्तियों पुनरावृति है। इस मामले में, पंक्तियां पहले से ही अद्वितीय होने की गारंटी दी गई हैं, इसलिए हमें HashSet या Distinct ऑपरेटर का उपयोग करने की आवश्यकता नहीं है।

इन उदाहरणों में, ध्यान दें उपयोग Excel.Range.EntireRow, जो क्षेत्रों और पंक्तियों की गणना से पहले मूल श्रृंखला के लिए लागू किया जाता है: का उपयोग किए बिना Linq

गणना:

List<int> distinctRowNumbers = new List<int>(); 

foreach (Excel.Range area in range.EntireRow.Areas) 
{ 
    foreach (Excel.Range row in area.Rows) 
    { 
     distinctRowNumbers.Add(row.Row); 
    } 
} 

LINQ का उपयोग कर क्वेरी सिंटैक्स:

IEnumerable<int> distinctRowNumbers = 
    from area in range.EntireRow.Areas.Cast<Excel.Range>() 
    from row in area.Rows.Cast<Excel.Range>() 
    select row.Row; 

LINQ का उपयोग विधि वाक्य रचना:

IEnumerable<int> distinctRowNumbers = 
    range.EntireRow.Areas.Cast<Excel.Range>() 
    .SelectMany(area => area.Rows.Cast<Excel.Range>() 
         .Select(row => row.Row)); 

ध्यान दें कि Range.EntireRow May Return Incorrect Result, लेकिन, अगर मैं इसे सही ढंग से समझता हूं, तो यह केवल Excel '95 और नीचे लागू होता है, जो पूरी तरह से अप्रचलित है। (मैं एक्सेल '97 के नीचे एक्सेल के किसी भी संस्करण के बारे में चिंता नहीं करूंगा।) यदि आप किसी भी संस्करण के मुद्दों के बारे में चिंतित हैं, हालांकि, और सभी एक्सेल संस्करणों में परीक्षण की लक्जरी नहीं है, तो हो सकता है कि आप हैशसेट का उपयोग करना चाहें , या यह सुनिश्चित करने के लिए कि आपकी पंक्ति संख्या अद्वितीय हैं, अलग ऑपरेटर के साथ लिंक का उपयोग करें।

आशा है कि इससे मदद मिलती है!

माइक

+0

मेरा सुझाव है कि आप rowNumbers में डुप्लिकेट प्रविष्टियों से बचने के लिए एक अतिरिक्त परीक्षण जोड़ें। –

+0

अच्छा बिंदु, डॉक्टर ब्राउन! अब ऊपर जोड़ा गया ... :-) –

+0

माइक, वह शानदार था! बहुत बहुत धन्यवाद!!! –

0

पंक्तियाँ, बस क्षेत्रों की गणना करने की आवश्यकता नहीं:

var rows = new SortedSet<int>();     // distinct and sorted 

foreach (Excel.Range a in app.Selection.Areas) 
    foreach (int r in Enumerable.Range(a.Row, a.Rows.Count)) 
     rows.Add(r); 
1

मैं विशाल सरगर्मी रहा हूँ और यहाँ एक छोटे से वास्तविक जानकारी जोड़ने:
अब हम सिर्फ xlApp.ActiveCell.Row के लिए उपयोग कर सकते हैं कि :)

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

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