Цикл по всем строкам в столбце таблицы, Excel-VBA
В настоящее время я работаю над набором данных, который отформатирован в виде таблицы с заголовками. Что мне нужно сделать, это перебрать все ячейки в определенном столбце и изменить содержимое. Благодаря исследованию MSDN я придумал следующее для цикла
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
Конечно, я знаю, что этот синтаксис неправильный, но, надеюсь, он достаточно иллюстрирует мою цель.
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
Если это на самом деле 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
,
Предполагая, что ваша таблица называется "Table1", а необходимый вам столбец - "Column", вы можете попробовать это:
for i = 1 to Range("Table1").Rows.Count
Range("Table1[Column]")(i)="PHEV"
next i
Предполагая, что ваша таблица называется "Table1", а ваш столбец называется "Column1", тогда:
For i = 1 To ListObjects("Table1").ListRows.Count
ListObjects("Table1").ListColumns("Column1").DataBodyRange(i) = "PHEV"
Next i
Вы можете циклически проходить по ячейкам любого столбца в таблице, зная только его имя, а не его положение. Если таблица находится на листе 1 рабочей книги:
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
Это возвращает числовую позицию столбца в таблице.
Если вы знаете имя заголовка, вы можете найти столбец на основе этого:
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)
Это вернет вам номер.
Я немного изменил ответ SnitkaSirk . Это простой способ перебора ячеек объекта списка, например, в столбце:
Dim cell As Range
For Each cell In ListObjects("NameOfTable").ListColumns("HeaderNameOfColumn").DataBodyRange
Debug.Print x
Next
Поскольку ни один из приведенных выше ответов не помог мне с моей проблемой, здесь мое решение извлечь определенный (именованный) столбец из каждой строки.
Я преобразовываю таблицу в текст, используя значения некоторых именованных столбцов (Yes
, No
, Maybe
) в именованной таблице Excel myTable
на вкладке mySheet
используя следующий (Excel) фрагмент VBA:
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
в ряду i
,
Вы можете найти последний столбец таблицы и затем заполнить ячейку, пройдя по ней.
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