現在、ヘッダー付きのテーブルとしてフォーマットされたデータセットで作業しています。私がする必要があるのは、特定の列のすべてのセルを循環させ、内容を変更することです。 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
もちろん、その構文が間違っていることは知っていますが、うまくいけば私の目標を十分に示しています。
割り当て前に列を検索できます。
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
ヘッダー名がわかっている場合は、それに基づいて列を見つけることができます。
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
テーブルが「Table1」と呼ばれ、列が「Column1」と呼ばれる場合:
For i = 1 To ListObjects("Table1").ListRows.Count
ListObjects("Table1").ListColumns("Column1").DataBodyRange(i) = "PHEV"
Next i
私は同じ問題に遭遇しましたが、フォーラムは私を助けることができませんでした、数分後に私はアイデアを思い付きました:
match(ColumnHeader,Table1[#Headers],0)
これにより、番号が返されます。
上記の答えはどれも私の問題に役立たなかったので、ここでは各行から特定の(名前の付いた)列を抽出するための私のソリューションです。
I 名前付き列の値を使用してテーブルをテキストに変換(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
のエントリを抽出することです。
テーブル内の列のセルをループするには、位置ではなく名前だけを知ることができます。テーブルがワークブックの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
これは、テーブル内の列の数値位置を返します。
テーブルの最後の列を見つけて、ループ処理してセルを埋めることができます。
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