我需要简单地浏览Excel电子表格中的所有单元格并检查单元格中的值。单元格可能包含文本,数字或空白。我不太熟悉/舒适地使用'Range'的概念。因此,非常感谢任何样本代码。 (我确实尝试谷歌它,但我发现的代码片段并不完全符合我的需要)
谢谢。
答案 0 :(得分:56)
如果您只需要查看正在使用的单元格,您可以使用:
sub IterateCells()
For Each Cell in ActiveSheet.UsedRange.Cells
'do some stuff
Next
End Sub
将会触及从A1到最后一个包含数据的单元格中的所有内容(最右边的单元格)
答案 1 :(得分: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 :(得分:5)
如果您只是查看单元格的值,可以将值存储在变体类型的数组中。看起来在数组中获取元素的值可能比与Excel交互快得多,因此与重复获取单个单元格相比,使用所有单元格值的数组可以看到性能的差异。
Dim ValArray as Variant
ValArray = Range("A1:IV" & Rows.Count).Value
然后,只需检查ValArray(行,列)
即可获得单元格值答案 3 :(得分: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
答案 4 :(得分:2)
对于VB或C#应用程序,一种方法是使用Office Interop。这取决于您正在使用的Excel版本。
对于Excel 2003,这篇MSDN文章是一个很好的起点。 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 :(得分:1)
有几种方法可以实现这一点,每种方法都有优点和缺点;首先,您需要拥有一个Worksheet对象的实例,如果您只想要用户正在查看的那个,Application.ActiveSheet可以正常工作。
Worksheet对象有三个属性可用于访问单元格数据(单元格,行,列)和一个可用于获取单元格数据块的方法(get_Range)。
范围可以调整大小等等,但您可能需要使用上面提到的属性来找出数据边界的位置。当您处理大量数据时,Range的优势变得明显,因为VSTO加载项托管在Excel应用程序本身的边界之外,因此所有对Excel的调用都必须通过具有开销的层传递;获取范围允许您在一次调用中获取/设置所需的所有数据,这可能会带来巨大的性能优势,但它要求您使用显式详细信息而不是遍历每个条目。
This MSDN forum post显示一位VB.Net开发人员询问有关将Range的结果作为数组获取的问题
答案 6 :(得分:1)
你基本上可以遍历范围
获取表格
myWs = (Worksheet)MyWb.Worksheets[1];
获取您感兴趣的范围如果您确实想要检查每个单元格是否使用Excel的限制
Excel 2007“大网格”增加 每个最大行数 工作表从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();
}
答案 7 :(得分: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),依此类推。
答案 8 :(得分: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,但希望这会有所帮助(至少可以给你一个起点)。