2008-09-16 16 views
22

में सभी कोशिकाओं के माध्यम से पुन: प्रयास कैसे करें मुझे एक्सेल स्प्रेडशीट में सभी कोशिकाओं के माध्यम से जाने और कक्षों में मानों की जांच करने की आवश्यकता है। कोशिकाओं में पाठ, संख्याएं या खाली हो सकती है। मैं 'रेंज' की अवधारणा के साथ बहुत परिचित/आरामदायक काम नहीं कर रहा हूं। इसलिए, किसी भी नमूना कोड की सराहना की जाएगी। (मैंने इसे Google पर करने का प्रयास किया था, लेकिन मुझे जो कोड स्निपेट मिला वह काफी नहीं था जो मुझे चाहिए)एक्सेल वीबीए या वीएसटीओ 2005

धन्यवाद।

उत्तर

7
Sub CheckValues1() 
    Dim rwIndex As Integer 
    Dim colIndex As Integer 
    For rwIndex = 1 To 10 
      For colIndex = 1 To 5 
       If Cells(rwIndex, colIndex).Value <> 0 Then _ 
        Cells(rwIndex, colIndex).Value = 0 
      Next colIndex 
    Next rwIndex 
End Sub 

इस स्निपेट यह काफी उपयोगी होने के लिए के रूप में एक समारोह के एक आदेश दिया फैशन में कोशिकाओं में मूल्यों की जाँच करने के लिए साधन वर्णन करने के लिए लगता है http://www.java2s.com/Code/VBA-Excel-Access-Word/Excel/Checksvaluesinarange10rowsby5columns.htm पर मिला।

बस इसे 2 डी ऐरे के रूप में कल्पना करें और कोशिकाओं के माध्यम से लूप के लिए एक ही तर्क लागू करें।

+4

कोड है कि एक सीमा में हर कोशिका के माध्यम से लूप बेहद अक्षम है द्वारा एक सेल मूल्य मिल सकता है। सरणी को एक सरणी में पढ़ें, सरणी में अपने चेक/परिवर्तन करें, फिर सरणी को श्रेणी में वापस लिखें। आइए इस कोड का उपयोग करना बंद करने के लिए सहमत हैं और शायद यह दूर जायेगा। – JimmyPena

0

एक्सेल वीबीए में, यह फ़ंक्शन आपको किसी भी वर्कशीट में किसी भी सेल की सामग्री देगा।

Function getCellContent(Byref ws As Worksheet, ByVal rowindex As Integer, ByVal colindex As Integer) as String 
    getCellContent = CStr(ws.Cells(rowindex, colindex)) 
End Function 

तो तुम, कोशिकाओं के मूल्य की जाँच सिर्फ एक पाश में समारोह रखना चाहते हैं, तो यह वर्कशीट आप चाहते हैं और सेल की पंक्ति सूचकांक और स्तंभ अनुक्रमणिका के संदर्भ दे। पंक्ति सूचकांक और कॉलम इंडेक्स दोनों 1 से शुरू होते हैं, जिसका अर्थ है कि सेल ए 1 ws.Cells (1,1) और इसी तरह होगा।

3

आप परिभाषित सीमा में सभी कोशिकाओं के माध्यम से पुनरावृत्त करने के लिए प्रत्येक के लिए उपयोग कर सकते हैं।

Public Sub IterateThroughRange() 

Dim wb As Workbook 
Dim ws As Worksheet 
Dim rng As Range 
Dim cell As Range 

Set wb = Application.Workbooks(1) 
Set ws = wb.Sheets(1) 
Set rng = ws.Range("A1", "C3") 

For Each cell In rng.Cells 
    cell.Value = cell.Address 
Next cell 

End Sub 
52

आप उपयोग कर सकते हैं आप केवल कोशिकाओं है कि उपयोग में हैं को देखने के लिए की जरूरत है:

sub IterateCells() 

    For Each Cell in ActiveSheet.UsedRange.Cells 
     'do some stuff 
    Next 

End Sub 

है कि सब कुछ (डेटा के साथ अंतिम सेल पर A1 से रेंज में मारा जाएगा नीचे दाएँ - लगभग सेल)

+2

वाह ... वर्कशीट.cells की तुलना में काफी बेहतर है जो मेरी प्रणाली को दुर्घटनाग्रस्त कर देता है! –

+0

हाँ, यह पूरी तरह से लोटा कोशिकाओं को फिर से शुरू करने के लिए है। – cori

1

इसे पूरा करने के कई तरीके हैं, जिनमें से प्रत्येक के फायदे और नुकसान हैं; सबसे पहले और सबसे महत्वपूर्ण, आपको वर्कशीट ऑब्जेक्ट का उदाहरण देने की आवश्यकता होगी, एप्लिकेशन। एक्टिवशीट काम करता है यदि आप बस उस उपयोगकर्ता को चाहते हैं जिसे उपयोगकर्ता देख रहा हो।

वर्कशीट ऑब्जेक्ट में तीन गुण हैं जिनका उपयोग सेल डेटा (सेल, पंक्तियां, कॉलम) तक पहुंचने के लिए किया जा सकता है और एक विधि जिसका उपयोग सेल डेटा, (get_Range) के ब्लॉक को प्राप्त करने के लिए किया जा सकता है।

रेंज का आकार बदल सकता है और इस तरह, लेकिन आपको यह पता लगाने के लिए ऊपर वर्णित गुणों का उपयोग करने की आवश्यकता हो सकती है कि आपके डेटा की सीमाएं कहां हैं। जब आप बड़ी मात्रा में डेटा के साथ काम कर रहे हों तो रेंज का लाभ स्पष्ट हो जाता है क्योंकि VSTO ऐड-इन्स एक्सेल एप्लिकेशन की सीमाओं के बाहर होस्ट किए जाते हैं, इसलिए एक्सेल को सभी कॉल ओवरहेड के साथ एक परत के माध्यम से पारित किया जाना चाहिए; एक रेंज प्राप्त करने से आप एक ऐसे कॉल में जो भी डेटा चाहते हैं उसे प्राप्त/सेट कर सकते हैं जिसमें बड़े प्रदर्शन लाभ हो सकते हैं, लेकिन इसके लिए आपको प्रत्येक प्रविष्टि के माध्यम से पुनरावृत्ति के बजाय स्पष्ट विवरणों का उपयोग करने की आवश्यकता होती है।

This MSDN forum post एक वीबी दिखाता है।नेट डेवलपर एक सरणी के रूप में एक रेंज के परिणाम प्राप्त होने के बारे में एक प्रश्न पूछ

1

आप मूल रूप से एक रेंज

से अधिक पाश एक पत्रक

myWs = (Worksheet)MyWb.Worksheets[1]; 

जाओ कर सकते हैं रेंज यदि आप में रुचि रखते हैं जाओ तुम वास्तव में हर कोशिका उपयोग एक्सेल की सीमा

Excel 2007 "बिग ग्रिड" बढ़ जाती है प्रति workshe पंक्तियों की अधिकतम संख्या की जांच करना चाहते और 65,536 से 1 मिलियन से, और कॉलम की संख्या 256 (IV) से 16,384 (XFD) तक। यहाँ http://msdn.microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_BigGridIncreasedLimitsExcel

और उसके बाद से सीमा पर पाश

 Range myBigRange = myWs.get_Range("A1", "A256"); 

     string myValue; 

     foreach(Range myCell in myBigRange) 
     { 
      myValue = myCell.Value2.ToString(); 
     } 
0

मेरे VBA कौशल कुछ पुरानी हैं, लेकिन यह मैं क्या कर चाहते हैं के सामान्य विचार है।
यह करने के लिए प्रत्येक कॉलम में एक पाश के माध्यम से पुनरावृति करने के लिए किया जाएगा सबसे आसान तरीका:

public sub CellProcessing() 
on error goto errHandler 

    dim MAX_ROW as Integer 'how many rows in the spreadsheet 
    dim i as Integer 
    dim cols as String 

    for i = 1 to MAX_ROW 
     'perform checks on the cell here 
     'access the cell with Range("A" & i) to get cell A1 where i = 1 
    next i 

exitHandler: 
    exit sub 
errHandler: 
    msgbox "Error " & err.Number & ": " & err.Description 
    resume exitHandler 
end sub 

ऐसा लगता है कि रंग वाक्य रचना हाइलाइटिंग VBA पसंद नहीं करता है, लेकिन उम्मीद है कि यह कुछ हद तक मदद मिलेगी (कम से कम आप दे से काम करने के लिए एक प्रारंभिक बिंदु)।

  • Brisketeer
2

एक वीबी या सी # अनुप्रयोग के लिए, एक तरीका यह है कार्यालय Interop का उपयोग करके। यह इस बात पर निर्भर करता है कि आप किस Excel के साथ काम कर रहे हैं।

एक्सेल 2003 के लिए, यह एमएसडीएन आलेख शुरू करने के लिए एक अच्छी जगह है। Understanding the Excel Object Model from a Visual Studio 2005 Developer's Perspective

आप मूल रूप से निम्न कार्य करना होगा:

  • एक्सेल अनुप्रयोग प्रारंभ करें।
  • एक्सेल कार्यपुस्तिका खोलें।
  • कार्यपुस्तिका से नाम या अनुक्रमणिका द्वारा वर्कशीट पुनर्प्राप्त करें।
  • वर्कशीट में सभी कक्षों के माध्यम से इटरेट करें जिन्हें एक श्रेणी के रूप में पुनर्प्राप्त किया गया था।
  • अंतिम चरण के लिए नीचे नमूना (अनचाहे) कोड अंश।

    Excel.Range allCellsRng; 
    string lowerRightCell = "IV65536"; 
    allCellsRng = ws.get_Range("A1", lowerRightCell).Cells; 
    foreach (Range cell in allCellsRng) 
    { 
     if (null == cell.Value2 || isBlank(cell.Value2)) 
     { 
      // Do something. 
     } 
     else if (isText(cell.Value2)) 
     { 
      // Do something. 
     } 
     else if (isNumeric(cell.Value2)) 
     { 
      // Do something. 
     } 
    } 

Excel 2007 के लिए, this MSDN reference प्रयास करें।

5

यदि आप केवल कक्षों के मानों को देख रहे हैं तो आप मानों को एक प्रकार के प्रकार में संग्रहीत कर सकते हैं। ऐसा लगता है कि किसी सरणी में किसी तत्व का मान प्राप्त करना एक्सेल के साथ बातचीत करने से बहुत तेज़ हो सकता है, ताकि आप बार-बार एकल कोशिकाओं को प्राप्त करने की तुलना में सभी सेल मानों की सरणी का उपयोग करके प्रदर्शन में कुछ अंतर देख सकें।

Dim ValArray as Variant 
ValArray = Range("A1:IV" & Rows.Count).Value 

तो फिर तुम सिर्फ जाँच ValArray (पंक्ति, कॉलम)

+1

बिल्कुल सहमत हैं! मैंने बस अपना पहला रन निकाला, केवल कुछ हज़ार कोशिकाओं के लिए, इसमें 30 सेकंड से अधिक समय लग गया जो कि तूफान है! –

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