2013-08-03 12 views
15

Ist es in Excel VBA möglich, eine benannte Tabelle zu referenzieren?Wie referenziere ich Tabellen in Excel VBA?

könnte hypothetisch sein ...

Sheets("Sheet1").Table("A_Table").Select 

Ich habe einige Erwähnung von Tabellen gesehen Objekt einer Liste zu sein, aber ich bin mir nicht sicher, ob das ist die gleiche ...

Antwort

5

Vielleicht

Erstellen einer Tabelle

einen Bereich in eine Tabelle konvertieren beginnt mit dem gleichen Code kann Ihnen helfen, wie in Excel 2003 (wie in this answer 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 
+1

Sieht gut aus, danke dafür! –

6

Darüber hinaus ist es bequem, Variablen zu Objekten zu definieren. 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.

4

Zusätzlich zu den oben genannten, können Sie dies tun (wobei „YourListObjectName“ ist der Name der Tabelle):

Dim LO As ListObject 
Set LO = ActiveSheet.ListObjects("YourListObjectName") 

Aber ich denke, das funktioniert nur, wenn Sie eine Liste Objekt verweisen möchten, die auf ist das aktive Blatt.

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 Bezug zu nehmen. Um den Namen des Arbeitsblatts zu erhalten, auf dem sich das Listenobjekt befindet, erhielt ich den Namen des Quelllistenobjekts der Pivot-Tabelle (wiederum eine Tabelle) und durchblätterte die Arbeitsblätter und ihre Listenobjekte, bis ich das Arbeitsblatt gefunden hatte, 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 weiß jemand einen direkteren Weg.

+0

Gegeben, was @AndrewD über die möglichen Unzulänglichkeiten der application.range-Methode geschrieben hat, scheint dies die einzige zuverlässige Methode zu sein, um das ListObject einer Tabelle zu erhalten, die nur den Tabellennamen verwendet. – ChrisB

+0

Abgesehen von ** creating ** der _PivotTable_ in Ihrem Code, was wahrscheinlich nicht Ihre Absicht war, denke ich, dass Ihr Weg so direkt wie möglich ist. Ich habe versucht, eine generische Funktion hinzuzufügen, um ein _ListObject_ einen _PivotTable_ Namen zu geben, aber anscheinend ist das nicht koscher. Also habe ich beschlossen, eine neue [Frage] (https://stackoverflow.com/questions/46106440/how-can-i-get-the-listobject-object-of-a-pivottable/46106441#46106441) zu erstellen und diese bereitzustellen Code als Antwort. Aber ich habe deine Antwort hier hochgeladen, weil das ein vorhersehbares Bedürfnis ist, ein _ListObject_ aus dem _PivotTable_ Name zu bekommen. – GlennFromIowa

49

Das OP fragte, ist es möglich, Referenz eine Tabelle, nicht, wie Sie eine Tabelle hinzufügen. So ist die Arbeits Äquivalent

Sheets("Sheet1").Table("A_Table").Select 

würde diese Aussage sein:

Sheets("Sheet1").ListObjects("A_Table").Range.Select 

oder Teile zu wä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, Sie Möglicherweise möchten Sie die Existenz der Kopfzeilen- und Summenzeilen testen, bevor Sie sie auswählen.

Und ernsthaft, das ist die einzige Frage zum Verweisen auf Tabellen in VBA in SO? Tabellen in Excel machen so viel Sinn, aber es ist so schwer mit VBA zu arbeiten!

+0

Wie können wir Tabellen in VBA-Abfrage verwenden, wie wir für Sheets zum Beispiel "select * from [sheet1 $] where col1 = 'x'" – Vikky

+0

@Vikky Ich bin nicht vertraut mit der VBA-Abfrage, die Sie verweisen, aber bin fasziniert von es. Haben Sie einen Link zur Dokumentation (MSDN oder anders) für diese Art von Abfrage? Wird dies verwendet, wenn Excel von einer anderen Anwendung oder einem anderen Tool über OLE oder ODBC referenziert wird? Wenn ja, welche Anwendung? – GlennFromIowa

+0

Zuerst möchte ich Ihnen für die Antwort danken. Ich habe eine Lösung für meine Frage gefunden, Tabellen innerhalb von Excel können mit oledb verwendet werden. Dies ist der Link des Artikels, der mir hilft http://chandoo.org/wp/2012/04/02/using-excel-as-your-database/ – Vikky

16

Die "richtige" Möglichkeit, eine Tabelle zu referenzieren, besteht darin, ihr ListObject aus ihrem Worksheet zu beziehen, d. H. SheetObject.ListObjects(ListObjectName).Wenn Sie eine Tabelle referenzieren möchten, ohne das Blatt zu verwenden, können Sie einen Hack Application.Range(ListObjectName).ListObject verwenden.

HINWEIS: Dieser Hack beruht auf der Tatsache, dass Excel erstellt stets einen benannten Bereich für die DataBodyRange mit dem gleichen Namen der Tabelle als die Tabelle. Allerdings kann dieser Bereichsname geändert werden ... obwohl es nicht etwas ist, was Sie tun möchten, da der Name zurückgesetzt wird, wenn Sie den Tabellennamen bearbeiten! Sie könnten auch einen benannten Bereich ohne zugeordnete ListObject erhalten.

Da Excel nicht-sehr-nützlich 1004 Fehlermeldung, wenn Sie den Namen falsch, möchten Sie vielleicht 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 einige gute Listobject Info here.

+1

BTW Erwarten Sie nicht zu Finden Sie die Tabelle DataBodyRange Bereich Namen in 'Application.Names'! Aber sie können definitiv mit 'Application.Range (...) 'aufgerufen werden. – AndrewD

+2

Dieser Weg scheint nur dann zu funktionieren, wenn die Arbeitsmappe, die die benötigte Tabelle enthält, gerade aktiv ist. Wenn Sie Code mit einer anderen aktiven Datei ausführen, schlägt diese Methode fehl. Dieselbe Vorgehensweise wie für das Objekt 'ActiveSheet'. –

+0

Nicht ein großer Fan von Ihrem vorgeschlagenen VBA, aber der externe Link, den Sie fallen lassen, war eine nette Zusammenfassung, wie Sie Tabellen und Teile von Tabellen referenzieren, danke. – Pork