wake-up-neo.com

Wie verweise ich in Excel vba auf Tabellen?

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 ...

28
1212__Hello

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
6
Bgvv1983

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!

80
GlennFromIowa

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 .

26
AndrewD

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.

7
sancho.s

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.

5
Hugh Seagraves