Excel 2010以降、Excel内で多くのテーブルを使用しています。たとえば、「ID」、「名」、「姓」の3つの列を持つテーブル「tabWorkers」があります。
[]を使用してVBAのテーブルを参照できることがすでにわかっています。例えば:
Dim row As Range
For Each row In [tabWorkers].Rows
MsgBox (row.Columns(2).Value)
Next
これにより、すべての行のFirstnameがわかりやすくなります。
Dim row As Range
For Each row In [tabWorkers].Rows
MsgBox (row.Columns("Firstname").Value)
Next
もちろん、列インデックス '2'をFirstnameIndexのようなvarにバインドする何らかの検索を行うこともできますが、正しい構文が必要です。私はそれが可能であると確信していますが、実際には文書化されていません([tabWorkers] .Rowsのように)
私は、テーブルを参照する速記方法にあまり詳しくありません。回答が得られない場合は、ListOjectモデルを使用する次のような便利なメソッドが役立つ場合があります。
Sub ListTableColumnMembers()
Dim lo As Excel.ListObject
Dim ws As Excel.Worksheet
Dim lr As Excel.ListRow
Set ws = ThisWorkbook.Worksheets(2)
Set lo = ws.ListObjects("tabWorkers")
For Each lr In lo.ListRows
Debug.Print Intersect(lr.Range, lo.ListColumns("FirstName").Range).Value
Next lr
End Sub
これを試して:
Dim row as Range
For Each row in [tabWorkers[first name]].Rows
MsgBox row.Value
Next
私もこの質問を熟考し、本当に良い答えを見つけることなく検索して検索しました
最終的に今日ペニーは落ち、私は私を悩ませていた同じ質問で続く人々を助けるために私が共有したいと思う何かを見つけた。
簡単に言えば、問題は、テーブルの部分の標準名を使用してvbaのテーブルの行を参照する方法でした。非常に簡単であることがわかりました。テーブルの特定の行を参照し、それ以上の変数を再定義することなく、実際の名前で列を呼び出すことができます。
構成は次のようになります。Range( "TableName [ColumnName]")(RowNumber)
ここで、TableNameとColumnNameはExcelsideの標準のテーブル名と列名であり、RowNumberは1からRange( "Table1")。Rows.Countまでの行番号の単純な整数インデックスです。
IDとデータと呼ばれる列を持つTable1と呼ばれる2列のテーブルの場合、この構造を使用してテーブル要素をループできます。
For Rw = 1 To Range("Table1").Rows.Count
MsgBox(Range("Table1[ID]")(Rw) & "has value" & Range("Table1[Data]")(Rw) )
Next Rw
これにより、Excelで使用されるものと非常によく似た構造が維持され、追加の命名は不要です。そしてそれはとても読みやすいです!必要に応じて、その(Rw)部分の後に、.Text、.Value、.Formulaなどの適切な範囲修飾子を追加することもできます。
単一の行テーブル(パラメータ用など)がある場合、またはより大きなテーブルの最初の行を参照する場合は、(Rw)ビットをスキップして、範囲を直接使用できます。したがって、色、サイズ、高さという列のあるParamsという表は、Range( "Params [Colour]")またはRange( "Params [Height]")などを使用して参照できます。 :-)
この発見は本当にテーブルに夢中になりました。読みやすく互換性のある方法で、vbaとシート間の非常に整然としたリンクを提供してくれます。
マイクロソフトありがとうございます!
ボブ・ジョーダンB
より簡潔で、Excel 2007でテスト済み:
Dim row As Range
For Each row In [tabWorkers].Rows
MsgBox Intersect (row,[tabWorkers[FirstName]]).Value
Next
私は通常このようにします
Dim rng as Range
Set rng = Application.Range("Tablename[Columnname]")
テーブル名はワークブック全体で一意であるため、ワークブックを参照するだけで済みます。ただし、開いているさまざまなワークブックに同じ名前のテーブルがある場合、これはアクティブなワークブックに影響し、両方またはバックグラウンドのワークブックには影響しません。それを防ぐには、テーブルが存在する実際のシートの範囲オブジェクトを呼び出す必要があります。
うまくいけば、これは上記で説明した方法で実行できることを示しています。
たとえば、Excelデータベースのテーブルに条件付き書式を適用するAccessデータベースにメソッドがあり、CopyFromRecordSet
を使用して作成してデータを入力します。
の署名があります
Private Function HighlightBlankOrZeroColumn(RangeToFormat As Range, HighlightColor As Long)
そして、私はこのように呼び出します
HighlightBlankOrZeroColumn ApXL.Range("Table1[" & SoucreRst.Fields(intCount).Name & "]"), BlankOrZeroColor
ここで、ApXL
はNew Excel.Application
とSoucreRst
はADOレコードセットです。
その時点までに、これらの2つのメソッドを呼び出して、レコードセット->範囲のテーブルを作成しました。
xlWSh.ListObjects.Add(xlSrcRange, xlWSh.UsedRange, , xlYes).Name = "Table1"
xlWSh.ListObjects("Table1").TableStyle = "TableStyleLight16"
ダグありがとう!それは大いに役立ちました。実例:
Dim row As Range
For Each row In [tabWorkers].Rows
MsgBox (row.Columns(row.ListObject.ListColumns("Firstname").Index).Value)
Next
これも私の最初の投稿です。質問が出されてから長い時間が経ちましたが、とにかく助けになることを願っています。
主なアイデアは、コードの断片をできるだけきれいに保つことです。
Set selrange = Selection.EntireRow
For Each rrow In selrange.Rows
selrange.Parent.Parent.Names.Add "rrow", rrow
name = [table1[name] rrow].Text
age = [table1[age] rrow].Text
gender = [table1[gender] rrow].Text
Next
selrange.Parent.Parent.Names("rrow").Delete