16

Excel 2010 以降、Excel 内で多くのテーブルを使用しています。たとえば、「ID」、「名」、「姓」の 3 つの列を持つテーブル「tabWorkers」があります。

[] を使用して VBA でテーブルを参照できることは既にわかりました。

例えば:

Dim row As Range
For Each row In [tabWorkers].Rows
    MsgBox (row.Columns(2).Value)
Next

これにより、すべての行のファーストネームが得られ、うまく機能します。しかし、次のような列の名前を使用して、より動的にしたいと考えています。

Dim row As Range
For Each row In [tabWorkers].Rows
    MsgBox (row.Columns("Firstname").Value)
Next

もちろん、列インデックス '2' を FirstnameIndex のような var にバインドするルックアップを作成することもできますが、正しい構文が必要です。可能だと確信していますが、実際には文書化されていません([tabWorkers].Rowsのように)

4

8 に答える 8

19

テーブルを参照する簡単な方法にはあまり慣れていません。答えが得られない場合は、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
于 2012-09-19T14:50:06.947 に答える
8

これを試して:

Dim row as Range
For Each row in [tabWorkers[first name]].Rows
     MsgBox row.Value
Next
于 2013-09-20T15:39:02.597 に答える
8

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

ついに今日、ペニーが落ち、私を悩ませていたのと同じ質問をしている人々を助けるために共有したいものを見つけました.

簡単に言えば、質問は次のとおりでした。テーブルの部分の標準名を使用して、vba でテーブルの行を参照する方法。それは非常に簡単であることがわかりました。テーブルの特定の行を参照し、さらに変数を再定義する必要なく、実際の名前で列を呼び出すことができます。

構成は次のようになります: Range("TableName[ColumnName]")(RowNumber)

ここで、TableName と ColumnName は Excelside の標準のテーブルと列の名前で、RowNumber は 1 から Range("Table1").Rows.Count までの行番号の単純な整数インデックスです。

ID と Data という列を持つ 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) ビットをスキップして Range を直接使用できます。したがって、Colour、Size、Height という列を持つ Params というテーブルは、Range("Params[Colour]") または Range("Params[Height]") などを使用して参照できます。:-)

この発見により、Tables の虜になりました。それらは、読みやすく互換性のある方法で、vba とシートの間の非常に整然としたリンクを提供してくれます。

ありがとうマイクロソフト!

ボブ・ジョーダン

于 2014-08-07T10:38:48.797 に答える
3

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

Dim rng as Range
Set rng = Application.Range("Tablename[Columnname]")

テーブル名はワークブック全体で一意であるため、ワークブックを参照するだけで済みます。ただし、開いている別のワークブックに同じ名前のテーブルがある場合、これは両方またはバックグラウンドのワークブックではなく、アクティブなワークブックに影響します。これを防ぐには、テーブルが存在する実際のシートの範囲オブジェクトを呼び出す必要があります。

うまくいけば、これは私が上で説明した方法でそれができることを示します:

たとえば、Access データベースに、作成した Excel ドキュメントのテーブルに条件付き書式を適用するメソッドがありますCopyFromRecordSet

の署名があるもの

Private Function HighlightBlankOrZeroColumn(RangeToFormat As Range, HighlightColor As Long)

そして私はこのように呼びます

HighlightBlankOrZeroColumn ApXL.Range("Table1[" & SoucreRst.Fields(intCount).Name & "]"), BlankOrZeroColor

ApXLは で、New Excel.ApplicationSoucreRstADO レコードセットです。

その時点で、私はすでに Recordset を作成していました --> 次の 2 つのメソッドを呼び出してテーブルを範囲設定します。

xlWSh.ListObjects.Add(xlSrcRange, xlWSh.UsedRange, , xlYes).Name = "Table1"
xlWSh.ListObjects("Table1").TableStyle = "TableStyleLight16"
于 2012-09-19T14:27:47.710 に答える
3

Excel 2007でテストされたより簡潔:

Dim row As Range
For Each row In [tabWorkers].Rows
    MsgBox Intersect (row,[tabWorkers[FirstName]]).Value
Next
于 2016-02-11T15:17:26.487 に答える
0

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

Dim row As Range
For Each row In [tabWorkers].Rows
    MsgBox (row.Columns(row.ListObject.ListColumns("Firstname").Index).Value)
Next
于 2012-09-20T07:49:41.910 に答える
0

こちらも初投稿です。質問してからずいぶん経ちますが、参考になれば幸いです。

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

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
于 2017-09-01T00:43:09.667 に答える