2013-08-03 15 views
15

Czy w programie Excel VBA jest możliwe odwoływanie się do nazwanego stołu?Jak odnieść się do tabel w programie Excel vba?

Hipotetycznie to może być ...

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

Widziałem jakąś wzmiankę tabel będących przedmiotem lista, ale nie jestem pewien, czy to jest to samo ...

Odpowiedz

5

Może to może pomóc

Tworzenie tabeli

Konwersja odległości do stołu zaczyna się od tego samego kodu, jak w programie Excel 2003 (jak opisano w this answer) :

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

Wygląda dobrze, dziękuję za to! –

6

Ponadto, wygodne jest definiowanie zmiennych odnoszących się do obiektów. Na przykład:

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 

Prawdopodobnie okaże się to korzystne od razu.

4

Oprócz powyższego, można to zrobić (gdzie „YourListObjectName” to nazwa tabeli):

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

Ale myślę, że działa tylko jeśli chcesz odwoływać się do obiektu listy, która znajduje się na aktywny arkusz.

Znalazłem twoje pytanie, ponieważ chciałem odnieść się do obiektu listy (tabeli) w jednym arkuszu roboczym, do którego odnosi się tabela przestawna w innym arkuszu. Ponieważ obiekty listy należą do zbioru arkuszy roboczych, musisz znać nazwę arkusza roboczego, na którym znajduje się obiekt listy, aby się do niego odwoływać. Aby uzyskać nazwę arkusza roboczego, na którym znajduje się obiekt listy, otrzymałem nazwę obiektu listy źródłowej tabeli przestawnej (ponownie, tabela) i przechodziłem przez arkusze robocze i ich obiekty listy, dopóki nie znalazłem arkusza zawierającego listę obiekt, którego szukałem.

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 

Może ktoś zna bardziej bezpośredni sposób.

+0

Biorąc pod uwagę to, co napisał @AndrewD na temat potencjalnych niedociągnięć metody application.range, wydaje się, że jest to jedyna niezawodna metoda uzyskiwania obiektu ListObject przy użyciu tylko nazwy tabeli. – ChrisB

+0

Oprócz ** tworzenia ** _PivotTable_ w twoim kodzie, który prawdopodobnie nie był twoim intencją, myślę, że twoja droga jest tak bezpośrednia, jak tylko może być. Próbowałem dodać ogólną funkcję, aby uzyskać _ListObject_ z nazwą _PivotTable_ do twojej odpowiedzi, ale najwyraźniej to nie jest koszerna. Postanowiłem więc stworzyć nowe [pytanie] (https://stackoverflow.com/questions/46106440/how-can-i-get-the-listobject-objects/46106441#46106441) i zapewnić, że kod jako odpowiedź. Ale poprawiłem twoją odpowiedź tutaj, ponieważ jest to przewidywalna potrzeba, aby móc uzyskać _ListObject_ z _PivotTable_ Name. – GlennFromIowa

49

OP zapytał, czy jest możliwe odniesienie do tabeli, a nie jak dodać tabelę. Więc odpowiednikiem robocza

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

byłoby to stwierdzenie:

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

lub, aby wybrać elementy (jak tylko dane w tabeli):

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 

dla części, ty może chcieć przetestować istnienie wierszy nagłówka i sumy przed ich wyborem.

A tak na poważnie, to jest jedyne pytanie na temat odwoływania się do tabel w VBA w SO? Tabele w Excelu mają tyle sensu, ale są tak trudne w VBA!

+0

jak możemy używać tabel w zapytaniu VBA, tak jak zrobiliśmy dla Arkuszy, na przykład "wybierz * z [sheet1 $] gdzie col1 =" x "" – Vikky

+0

@Vikky Nie jestem zaznajomiony z zapytaniem VBA, do którego się odwołujesz, ale jestem zaintrygowany to. Czy masz link do dokumentacji (MSDN lub inny) dla tego typu zapytania? Czy jest to używane podczas odwoływania się do programu Excel z innej aplikacji lub narzędzia za pośrednictwem OLE lub ODBC? Jeśli tak, to która aplikacja? – GlennFromIowa

+0

Najpierw chciałbym podziękować za odpowiedź. Mam rozwiązanie dla mojego pytania, tabele w arkuszu Excela mogą być używane za pomocą oledb. to jest link do artykułu, który pomaga mi http://chandoo.org/wp/2012/04/02/using-excel-as-your-database/ – Vikky

16

"Właściwym" sposobem odniesienia się do tabeli jest pobranie jej obiektu ListObject z arkusza roboczego, tj. SheetObject.ListObjects(ListObjectName).

Jeśli chcesz odwołać się do tabeli bez użycia arkusza, możesz użyć hacka Application.Range(ListObjectName).ListObject.

UWAGA: Ten Hack opiera się na fakcie, że Excel zawsze tworzy nazwany zakres do stołu DataBodyRange o tej samej nazwie, jak nazwa tabeli. Jednak ta nazwa zakresu może być zmieniona ... ale nie jest to coś, co chcesz zrobić, ponieważ nazwa zostanie zresetowana, jeśli zmienisz nazwę tabeli! Można również uzyskać nazwany zakres bez powiązanego obiektu ListObject.

Biorąc pod uwagę niezbyt pomocny komunikat o błędzie programu Excel 1004, gdy pojawi się nazwa źle, może chcesz stworzyć opakowanie ...

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 

również kilka dobrych informacji ListObject here.

+1

BTW Nie należy oczekiwać znajdź nazwy zakresów nazw DataBodyRange w 'Application.Names'! Ale na pewno można uzyskać do nich dostęp za pomocą 'Application.Range (...)'. – AndrewD

+2

Ta metoda działa tylko wtedy, gdy aktywny jest skoroszyt zawierający potrzebną tabelę. Jeśli w jakiś sposób uruchomisz kod z innym plikiem aktywnym, ta metoda się nie powiedzie. To samo podejście co w przypadku obiektu "ActiveSheet". –

+0

Nie jesteś wielkim fanem sugerowanego VBA, ale link zewnętrzny, który upuściłeś, był miłym podsumowaniem tego, jak odwoływać się do tabel i części tabel, dzięki. – Pork

Powiązane problemy