如何遍历Excel VBA或VSTO 2005中的所有单元格

我需要简单地通过Excel电子表格中的所有单元格,并检查单元格中的值。 单元格可能包含文本,数字或空白。 我不是很熟悉/舒适地使用“范围”的概念。 因此,任何示例代码将不胜感激。 (我曾尝试谷歌,但我发现的代码片段并没有完全做我所需要的)

谢谢。

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上find这个代码片段。作为一个函数来说明它是非常有用的时尚&#x3002;

试想一下,它是一个二维数组,并应用相同的逻辑循环遍历单元格。

如果您只需要查看正在使用的单元格,则可以使用:

 sub IterateCells() For Each Cell in ActiveSheet.UsedRange.Cells 'do some stuff Next End Sub 

这将打到从A1到最后一个单元格的数据(右下angular的单元格)

如果您只是查看单元格的值,则可以将值存储在variablestypes的数组中。 看起来,获取数组中元素的值可能比与Excel交互的速度快得多,因此与重复获取单个单元格相比,使用所有单元格值的数组可以看到性能上的差异。

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

然后,您可以通过检查ValArray(行,列)来获取单元格值,

您可以使用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 

对于VB或C#应用程序,一种方法是使用Office Interop。 这取决于您正在使用哪个版本的Excel。

对于Excel 2003,这个MSDN文章是一个很好的起点。 从Visual Studio 2005开发人员的angular度了解Excel对象模型

你基本上需要做到以下几点:

  • 启动Excel应用程序。
  • 打开Excel工作簿。
  • 通过名称或索引从工作簿中检索工作表。
  • 遍历作为范围检索的工作表中的所有单元格。
  • 下面的示例(未经testing)代码摘录为最后一步。
 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,请尝试此MSDN参考 。

有几种方法可以做到这一点,每种方法都有优点和缺点; 首先,你将需要有一个工作表对象的实例,Application.ActiveSheet的作品,如果你只是想要一个用户正在看。

工作表对象有三个可用于访问单元格数据(单元格,行,列)的属性和一个可用于获取单元格数据块(get_Range)的方法。

范围可以resize等,但您可能需要使用上面提到的属性来找出数据的边界。 当您处理大量数据时,范围的优势变得明显,因为VSTO加载项被托pipe在Excel应用程序本身的边界之外,因此所有对Excel的调用都必须通过一个带有开销的层进行传递; 获得Range可以让你在一次调用中获得/设置所有你想要的数据,这些数据可以带来巨大的性能好处,但是它要求你使用明确的细节,而不是迭代每个条目。

此MSDN论坛post显示了一个VB.Net开发人员询问有关如何将Range的结果作为数组获取的问题

你基本上可以循环一个范围

得到一张表

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

获取你感兴趣的范围如果你真的想检查每个单元格使用Excel的限制

Excel 2007“Big Grid”将每个工作表的最大行数从65,536增加到100多万,列数从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(); } 

在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)等等。

我的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,但希望这会有所帮助(至less给你一个起点)。

  • Brisketeer