在Excel VBA中,是否可以引用一个已命名的表格?
假设这可能是...
Sheets("Sheet1").Table("A_Table").Select
我看到有人提到表格是列表对象,但我不确定它是否是同一件事。
在Excel VBA中,是否可以引用一个已命名的表格?
假设这可能是...
Sheets("Sheet1").Table("A_Table").Select
我看到有人提到表格是列表对象,但我不确定它是否是同一件事。
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的好信息,在这里。
Application.Names
中不要期望找到表格的DataBodyRange范围名称!但是它们可以使用Application.Range(...)
访问。 - AndrewDActiveSheet
对象相同的方法。 - tm-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
Dim LO As ListObject
Set LO = ActiveSheet.ListObjects("YourListObjectName")
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
添加第三个选项。
是的,在方括号引用中没有引号。
按照这个答案中所述,将范围转换为表格:
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