我目前正在处理一个数据集,该数据集格式化为带有标题的表格。我需要做的是循环遍历特定列中的所有单元格并更改内容。通过对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
当然,我知道这种语法不正确,但希望它足以说明我的目标。
答案 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中的某些命名列的值(Yes
,No
,Maybe
)将表转换为文本}}标签上的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
的条目。