Цикл по всем строкам в столбце таблицы, 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
Другие вопросы по тегам