循环遍历表列中的所有行,Excel-VBA

时间:2013-07-10 15:37:23

标签: excel vba excel-vba excel-2010

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

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

因此,这会将第23列中的所有单元格更改为“PHEV”。但是,我没有建立我自己合作的表格,所以我不能保证我感兴趣的专栏将是第23栏。

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

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

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

9 个答案:

答案 0 :(得分:21)

如果这实际上是ListObject表(从功能区中插入表),那么您可以使用表的.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 :(得分:13)

假设您的表名为“Table1”,您需要的列是“Column”,您可以尝试这样:

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

答案 2 :(得分:10)

您可以在分配前搜索列:

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

答案 3 :(得分:2)

如果您知道标题名称,则可以根据该列找到该列:

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

答案 4 :(得分:1)

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

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

这将返回您的号码。

答案 5 :(得分:0)

您可以找到表格的最后一列,然后通过循环填充单元格。

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

答案 6 :(得分:0)

您可以通过知道其名称而不是其位置来遍历表格中任何列的单元格。如果表位于工作簿的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

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

答案 7 :(得分:0)

假设您的表名为“Table1”,而您的列名为“Column1”,那么:

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

答案 8 :(得分:0)

由于以上答案均无法解决我的问题,因此这里提供从每行提取特定(命名)列的解决方案。

使用命名Excel表{{1中的某些命名列的值(YesNoMaybe)将表转换为文本}}标签上的myTable,使用以下(Excel)VBA代码段:

mySheet

我们定义一个循环Function Table2text() Dim NumRows, i As Integer Dim rngTab As Range Set rngTab = ThisWorkbook.Worksheets("mySheet").Range("myTable") ' For each row, convert the named columns into an enumeration For i = 1 To rngTab.Rows.Count Table2text= Table2text & "- Yes:" & Range("myTable[Yes]")(i).Value & Chr(10) Table2text= Table2text & "- No: " & Range("myTable[No]")(i).Value & Chr(10) Table2text= Table2text & "- Maybe: "& Range("myTable[Maybe]")(i).Value & Chr(10) & Chr(10) Next i ' Finalize return value Table2text = Table2text & Chr(10) End Function 的范围。诀窍是使用rngTab提取行Range("myTable[col]")(i)中列col的条目。