web-dev-qa-db-ja.com

テーブル列のすべての行、Excel-VBAをループする

現在、ヘッダー付きのテーブルとしてフォーマットされたデータセットで作業しています。私がする必要があるのは、特定の列のすべてのセルを循環させ、内容を変更することです。 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

もちろん、その構文が間違っていることは知っていますが、うまくいけば私の目標を十分に示しています。

11
detroitwilly

割り当て前に列を検索できます。

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
10
LS_ᴅᴇᴠ

これが実際に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を使用します。

21
David Zemens

テーブルが「Table1」と呼ばれ、必要な列が「Column」であると仮定すると、これを試すことができます:

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

ヘッダー名がわかっている場合は、それに基づいて列を見つけることができます。

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
2
Joseph

テーブルが「Table1」と呼ばれ、列が「Column1」と呼ばれる場合:

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

私は同じ問題に遭遇しましたが、フォーラムは私を助けることができませんでした、数分後に私はアイデアを思い付きました:

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

これにより、番号が返されます。

1
Javier

上記の答えはどれも私の問題に役立たなかったので、ここでは各行から特定の(名前の付いた)列を抽出するための私のソリューションです。

I 名前付き列の値を使用してテーブルをテキストに変換YesNoMaybe)名前付き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のエントリを抽出することです。

0
B--rian

テーブル内の列のセルをループするには、位置ではなく名前だけを知ることができます。テーブルがワークブックの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

これは、テーブル内の列の数値位置を返します。

0
The Dude

テーブルの最後の列を見つけて、ループ処理してセルを埋めることができます。

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
0
Santosh