遍历Excel VBA或者VSTO 2005中的所有单元格
我只需要浏览Excel电子表格中的所有单元格并检查单元格中的值即可。单元格可以包含文本,数字或者为空白。我对"范围"的概念不是很熟悉/不适应。因此,将非常感谢任何示例代码。 (我确实尝试过搜索它,但是我发现的代码片段并未完全满足我的要求)
谢谢你。
解决方案
回答
在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),依此类推。
回答
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上找到了此代码片段时尚。
想象一下它是一个二维数组,并应用相同的逻辑遍历单元格。
回答
我们可以使用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
回答
如果只需要查看正在使用的单元格,则可以使用:
sub IterateCells() For Each Cell in ActiveSheet.UsedRange.Cells 'do some stuff Next End Sub
它将击中从A1到最后一个包含数据的单元格(最右下的单元格)范围内的所有内容
回答
有几种方法可以做到这一点,每种方法都有优点和缺点。首先,我们将需要有一个工作表对象的实例,如果只希望用户正在查看的对象,则Application.ActiveSheet可以工作。
Worksheet对象具有可用于访问单元格数据(单元格,行,列)的三个属性,以及可用于获取单元格数据块的方法(get_Range)。
可以调整范围大小,但是我们可能需要使用上面提到的属性来确定数据边界在哪里。当我们处理大量数据时,Range的优势显而易见,因为VSTO加载项托管在Excel应用程序本身的边界之外,因此,对Excel的所有调用都必须通过层传递;获取范围可以让我们在一次调用中获取/设置所需的所有数据,这可能会带来巨大的性能优势,但它要求我们使用明确的详细信息,而不是遍历每个条目。
此MSDN论坛帖子显示了VB.Net开发人员,询问有关获取Range作为数组的结果的问题
回答
我们基本上可以在范围上循环
取得工作表
myWs = (Worksheet)MyWb.Worksheets[1];
获取我们感兴趣的范围如果我们真的要检查每个单元格,请使用Excel的限制
The Excel 2007 "Big Grid" increases the maximum number of rows per worksheet from 65,536 to over 1 million, and the number of columns from 256 (IV) to 16,384 (XFD). from here 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(); }
回答
我的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,但希望这会有所帮助(至少为我们提供了一个工作的起点)。
- 布里斯克特
回答
对于VB或者Capp,执行此操作的一种方法是使用Office Interop。这取决于我们使用的是哪个版本的Excel。
对于Excel 2003,此MSDN文章是一个不错的起点。
从Visual Studio 2005开发人员的角度了解Excel对象模型
我们基本上需要执行以下操作:
- 启动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,请尝试使用此MSDN参考。
回答
如果仅查看单元格的值,则可以将值存储在变量类型的数组中。似乎获取数组中元素的值比与Excel交互要快得多,因此与重复获取单个单元格相比,使用所有单元格值的数组可以看到性能上的一些差异。
Dim ValArray as Variant ValArray = Range("A1:IV" & Rows.Count).Value
然后,只需检查ValArray(row,column)就可以获取单元格值