【问题标题】:Excel Return Table name using Formula?Excel使用公式返回表名?
【发布时间】:2016-04-12 00:33:05
【问题描述】:

我想知道是否有使用公式返回表名的方法?

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

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

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

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

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

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

TY

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

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

在该函数中,我输入名为“SheetName”的 My Defined Name 公式

=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

【问题讨论】:

  • 在这里交叉发布:superuser.com/questions/1064308/return-table-name-using-formula - 请不要在多个网站上发布相同的问题。
  • VBA 仍然是一个简单的解决方案。您可以使用=MyFunction(TableName,Field,someOtherValuesYouWant,....) 之类的输入创建一个UDF。通过这种方式,您可以获得简单的“复制/粘贴”公式,而不是无穷无尽的公式;)
  • @DirkReichel 是的,我确信 VBA 是一个更好、更简单的选择,但是信息所在的计算机不属于我,并且由于公司政策,宏被禁用。由于隐私问题,无法提取数据并在我自己的 PC 上进行操作。但是,如果您有 VBA 解决方案,我希望看到它。但在这种情况下,需要一个公式。
  • @DirkReichel 您也确实意识到我添加表名的功能与我现在的情况相同。表名未知。该函数必须像ADDRESS(ROW(),COLUMN(),4,1) 一样工作,返回单元格的地址。我需要返回 Cell 所在的表名。
  • 那么@DirkReichel 会很高兴。在我的原始帖子的编辑中,我只写了这样一个宏。另一个人提供的宏。我将它与我已经拥有的公式结合起来,它可以获取表的名称。减少到这个。 'Function GetTableName() As String GetTableName = Worksheets(ActiveSheet.Name).ListObjects(1).Name End Function' 不幸的是我仍然不能使用它。另外,它只获取第一个表的名称,而不是您所在的实际表名。但是该表是唯一的,那么一切都很好。

标签: excel formula defined tablename


【解决方案1】:

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

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

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

并等同于“状态”。

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

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

并等同于“My2016Data”。

【讨论】:

  • 我惊讶地发现这种策略在实践中确实有效,尽管答案可能更清楚一点。基本上,您的第一个公式需要是=<TableName>[[#Headers],[<SomeColumnInTable>]],第二个需要是=MID(FORMULATEXT(<CellContainingFirstFormula>),2,FIND("[",FORMULATEXT(<CellContainingFirstFormula>))-2)。因为 Excel 会在名称更改时自动更新公式中的表名,所以第二个公式将始终显示表的当前名称,前提是您自己不更改第一个单元格。
  • 注意:更改表名后,您可能需要强制 Excel 执行重新计算。您可以通过 Formulas->Calculate Now 或打开第二个公式的单元格进行编辑并按 Enter 键。
  • 这行不通。表名是可变的,我不知道名称。我正在尝试编写一个公式,该公式将在禁用宏的计算机中输入。这台电脑不是我的,也不属于我使用它的朋友。它属于他工作的公司。我(他)需要公式在它碰巧在的任何表中工作。
【解决方案2】:

这是一个 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)

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

【讨论】:

  • 谢谢。我已经尝试过了,它有效。我仍然无法将它用于我正在处理的原始项目。带有信息的计算机是公司计算机,并且禁用了宏或 VBA 的使用。但我确实发现你的 UDF 有用。我真的很想检查你的答案,但我不确定是否允许,因为问​​题是关于公式解决方案。我想知道版主是否会允许它。无论哪种方式都非常感谢。
【解决方案3】:
=MID(
    FORMULATEXT(<CurrentCell>),
    53+2*<LengthOf<CurrentCell>>),
    LEN(FORMULATEXT(<CurrentCell>))-(53+2*<LengthOf<CurrentCell>>))-3
)&IF(0,<TableName>,"")

【讨论】:

  • 欢迎来到 Stack Overflow!欢迎来到堆栈溢出!请尝试提供有关您的解决方案如何工作的精彩描述。请参阅:How do I write a good answer?。谢谢。
  • 我会尽快检查的
【解决方案4】:

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

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

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

【讨论】:

    【解决方案5】:

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

    =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]]
    最后一个很有用,因为您只需单击具有列名的单元格即可粘贴它。

    【讨论】:

      【解决方案6】:

      随着Excel中LAMBDA function的引入,在名称管理器中可以通过这个功能实现返回表名:

      公式

      =LAMBDA(reference,LET(thisFormula,FORMULATEXT(INDIRECT(ADDRESS(ROW(),COLUMN()))),leftPart,LEFT(thisFormula,IFERROR(FIND("[", thisFormula), FIND(")", thisFormula)) -1),RIGHT(leftPart,LEN(leftPart)-FIND("(",leftPart))))
      

      在名称管理器中创建一个名称,例如“TableName”与上述公式中的“Refers to:”字段。然后,此自定义函数获取对表的引用并返回表的名称。正如@Marat 指出的那样,这可以使用任何包含表名的表引用:

      您可以使用表格的任何部分,而不仅仅是 Table1[#Headers]。 例如,它可以是:Table1[#All] 或 Table1[Column1] 或 Table1[[#Headers],[Column1]]。

      我通常只单击标题单元格,因为这将始终包含表格名称,无论该公式是在表格内部还是外部使用。此解决方案为在 VBA 不工作的 Excel Web 版本中使用此功能提供了更广泛的兼容性。

      如果更改表名后此公式未自动更新,请单击功能区“公式”选项卡下的“立即计算”以获取要更新的值。

      说明

      这是上面带有缩进的代码:

      = LAMBDA(
          reference,
          LET(
              thisFormula, FORMULATEXT(INDIRECT(ADDRESS(ROW(), COLUMN()))),
              leftPart, LEFT(thisFormula, IFERROR(FIND("[", thisFormula), FIND(")", thisFormula)) -1),
              RIGHT(leftPart, LEN(leftPart) - FIND("(", leftPart))
          )
      )
      

      这个 LAMBDA 函数从不实际引用它的参数。相反,FORMULATEXT 函数返回单元格的公式,类似于“=TableName(Table1[#Headers])”。

      然后,LET 函数通过查找“[”或“)”和“(”字符的位置将其修剪为表名称。如果引用的表没有方括号,IFERROR 函数将修剪")" 字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多