web-dev-qa-db-ja.com

彼の名前と列の参照を使用して、Excel 2010テーブルをループするにはどうすればよいですか?

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のように)

16
Tiele Declercq

私は、テーブルを参照する速記方法にあまり詳しくありません。回答が得られない場合は、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
18
Doug Glancy

これを試して:

Dim row as Range
For Each row in [tabWorkers[first name]].Rows
     MsgBox row.Value
Next
8
Spencer Hutton

私もこの質問を熟考し、本当に良い答えを見つけることなく検索して検索しました

最終的に今日ペニーは落ち、私は私を悩ませていた同じ質問で続く人々を助けるために私が共有したいと思う何かを見つけた。

簡単に言えば、問題は、テーブルの部分の標準名を使用して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

7
user2092957

より簡潔で、Excel 2007でテスト済み:

Dim row As Range
For Each row In [tabWorkers].Rows
    MsgBox Intersect (row,[tabWorkers[FirstName]]).Value
Next
3
Antoni Gual Via

私は通常このようにします

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

ここで、ApXLNew Excel.ApplicationSoucreRstはADOレコードセットです。

その時点までに、これらの2つのメソッドを呼び出して、レコードセット->範囲のテーブルを作成しました。

xlWSh.ListObjects.Add(xlSrcRange, xlWSh.UsedRange, , xlYes).Name = "Table1"
xlWSh.ListObjects("Table1").TableStyle = "TableStyleLight16"
3
Brad

ダグありがとう!それは大いに役立ちました。実例:

Dim row As Range
For Each row In [tabWorkers].Rows
    MsgBox (row.Columns(row.ListObject.ListColumns("Firstname").Index).Value)
Next
0
Tiele Declercq

これも私の最初の投稿です。質問が出されてから長い時間が経ちましたが、とにかく助けになることを願っています。

主なアイデアは、コードの断片をできるだけきれいに保つことです。

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
0
Ciro Rocha