如何在Excel vba中引用表?

121*_*llo 29 excel vba excel-vba listobject excel-tables

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

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

Sheets("Sheet1").Table("A_Table").Select
Run Code Online (Sandbox Code Playgroud)

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

Gle*_*owa 82

OP问,是否可以引用表,而不是如何添加表.所以工作相当于

Sheets("Sheet1").Table("A_Table").Select
Run Code Online (Sandbox Code Playgroud)

就是这句话:

Sheets("Sheet1").ListObjects("A_Table").Range.Select
Run Code Online (Sandbox Code Playgroud)

或选择部分(如表中的数据):

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
Run Code Online (Sandbox Code Playgroud)

对于部件,您可能希望在选择之前测试标头和总计行的存在.

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

  • _"Excel中的表格非常有意义,但它们在VBA中很难使用!"_告诉我这件事!为什么他们不能像数据库表一样被查询? (3认同)

And*_*ewD 27

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
Run Code Online (Sandbox Code Playgroud)

这里还有一些很好的ListObject信息.

  • 顺便说一句,不要期望在Application.Names中找到表DataBodyRange范围名称!但是绝对可以使用Application.Range(...)来访问它们。 (2认同)
  • 这种方式似乎只有在包含所需表的工作簿当前处于活动状态时才有效.如果以某种方式运行代码并激活另一个文件,则此方法将失败.与"ActiveSheet"对象的方法相同. (2认同)
  • 您对范围以某种方式从表名称中重命名的不满警告,这不仅适用于表,而且适用于所有命名范围......它似乎能够处理用户无意中重命名工作表......或重新设计各种名称单元格被重新映射到不同的工作表...当一个函数与多个工作表上的内容交互时[或者即使它们最初都在 ActiveSheet 上,但可能不会在以后],而不需要 VB 编辑。似乎灵活性(也许我不具备 VBA 专业知识,我不明白如何处理此类更改?),似乎至关重要 (2认同)

san*_*ica 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
Run Code Online (Sandbox Code Playgroud)

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


Bgv*_*983 6

也许这可以帮到你

创建一个表

将范围转换为表格的方式与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
Run Code Online (Sandbox Code Playgroud)


Hug*_*ves 5

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

Dim LO As ListObject
Set LO = ActiveSheet.ListObjects("YourListObjectName")
Run Code Online (Sandbox Code Playgroud)

但是我认为这仅在您要引用活动工作表上的列表对象时才有效。

我找到了您的问题,因为我想引用另一个工作表上的数据透视表所引用的一个工作表上的列表对象(表)。由于列表对象是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
Run Code Online (Sandbox Code Playgroud)

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


Gol*_*Jer 5

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

  1. SheetObject.ListObjects("表名")
  2. Application.Range("TableName").ListObject
  3. [表名].ListObject

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