7

我想知道是否有任何方法可以使用公式返回表的名称?

我正在研究一种将几千个地址分解为透视信息列的方法。即.. #、街道、城市、州、邮政编码和电话号码。这些地址不是文本到列可以工作的任何一致格式。我终于想出了完成工作的公式,但是很长。在一篇文章中,我发现它建议使用公式的重复部分作为定义名称。它使它变得如此容易。现在问题来了。

具有表名“Table1”的公式在“Table2”中不起作用。或任何其他表名。每个表的列标题相同。

MAX(SEARCH(Table1[@State],Table1[@Origin]))

需要一种返回表名的方法。通过公式或公式作为定义的名称。

MAX(SEARCH(GetTableName[@State],GetTableName[@Origin]))

我更喜欢它是一个公式。我不确定 VBA 解决方案是否是这个问题的正确答案,所以即使它确实有效,我也无法选择它作为答案。它仍然会受到赞赏。如果我没有找到公式解决方案,我会在单独的帖子中询问。

我发现这篇文章有一个 VBA 解决方案,但我不能使用它。我会发布,以便有人可以解决这个问题。Portland Runner 发布此代码以获取表名。

Function GetTableName(shtName As String) As String
    GetTableName = Worksheets(shtName).ListObjects(1).Name
End Function

在该函数中,我输入名为“SheetName”的我的定义名称公式

=MID(CELL("filename"),FIND("]",CELL("filename"))+1,100)

所以我可以这样使用它。

=MAX(SEARCH(INDIRECT(GetTableName(SheetName)&"[@State]"),INDIRECT(GetTableName(SheetName)&"[@Origin]")))

但是我仍然需要这是仅公式。虽然我可以在我的电脑上运行宏,但它们不会在拥有所有数据的电脑上运行。

这是我使用 UDF 得到的最后一件事。不幸的是,我仍然无法使用它。另外,它获取第一个表格的名称,而不是单元格所在的实际表格。如果这是工作表中唯一的表格,或者第一个表格是您想要的表格,那就太好了。

Function GetTableName() As String 
    GetTableName = Worksheets(ActiveSheet.Name).ListObjects(1).Name
End Function
4

5 回答 5

8

您将需要两个单元格来获取表名。我的表头从第 2 行开始,表数据从第 3 行开始,所以我将两个公式分别放在单元格 A1 和 B1 中。

第一个单元格应引用表格左上角的标题单元格。对我来说,公式最终显示为:

=My2016Data[[#Headers],[State]]

并等同于“状态”。

第二个单元格的公式应该是:

=MID(FORMULATEXT(A1),2,FIND("[",FORMULATEXT(A1))-2)

并等同于“My2016Data”。

于 2017-11-08T15:17:39.487 回答
4

这是一个 VBA 解决方案,因为您说要查看它。这是您使用 VBA 创建的 UDF(用户定义函数),但在单元格内用作公式。将此代码保存在标准代码模块中(不在工作表模块中,也不在“ThisWorkbook”模块中):

Function GetTableName(cellInTable As Range) As String
    Dim tblName As String
    tblName = vbNullString
    On Error Resume Next
    tblName = cellInTable.ListObject.Name
    GetTableName = tblName
End Function

保存到模块后,您可以在单元格公式中使用它,如下所示:

=GetTableName(A1)

或这个

=GetTableName(B:B)

或这个

=GetTableName(B2:W900)

如果您使用的范围与多个表重叠,它将返回第一个表的名称。

于 2017-04-13T21:13:29.280 回答
0

以下公式返回表名,其中引用:

=LET(x, Table1[#Headers], y, FORMULATEXT(INDIRECT(ADDRESS(ROW(),COLUMN()))), z, LEFT(y, FIND("[", y)-1), TRIM(RIGHT(z, LEN(z)-FIND("x", z)-1)))

注意:您可以使用表格的任何部分,而不仅仅是Table1[#Headers].
例如,它可以是:Table1[#All]Table1[Column1]Table1[[#Headers],[Column1]]
最后一个很有用,因为您只需单击具有列名称的单元格即可将其粘贴。

于 2022-02-05T22:07:15.927 回答
0
=MID(
    FORMULATEXT(<CurrentCell>),
    53+2*<LengthOf<CurrentCell>>),
    LEN(FORMULATEXT(<CurrentCell>))-(53+2*<LengthOf<CurrentCell>>))-3
)&IF(0,<TableName>,"")
于 2018-09-02T03:26:54.307 回答
0

如果表都在不同的工作表上,并且工作表名称与表名称相同,则可以执行以下操作:

=LET(filename,CELL("filename",Table[#Headers]),RIGHT(filename,LEN(filename)-FIND("]",filename)))

这将返回表格所在的工作表名称,该名称将与表格名称匹配。

于 2021-03-16T09:22:23.957 回答