2008-09-16 155 views
22

我需要简单浏览Excel电子表格中的所有单元格并检查单元格中的值。单元格可能包含文本,数字或空白。我不太熟悉/舒适地使用“范围”的概念。因此,任何示例代码将不胜感激。 (我尝试谷歌它,但我发现的代码片段并没有完全做我需要的)如何遍历Excel VBA或VSTO 2005中的所有单元格

谢谢。

回答

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这似乎是非常有用的功能来说明的装置,以检查值细胞以有序的方式。

试想一下,它是一种二维数组,并应用相同的逻辑循环遍历单元格。

+4

代码得到一个单元格的值。将范围读入数组中,对数组进行检查/更改,然后将数组写回范围。我们同意停止使用此代码,也许它会消失。 – JimmyPena 2012-06-13 00:37:37

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)等等。

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 
52

如果你只需要看看正在使用的细胞可以使用:

sub IterateCells() 

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

End Sub 

将在范围内打击一切从A1到数据的最后一个单元格(右下角最细胞)

+2

哇...比我的系统死机的worksheet.cell好多了! – 2014-08-11 22:06:57

+0

是的,这是一个整个lotta细胞迭代。 – cori 2014-08-11 23:29:55

1

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

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

范围可以调整大小等,但您可能需要使用上述属性来找出数据边界的位置。当您处理大量数据时,范围的优势变得明显,因为VSTO加载项位于Excel应用程序本身的边界之外,因此,所有对Excel的调用都必须通过带有开销的层进行传递;获取Range可以让您在一次调用中获取/设置所有需要的数据,这些数据可以带来巨大的性能优势,但它要求您使用明确的细节而不是遍历每个条目。

This MSDN forum post表示VB。.NET开发提出一个问题关于得到一系列的结果作为数组

1

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

获取片

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(); 
     } 
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,但希望这会有所帮助(至少给你起点工作)。

  • Brisketeer
2

对于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

5

如果您只是查看单元格的值,则可以将值存储在变体类型的数组中。看起来,获取数组中元素的值可能比与Excel进行交互快得多,因此与重复获取单个单元格相比,使用所有单元格值的数组可以看到性能上的差异。

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

然后,你可以通过检查的valarray(行,列),其循环遍历一个范围内的每一个细胞的效率非常低