2017-10-06 25 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