Ist es in Excel VBA möglich, auf eine benannte Tabelle zu verweisen?
Hypothetisch könnte dies sein ...
Sheets("Sheet1").Table("A_Table").Select
Ich habe schon erwähnt, dass Tabellen ein Listenobjekt sind, bin mir aber nicht sicher, ob das dasselbe ist ...
Vielleicht kann dir das helfen
Eine Tabelle erstellen
Das Konvertieren eines Bereichs in eine Tabelle beginnt mit demselben Code wie in Excel 2003 (wie in diese Antwort beschrieben):
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
Das OP fragte, ist es möglich, eine Tabelle zu referenzieren, keine Tabelle hinzuzufügen. Also das Arbeitsäquivalent von
Sheets("Sheet1").Table("A_Table").Select
wäre diese Aussage:
Sheets("Sheet1").ListObjects("A_Table").Range.Select
oder Teile auswählen (wie nur die Daten in der Tabelle):
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
Für die Teile möchten Sie möglicherweise die Existenz der Kopf- und Summenzeilen testen, bevor Sie sie auswählen.
Und im Ernst, dies ist die einzige Frage zum Verweisen auf Tabellen in VBA in SO? Tabellen in Excel sind sehr sinnvoll, aber in VBA so schwer zu bearbeiten!
Eine "Tabelle" in Excel ist in der Tat als ListObject bekannt.
Die "richtige" Art, auf eine Tabelle zu verweisen, besteht darin, ihr ListObject aus ihrem Arbeitsblatt abzurufen, d. H. SheetObject.ListObjects(ListObjectName)
.
Wenn Sie auf eine Tabelle verweisen möchten, ohne das Blatt zu verwenden, können Sie einen Hack Application.Range(ListObjectName).ListObject
verwenden.
HINWEIS: Dieser Hack basiert auf der Tatsache, dass Excel immer einen benannten Bereich für den DataBodyRange der Tabelle mit demselben Namen erstellt wie der Tisch. Allerdings kann dieser Bereichsname kann geändert werden ... obwohl dies nicht unbedingt gewünscht ist, da der Name zurückgesetzt wird, wenn Sie den Tabellennamen bearbeiten! Sie könnten auch einen benannten Bereich ohne zugeordnetes ListObject erhalten.
In Anbetracht der nicht sehr hilfreichen 1004-Fehlermeldung von Excel, wenn Sie den falschen Namen erhalten, möchten Sie möglicherweise einen Wrapper erstellen ...
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
Auch ein paar gute ListObject-Infos hier .
Außerdem ist es bequem, Variablen zu definieren, die sich auf Objekte beziehen. Zum Beispiel,
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
Sie werden es wahrscheinlich sofort vorteilhaft finden.
Darüber hinaus können Sie dies tun (wobei "YourListObjectName" der Name Ihrer Tabelle ist):
Dim LO As ListObject
Set LO = ActiveSheet.ListObjects("YourListObjectName")
Aber ich denke, das funktioniert nur, wenn Sie auf ein Listenobjekt verweisen möchten, das sich auf dem aktiven Blatt befindet.
Ich habe Ihre Frage gefunden, weil ich auf ein Listenobjekt (eine Tabelle) in einem Arbeitsblatt verweisen wollte, auf das sich eine Pivot-Tabelle in einem anderen Arbeitsblatt bezieht. Da Listenobjekte Teil der Worksheets-Auflistung sind, müssen Sie den Namen des Arbeitsblatts kennen, auf dem sich das Listenobjekt befindet, um darauf zu verweisen. Um den Namen des Arbeitsblatts zu erhalten, auf dem sich das Listenobjekt befindet, habe ich den Namen des Quelllistenobjekts der Pivot-Tabelle (wieder eine Tabelle) abgerufen und die Arbeitsblätter und ihre Listenobjekte durchlaufen, bis ich das Arbeitsblatt gefunden habe, das die Liste enthielt Objekt, nach dem ich gesucht habe.
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
Vielleicht kennt jemand einen direkteren Weg.