2008-09-16 161 views
22

我需要簡單瀏覽Excel電子表格中的所有單元格並檢查單元格中的值。單元格可能包含文本,數字或空白。我不太熟悉/舒適地使用「範圍」的概念。因此,任何示例代碼將不勝感激。 (我嘗試谷歌它,但我發現的代碼片段並沒有完全做我需要的)如何遍歷Excel VBA或VSTO 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這似乎是非常有用的功能來說明的裝置,以檢查值細胞以有序的方式。

試想一下,它是一種二維數組,並應用相同的邏輯循環遍歷單元格。

+4

代碼得到一個單元格的值。將範圍讀入數組中,對數組進行檢查/更改,然後將數組寫回範圍。我們同意停止使用此代碼,也許它會消失。 – JimmyPena 2012-06-13 00:37:37

0

在Excel VBA中,此功能將爲您提供任何工作表中任何單元格的內容。

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開始,這意味着單元格A1將是ws.Cells(1,1)等等。

3

您可以使用For Each遍歷定義範圍內的所有單元格。

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

哇...比我的系統死機的worksheet.cell好多了! – 2014-08-11 22:06:57

+0

是的,這是一個整個lotta細胞迭代。 – cori 2014-08-11 23:29:55

1

有幾種方法可以做到這一點,每種方法都有優點和缺點;首先,您將需要有一個Worksheet對象的實例,如果您只是想要用戶正在查看的那個,Application.ActiveSheet就可以工作。

工作表對象有三個可用於訪問單元格數據(單元格,行,列)的屬性和一個可用於獲取單元格數據塊(get_Range)的方法。

範圍可以調整大小等,但您可能需要使用上述屬性來找出數據邊界的位置。當您處理大量數據時,範圍的優勢變得明顯,因爲VSTO加載項位於Excel應用程序本身的邊界之外,因此,所有對Excel的調用都必須通過帶有開銷的層進行傳遞;獲取Range可以讓您在一次調用中獲取/設置所有需要的數據,這些數據可以帶來巨大的性能優勢,但它要求您使用明確的細節而不是遍歷每個條目。

This MSDN forum post表示VB。.NET開發提出一個問題關於得到一系列的結果作爲數組

1

你基本上可以循環在一定範圍內

獲取片

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

獲取你感興趣。如果您範圍真的要檢查每一個細胞使用Excel的限制

在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

對於VB或者C#應用程序,一個辦法做到這一點是通過使用Office互操作。這取決於您使用的是哪個版本的Excel。

對於Excel 2003,本MSDN文章是一個很好的開始。 Understanding the Excel Object Model from a Visual Studio 2005 Developer's Perspective

你基本上需要做到以下幾點:

  • 啓動Excel應用程序。
  • 打開Excel工作簿。
  • 按名稱或索引從工作簿中檢索工作表。
  • 遍歷工作表中作爲範圍檢索的所有單元格。
  • 最後一步的樣本(未經測試)代碼摘錄如下。

    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

如果您只是查看單元格的值,則可以將值存儲在變體類型的數組中。看起來,獲取數組中元素的值可能比與Excel進行交互快得多,因此與重複獲取單個單元格相比,使用所有單元格值的數組可以看到性能上的差異。

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

然後,你可以通過檢查的valarray(行,列),其循環遍歷一個範圍內的每一個細胞的效率非常低