迭代 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 作为一个函数来说明以有序方式检查单元格中的值的方法,它似乎非常有用。
想象一下它是一个二维数组,并应用相同的逻辑来循环单元格。
其他提示
如果您只需要查看正在使用的单元格,您可以使用:
sub IterateCells()
For Each Cell in ActiveSheet.UsedRange.Cells
'do some stuff
Next
End Sub
这将命中从 A1 到最后一个包含数据的单元格(最右下角的单元格)范围内的所有内容
如果您只是查看单元格的值,则可以将这些值存储在变体类型的数组中。获取数组中元素的值似乎比与 Excel 交互要快得多,因此与重复获取单个单元格相比,使用所有单元格值的数组可以看到性能上的一些差异。
Dim ValArray as Variant
ValArray = Range("A1:IV" & Rows.Count).Value
然后您只需检查 ValArray( row , column ) 即可获取单元格值
您可以使用 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 开发人员的角度理解 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参考.
有多种方法可以实现这一点,每种方法都有优点和缺点;首先也是最重要的,您需要有一个 Worksheet 对象的实例,如果您只想要用户正在查看的对象,Application.ActiveSheet 就可以工作。
Worksheet 对象具有三个可用于访问单元格数据的属性(Cells、Rows、Columns)和一个可用于获取单元格数据块的方法 (get_Range)。
范围可以调整大小等,但您可能需要使用上面提到的属性来找出数据的边界在哪里。当您处理大量数据时,Range 的优势就变得很明显,因为 VSTO 加载项托管在 Excel 应用程序本身的边界之外,因此对 Excel 的所有调用都必须通过一个有开销的层;获取 Range 允许您在一次调用中获取/设置所需的所有数据,这可以带来巨大的性能优势,但它要求您使用显式详细信息,而不是迭代每个条目。
这个 MSDN 论坛帖子 显示 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,但希望这会有所帮助(至少为您提供一个工作起点)。
- 牛胸肉