在Excel VBA中可以引用指定的表嗎?如何在Excel vba中引用表格?
可以想像這可能是...
Sheets("Sheet1").Table("A_Table").Select
我見過的表是一個列表對象的一些提及,但我不知道這是同樣的事情...
在Excel VBA中可以引用指定的表嗎?如何在Excel vba中引用表格?
可以想像這可能是...
Sheets("Sheet1").Table("A_Table").Select
我見過的表是一個列表對象的一些提及,但我不知道這是同樣的事情...
也許這可以幫助你
創建一個表
轉換一個範圍的表使用相同的代碼開始在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
另外,定義指向對象的變量很方便。例如,
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
你可能會立刻發現它的優點。
除了上面,你可以這樣做(其中「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
也許有人知道更直接的方法。
鑑於@AndrewD寫了關於application.range方法的潛在缺陷的內容,這似乎是僅使用表名獲取表的ListObject的唯一可靠方法。 – ChrisB
除了**在代碼中創建** _PivotTable_,這可能不是您的意圖,我認爲您的方式儘可能直接。我試圖添加一個泛型函數來爲您的答案獲得一個_PivotTable_名稱的_ListObject_,但顯然這不是猶太教。所以我決定創建一個新的[問題](https://stackoverflow.com/questions/46106440/how-can-i-get-the-listobject-object-of-a-pivottable/46106441#46106441),並提供代碼作爲答案。但是我在這裏確實回答了你的答案,因爲這是可預見的需要能夠從_PivotTable_ Name獲得_ListObject_。 – GlennFromIowa
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中使用!
我們如何使用VBA查詢中的表格,就像我們爲表格所做的那樣,例如「select * from [sheet1 $] where col1 ='x'」 – Vikky
@Vikky我不熟悉您引用的VBA查詢,但對它。你有鏈接到這種類型的查詢的文檔(MSDN或其他)嗎?當通過OLE或ODBC從其他應用程序或工具引用Excel時,是否使用它?如果是,哪個應用程序? – GlennFromIowa
首先,我想感謝您的回覆。我已經爲我的問題找到解決方案,可以使用oledb使用excel表格中的表格。這是幫助我的文章的鏈接http://chandoo.org/wp/2012/04/02/using-excel-as-your-database/ – Vikky
引用表的「正確」方法是從工作表中獲取其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。
看起來不錯,謝謝! –