循环访问表格列中的所有行,Excel-VBA

我目前正在处理一个数据集,它被格式化为一个表格,并带有标题。 我需要做的是循环遍历特定列中的所有单元格并更改内容。 通过对MSDN的研究,我提出了以下for循环

for i = 1 to NumRows Cells(i,23).Value = "PHEV" next i 

所以这会改变第23列的所有单元格来读取“PHEV”。 但是,我并没有build立自己的表格,所以我不能保证我感兴趣的专栏是第23栏。

我想实现类似于以下内容的东西:

 for i = 1 to NumRows Cells(i,[@[columnHeader]]).Value = "PHEV" next i 

当然,我知道这个语法是不正确的,但希望它足以说明我的目标。

您可以在分配前search列:

 Dim col_n as long for i = 1 to NumCols if Cells(1, i).Value = "column header you are looking for" Then col_n = i next for i = 1 to NumRows Cells(i, col_n).Value = "PHEV" next i 

如果这实际上是一个ListObject表(从function区插入表),则可以使用该表的.DataBodyRange对象来获取行数和列数。 这会忽略标题行。

 Sub TableTest() Dim tbl As ListObject Dim tRows As Long Dim tCols As Long Set tbl = ActiveSheet.ListObjects("Table1") '## modify to your table name. With tbl.DataBodyRange tRows = .Rows.Count tCols = .Columns.Count End With MsgBox tbl.Name & " contains " & tRows & " rows and " & tCols & " columns.", vbInformation End Sub 

如果你需要使用标题行,而不是使用tbl.DataBodyRange只是使用tbl.Range

假设你的表被称为“表1”,你需要的列是“列”,你可以试试这个:

 for i = 1 to Range("Table1").Rows.Count Range("Table1[Column]")(i)="PHEV" next i 

如果您知道标题名称,则可以根据以下内容find该列:

 Option Explicit Public Sub changeData() Application.ScreenUpdating = False ' faster for modifying values on sheet Dim header As String Dim numRows As Long Dim col As Long Dim c As Excel.Range header = "this one" ' header name to find Set c = ActiveSheet.Range("1:1").Find(header, LookIn:=xlValues) If Not c Is Nothing Then col = c.Column Else ' can't work with it Exit Sub End If numRows = 50 ' (whatever this is in your code) With ActiveSheet .Range(.Cells(2, col), .Cells(numRows, col)).Value = "PHEV" End With Application.ScreenUpdating = True ' reset End Sub 

我遇到同样的问题,但没有论坛可以帮助我,几分钟后,我出来了一个想法:

 match(ColumnHeader,Table1[#Headers],0) 

这将返回你的号码。

你可以find表格的最后一列,然后通过循环来填充单元格。

 Sub test() Dim lastCol As Long, i As Integer lastCol = Range("AZ1").End(xlToLeft).Column For i = 1 To lastCol Cells(1, i).Value = "PHEV" Next End Sub 

你可以通过知道它的名字而不是它的位置来遍历表中任何列的单元格。 如果该表位于工作簿的工作表Sheet1中:

 Dim rngCol as Range Dim cl as Range Set rngCol = Sheet1.Range("TableName[ColumnName]") For Each cl in rngCol cl.Value = "PHEV" Next cl 

上面的代码将循环遍历数据值,不包括标题行和总计行。 没有必要指定表中的行数。

使用它通过列名查找表中任何列的位置:

 Dim colNum as Long colNum = Range("TableName[Column name to search for]").Column 

这将返回表中列的数字位置。

假设你的表被称为“Table1”,你的列被称为“Column1”,那么:

 For i = 1 To ListObjects("Table1").ListRows.Count ListObjects("Table1").ListColumns("Column1").DataBodyRange(i) = "PHEV" Next i