如何在Excel VBA中引用表?

在Excel VBA中可以引用一个指定的表吗?

假设这可能是…

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

我已经看到一些表是列表对象,但我不知道这是否是同一件事…

任何人都可以帮助我?

也许这可以帮助你

创build一个表

将一个范围转换为一个表,开始于Excel 2003中的相同代码(如本答案所述 ):

 Sub CreateTable() ActiveSheet.ListObjects.Add(xlSrcRange, Range("$B$1:$D$16"), , xlYes).Name = _ "Table1" 'No go in 2003 ActiveSheet.ListObjects("Table1").TableStyle = "TableStyleLight2" End Sub 

OP询问,是否可以引用一个表 ,而不是如何添加一个表。 所以相当于

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

会是这样的说法:

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

或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 

对于这些部分,您可能需要在select它们之前testing标题和总计行的存在。

严重的是,这是在SO中引用VBA表的唯一问题? Excel中的表格非常有意义,但是在VBA中很难使用!

引用表的“正确”方法是从它的工作表,即SheetObject.ListObjects(ListObjectName)获取它的ListObject。

如果你想引用一张表而不使用工作表,你可以使用一个黑客Application.Range(ListObjectName).ListObject

注意:这个hack依赖于这样的事实,即Excel总是为表的DataBodyRange创build一个与表名相同的命名范围。 然而,这个范围名称可以改变…虽然这不是你想要做的事情,因为如果你编辑表名称,名称将被重置! 你也可以得到一个没有关联ListObject的命名范围。

鉴于Excel的不是非常有用的1004错误消息,当你得到错误的名称,你可能想要创build一个包装…

 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信息。

另外,定义引用对象的variables也很方便。 例如,

 Sub CreateTable() Dim lo as ListObject Set lo = ActiveSheet.ListObjects.Add(xlSrcRange, Range("$B$1:$D$16"), , xlYes) lo.Name = "Table1" lo.TableStyle = "TableStyleLight2" ... End Sub 

你可能会立即发现它有利。

除上述之外,您可以执行此操作(其中“YourListObjectName”是您的表的名称):

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

但我认为只有当你想引用活动表单上的列表对象时才有效。

我发现你的问题,因为我想引用一个工作表上不同的工作表上的数据透视表引用的列表对象(表)。 由于列表对象是Worksheets集合的一部分,因此您必须知道列表对象所在的工作表的名称才能引用它。 因此,要获取列表对象所在工作表的名称,我得到了数据透视表的源列表对象(同样是一个表)的名称,然后遍历工作表及其列表对象,直到find包含列表的工作表我正在寻找的对象。

 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 

也许有人知道更直接的方式。