Excel VBAで名前付きテーブルを参照することは可能ですか?
仮説的には、これは可能性があります...
Sheets("Sheet1").Table("A_Table").Select
テーブルがリストオブジェクトであるという言及を見たことがありますが、それが同じかどうかはわかりません。
Excel VBAで名前付きテーブルを参照することは可能ですか?
仮説的には、これは可能性があります...
Sheets("Sheet1").Table("A_Table").Select
テーブルがリストオブジェクトであるという言及を見たことがありますが、それが同じかどうかはわかりません。
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 で操作するのは非常に困難です。
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 情報がここにあります。
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.