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

我需要简单地遍历Excel电子表格中的所有单元格,并检查单元格中的值。单元格可以包含文本、数字或空白。我对“范围”这个概念不太熟悉/不太适应。因此,任何示例代码将非常感谢。(我确实试图谷歌它,但我发现的代码片段不太做我需要的)

谢谢你!

请先 登录 后评论

9 个回答

Martin08

在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),以此类推。

请先 登录 后评论
betelgeuce
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上找到了这个代码片段,它作为一个函数似乎非常有用,可以演示以有序的方式检查单元格中的值的方法。

只要把它想象成一个2d数组,并应用相同的逻辑在单元格中循环。

请先 登录 后评论
Theo

可以使用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
请先 登录 后评论
cori

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

sub IterateCells()

   For Each Cell in ActiveSheet.UsedRange.Cells
      'do some stuff
   Next

End Sub

它将命中从A1到最后一个有数据的单元格(最右下的单元格)范围内的所有内容

请先 登录 后评论
TheXenocide

有几种方法可以实现这一点,每种方法都有优点和缺点;首先,您需要有一个工作表对象Application的实例。如果您只想要用户正在查看的那个,那么ActiveSheet就可以工作。

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

范围可以调整大小等,但您可能需要使用上面提到的属性来找出数据的边界在哪里。当你处理大量的数据时,Range的优势变得明显起来,因为VSTO插件托管在Excel应用程序本身的边界之外,所以所有对Excel的调用都必须通过一个有开销的层;获取Range允许您在一次调用中获得/设置所有您想要的数据,这可以带来巨大的性能优势,但它需要您使用显式的细节,而不是遍历每个条目。

这个MSDN论坛的帖子展示了一个VB。Net开发人员询问一个关于将Range作为数组获取结果的问题

请先 登录 后评论
w4ik

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

得到一个表

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

如果你真的想检查每个单元格,请使用Excel的限制

Excel 2007“大网格”将每个工作表的最大行数从65536增加到超过100万,列数从256 (IV)增加到16384 (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();
        }
请先 登录 后评论
Community

我的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
请先 登录 后评论
Cory Engebretson

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

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

你基本上需要做以下事情:

  • 启动Excel应用程序。
  • 打开Excel工作簿。
  • 按名称或索引从工作簿检索工作表。
  • 遍历工作表中作为范围检索的所有cell。
  • 下面是最后一步的示例(未经测试的)代码摘录。

    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参考

请先 登录 后评论
Jon Fournier

如果只查看单元格的值,则可以将值存储在不同类型的数组中。在数组中获取元素的值似乎比与Excel交互要快得多,因此您可以看到使用包含所有单元格值的数组与重复获取单个单元格相比在性能上有一些不同。

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

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

请先 登录 后评论