39

Excel VBAで名前付きテーブルを参照することは可能ですか?

仮説的には、これは可能性があります...

Sheets("Sheet1").Table("A_Table").Select

テーブルがリストオブジェクトであるという言及を見たことがありますが、それが同じかどうかはわかりません。

4

6 に答える 6

104

OPは、テーブルを追加する方法ではなく、テーブルを参照することは可能ですかと尋ねました。したがって、同等の作業

Sheets("Sheet1").Table("A_Table").Select

次のステートメントになります。

Sheets("Sheet1").ListObjects("A_Table").Range.Select

または部分を選択する (テーブル内のデータのみなど):

Dim LO As ListObject
Set LO = Sheets("Sheet1").ListObjects("A_Table")
LO.HeaderRowRange.Select        ' Select just header row
LO.DataBodyRange.Select         ' Select just data cells
LO.TotalsRowRange.Select        ' Select just totals row

パーツについては、それらを選択する前にヘッダー行と合計行の存在をテストすることができます。

そして真剣に、これは SO で VBA のテーブルを参照することに関する唯一の質問ですか? Excel の表は非常に理にかなっていますが、VBA で操作するのは非常に困難です。

于 2014-06-20T22:38:57.683 に答える
30

Excel の「テーブル」は実際には ListObject として知られています。

テーブルを参照する「適切な」方法は、ワークシートから ListObject を取得することSheetObject.ListObjects(ListObjectName)です。

シートを使用せずに表を参照したい場合は、ハックを使用できますApplication.Range(ListObjectName).ListObject

注:このハックは、Excel が常にテーブルのDataBodyRangeの名前付き範囲をテーブルと同じ名前で作成するという事実に依存しています。ただし、この範囲名は変更できます...ただし、テーブル名を編集すると名前がリセットされるため、やりたいことではありません! また、 ListObjectが関連付けられていない名前付き範囲を取得することもできます。

名前を間違えたときの Excel のあまり役に立たない 1004 エラー メッセージを考えると、ラッパーを作成する必要があるかもしれません...

Public Function GetListObject(ByVal ListObjectName As String, Optional ParentWorksheet As Worksheet = Nothing) As Excel.ListObject
On Error Resume Next

    If (Not ParentWorksheet Is Nothing) Then
        Set GetListObject = ParentWorksheet.ListObjects(ListObjectName)
    Else
        Set GetListObject = Application.Range(ListObjectName).ListObject
    End If

On Error GoTo 0 'Or your error handler

    If (Not GetListObject Is Nothing) Then
        'Success
    ElseIf (Not ParentWorksheet Is Nothing) Then
        Call Err.Raise(1004, ThisWorkBook.Name, "ListObject '" & ListObjectName & "' not found on sheet '" & ParentWorksheet.Name & "'!")
    Else
        Call Err.Raise(1004, ThisWorkBook.Name, "ListObject '" & ListObjectName & "' not found!")
    End If

End Function

また、いくつかの優れた ListObject 情報がここにあります

于 2015-02-03T03:53:03.220 に答える
6

In addition to the above, you can do this (where "YourListObjectName" is the name of your table):

Dim LO As ListObject
Set LO = ActiveSheet.ListObjects("YourListObjectName")

But I think that only works if you want to reference a list object that's on the active sheet.

I found your question because I wanted to refer to a list object (a table) on one worksheet that a pivot table on a different worksheet refers to. Since list objects are part of the Worksheets collection, you have to know the name of the worksheet that list object is on in order to refer to it. So to get the name of the worksheet that the list object is on, I got the name of the pivot table's source list object (again, a table) and looped through the worksheets and their list objects until I found the worksheet that contained the list object I was looking for.

Public Sub GetListObjectWorksheet()
' Get the name of the worksheet that contains the data
' that is the pivot table's source data.

    Dim WB As Workbook
    Set WB = ActiveWorkbook

    ' Create a PivotTable object and set it to be
    ' the pivot table in the active cell:
    Dim PT As PivotTable
    Set PT = ActiveCell.PivotTable

    Dim LO As ListObject
    Dim LOWS As Worksheet

    ' Loop through the worksheets and each worksheet's list objects
    ' to find the name of the worksheet that contains the list object
    ' that the pivot table uses as its source data:
    Dim WS As Worksheet
    For Each WS In WB.Worksheets
        ' Loop through the ListObjects in each workshet:
        For Each LO In WS.ListObjects
            ' If the ListObject's name is the name of the pivot table's soure data,
            ' set the LOWS to be the worksheet that contains the list object:
            If LO.Name = PT.SourceData Then
                Set LOWS = WB.Worksheets(LO.Parent.Name)
            End If
        Next LO
    Next WS

    Debug.Print LOWS.Name

End Sub

Maybe someone knows a more direct way.

于 2014-01-23T23:43:02.260 に答える