17

我目前正在处理一个带有标题的表格格式的数据集。我需要做的是循环浏览特定列中的所有单元格并更改内容。通过对 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

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

4

10 回答 10

30

如果这实际上是一个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.

于 2013-07-10T15:55:09.413 回答
27

假设您的表名为“Table1”,而您需要的列是“Column”,您可以尝试以下操作:

for i = 1 to Range("Table1").Rows.Count
   Range("Table1[Column]")(i)="PHEV"
next i
于 2015-10-14T14:33:48.737 回答
12

假设您的表称为“Table1”,而您的列称为“Column1”,则:

For i = 1 To ListObjects("Table1").ListRows.Count
    ListObjects("Table1").ListColumns("Column1").DataBodyRange(i) = "PHEV"
Next i
于 2017-08-21T04:56:46.000 回答
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
于 2013-07-10T16:01:45.943 回答
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
于 2013-07-10T15:58:01.557 回答
1

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

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

这将返回您的号码。

于 2015-09-02T07:50:27.390 回答
1

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

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

于 2016-06-03T07:48:26.837 回答
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
于 2013-07-10T15:42:28.463 回答
0

由于上述答案都没有帮助我解决我的问题,因此我的解决方案是从每一行中提取某个(命名)列。

我 使用以下 (Excel) VBA 代码段在选项卡上的命名 Excel 表中使用一些命名列( , , )的值将表转换为文本:YesNoMaybemyTablemySheet

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)提取colrow中列的条目i

于 2019-04-04T13:54:00.943 回答
0

我修改了一点 SnitkaSirk 的答案。这是遍历listobject单元格的简单方法,例如在列中:

Dim cell As Range
For Each cell In ListObjects("NameOfTable").ListColumns("HeaderNameOfColumn").DataBodyRange
    Debug.Print x
Next
于 2021-11-17T13:38:20.570 回答