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

时间:2020-03-05 18:56:21  来源:igfitidea点击:

我只需要浏览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)就可以获取单元格值