2017-10-06 24 views
0

我想從一個函數返回一個ListObject,但它似乎將其隱式轉換爲一個字符串。我很困惑。有人能指出我做錯了什麼嗎?ListObject返回一個字符串

Sub TestMyFunction() 
    Dim MyTable As ListObject 
    Set MyTable = RangeToTable 
    Debug.Print MyTable '---MyTable = "Table1" 
    MyTable.Unlist 
End Sub 

Private Function RangeToTable() As ListObject 
    Dim wks As Worksheet 
    Set wks = ActiveWorkbook.Worksheets(sREPORT_DATA_1) 

    Dim rngTable As Range 
    Set rngTable = wks.Range("A1").CurrentRegion 

    Set RangeToTable = wks.ListObjects.Add(xlSrcRange, rngTable, , xlYes) 
End Function 
+0

不確定你的意思。 'Address'屬性將返回一個對應於該範圍的字符串。 – SJR

+0

@SJR對不起,我感到困惑。我稍微編輯了我的帖子。當我打印'MyTable'時,它將'Table1'打印爲一個字符串。但我需要返回一個表格對象,而不是表格名稱。我對VBA的認識正在進步,但我可能不會理解某些東西。 – Brian

+0

它的確如此,因此您可以使用Unlist方法。你究竟在努力實現什麼? – SJR

回答

-1

wks.ListObjects.Add(xlSrcRange,rngTable,,xlYes)中的ListObjects是一個集合。集合項目有兩個屬性,一個名稱和一個值。在這種情況下,名稱爲「Table1」,因爲您在創建rngTable後沒有指定名稱。當執行.Add時,添加的集合項目被賦予「Table1」的名稱,該值是內存中rngTable結構的地址。

當您執行作爲集合項目的Debug.Print MyTable時,它將打印名稱爲「Table1」的集合項目的默認屬性。

Sub TestMyFunction() 
    Dim MyLO As ListObject 
    Set MyLO = RangeToTable 
    Debug.Print MyLO '---MyLO = "Table1" 
    MyLO.Unlist 
End Sub 

Private Function RangeToTable() As ListObject 
    Dim wks As Worksheet 
    Set wks = ActiveWorkbook.Worksheets(sREPORT_DATA_1) 

    Dim rngTable As Range 
    Set rngTable = wks.Range("A1").CurrentRegion 

    Set RangeToTable = wks.ListObjects.Add(xlSrcRange, rngTable, , xlYes) 
End Function 

以下鏈接可能會幫您清除它。 How do I reference tables in Excel vba?

+0

我不確定我關注。那麼如何返回一個ListObject類型的對象呢? – Brian

+0

您已經返回一個ListObject項目。我將代碼添加到答案中,以幫助您瞭解代碼中發生的情況。你編寫它的方式是混淆了一個ListObject項目,因爲你稱之爲MyTable。當您Debug.Print時,您正在打印ListObject的名稱,而不是與該表執行任何操作。查看答案底部的鏈接。 – thx1138v2

+0

表是ListObjects。你所做的只是改變我的變量的名字。 – Brian