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中很难使用!
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信息.
此外,定义引用对象的变量很方便.例如,
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)
你可能会立刻发现它有利.
也许这可以帮到你
创建一个表
将范围转换为表格的方式与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)
除了上述之外,您还可以执行以下操作(其中“ 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)
也许有人知道更直接的方法。
添加第三个选项。@AndrewD 第二个选项的“简写”版本。
是的,括号引用中没有引号。
| 归档时间: |
|
| 查看次数: |
133966 次 |
| 最近记录: |