2013-08-03 227 views
15

在Excel VBA中可以引用指定的表嗎?如何在Excel vba中引用表格?

可以想像這可能是...

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

我見過的表是一個列表對象的一些提及,但我不知道這是同樣的事情...

回答

5

也許這可以幫助你

創建一個表

轉換一個範圍的表使用相同的代碼開始在Excel 2003中(如在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

看起來不錯,謝謝! –

6

另外,定義指向對象的變量很方便。例如,

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 

你可能會立刻發現它的優點。

4

除了上面,你可以這樣做(其中「YourListObjectName」是你的表的名稱):

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

但我認爲只有工作,如果你想引用一個列表對象,這是上活動工作表。

我發現你的問題,因爲我想引用一個工作表上不同工作表上的數據透視表引用的列表對象(表)。由於列表對象是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 

也許有人知道更直接的方法。

+0

鑑於@AndrewD寫了關於application.range方法的潛在缺陷的內容,這似乎是僅使用表名獲取表的ListObject的唯一可靠方法。 – ChrisB

+0

除了**在代碼中創建** _PivotTable_,這可能不是您的意圖,我認爲您的方式儘可能直接。我試圖添加一個泛型函數來爲您的答案獲得一個_PivotTable_名稱的_ListObject_,但顯然這不是猶太教。所以我決定創建一個新的[問題](https://stackoverflow.com/questions/46106440/how-can-i-get-the-listobject-object-of-a-pivottable/46106441#46106441),並提供代碼作爲答案。但是我在這裏確實回答了你的答案,因爲這是可預見的需要能夠從_PivotTable_ Name獲得_ListObject_。 – GlennFromIowa

49

OP詢問,是否可以參考表,而不是如何添加一個表。所以

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

工作相當於將本聲明:

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

或選擇部分(如僅在表中的數據):

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 

對於零件,您可能要在選擇它們之前測試標題和總計行的存在。

嚴重的是,這是在SO中引用VBA表的唯一問題嗎? Excel中的表格非常有意義,但它們很難在VBA中使用!

+0

我們如何使用VBA查詢中的表格,就像我們爲表格所做的那樣,例如「select * from [sheet1 $] where col1 ='x'」 – Vikky

+0

@Vikky我不熟悉您引用的VBA查詢,但對它。你有鏈接到這種類型的查詢的文檔(MSDN或其他)嗎?當通過OLE或ODBC從其他應用程序或工具引用Excel時,是否使用它?如果是,哪個應用程序? – GlennFromIowa

+0

首先,我想感謝您的回覆。我已經爲我的問題找到解決方案,可以使用oledb使用excel表格中的表格。這是幫助我的文章的鏈接http://chandoo.org/wp/2012/04/02/using-excel-as-your-database/ – Vikky

16

引用表的「正確」方法是從工作表中獲取其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 

也有不錯的ListObject信息here

+1

順便說一句,不要指望在'Application.Names'中找到表格DataBodyRange範圍名稱!但是他們肯定可以使用'Application.Range(...)'來訪問。 – AndrewD

+2

這種方式似乎只適用於包含所需表格的工作簿當前處於活動狀態。如果以某種方式運行另一個文件的代碼處於活動狀態,則此方法將失敗。與「ActiveSheet」對象的方法相同。 –

+0

不是你建議的VBA的巨大粉絲,但你放棄的外部鏈接是如何引用表和部分表的一個很好的總結,謝謝。 – Pork

相關問題