如何在Excel vba中引用表?

时间:2013-08-03 07:55:11

标签: excel vba excel-vba listobject excel-tables

Excel VBA中是否可以引用命名表?

假设这可能是......

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

我已经看到一些提到表是列表对象但是我不确定这是否是同样的事情......

6 个答案:

答案 0 :(得分:79)

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中很难使用!

答案 1 :(得分:24)

A" table"在Excel中确实称为ListObject。

"适当"引用表的方法是从其工作表中获取ListObject,即SheetObject.ListObjects(ListObjectName)

如果您想在不使用工作表的情况下引用表格,可以使用hack Application.Range(ListObjectName).ListObject

注意:此hack依赖于以下事实: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信息here

答案 2 :(得分:7)

此外,定义引用对象的变量很方便。例如,

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

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

答案 3 :(得分:6)

也许这可以帮到你

创建表

将范围转换为表格的方式与Excel 2003中的代码相同(如this answer中所述):

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

答案 4 :(得分:5)

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

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

但我认为只有在您想引用活动工作表上的列表对象时才有效。

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

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

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

答案 5 :(得分:1)

添加第三个选项。 @AndrewD的第二个选项的“简写”版本。

  1. SheetObject.ListObjects(“ TableName”)
  2. Application.Range(“ TableName”)。ListObject
  3. [TableName] .ListObject

是的,括号引用中没有引号。