如何遍历Excel VBA或VSTO 2005中的所有单元格
我需要简单浏览Excel电子表格中的所有单元格并检查单元格中的值。单元格可能包含文本,数字或空白。我不太熟悉/舒适地使用“范围”的概念。因此,任何示例代码将不胜感激。 (我尝试谷歌它,但我发现的代码片段并没有完全做我需要的)如何遍历Excel VBA或VSTO 2005中的所有单元格
谢谢。
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这似乎是非常有用的功能来说明的装置,以检查值细胞以有序的方式。
试想一下,它是一种二维数组,并应用相同的逻辑循环遍历单元格。
在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)等等。
您可以使用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到数据的最后一个单元格(右下角最细胞)
哇...比我的系统死机的worksheet.cell好多了! – 2014-08-11 22:06:57
是的,这是一个整个lotta细胞迭代。 – cori 2014-08-11 23:29:55
有几种方法可以做到这一点,每种方法都有优点和缺点;首先,您将需要有一个Worksheet对象的实例,如果您只是想要用户正在查看的那个,Application.ActiveSheet就可以工作。
工作表对象有三个可用于访问单元格数据(单元格,行,列)的属性和一个可用于获取单元格数据块(get_Range)的方法。
范围可以调整大小等,但您可能需要使用上述属性来找出数据边界的位置。当您处理大量数据时,范围的优势变得明显,因为VSTO加载项位于Excel应用程序本身的边界之外,因此,所有对Excel的调用都必须通过带有开销的层进行传递;获取Range可以让您在一次调用中获取/设置所有需要的数据,这些数据可以带来巨大的性能优势,但它要求您使用明确的细节而不是遍历每个条目。
This MSDN forum post表示VB。.NET开发提出一个问题关于得到一系列的结果作为数组
你基本上可以循环在一定范围内
获取片
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();
}
我的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
对于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。
如果您只是查看单元格的值,则可以将值存储在变体类型的数组中。看起来,获取数组中元素的值可能比与Excel进行交互快得多,因此与重复获取单个单元格相比,使用所有单元格值的数组可以看到性能上的差异。
Dim ValArray as Variant
ValArray = Range("A1:IV" & Rows.Count).Value
然后,你可以通过检查的valarray(行,列),其循环遍历一个范围内的每一个细胞的效率非常低
代码得到一个单元格的值。将范围读入数组中,对数组进行检查/更改,然后将数组写回范围。我们同意停止使用此代码,也许它会消失。 – JimmyPena 2012-06-13 00:37:37