13

I was wondering if there is anyway to return the name of the table using a formula?

I was working on a way to break down a few thousand addresses into there perspective column of information. ie.. #, Street, City, State, Zip-code and Phone#. The addresses are not in any consistent format that Text to Columns would work. I finally came up with the formulas to get the job done, but the are very long. In a post I found it suggested to use repeated parts of the formulas as a Defined Name. And it made it so much easier. Now Here is the problem.

A formula that has the table name "Table1" won't work in "Table2". Or any other table name. Column headers are the same for each table.

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

A way to return the name of the table is needed. Via formula or formula as Defined Name.

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

I prefer it to be a formula. I'm not sure if a VBA solution would be a correct answer to this question so I would not be able to choose it as THE answer, even if it does work. It will still be appreciated. I will ask in a separate post if I do not find a Formula Solution.

TY

I found this post that has a VBA solution, but I can't use it. I will post just so someone can maybe figure this out. Portland Runner Posted this CODE to get table name.

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

In that Function I enter My Defined Name formula named "SheetName"

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

So I can use it like this.

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

However I still need this to be Formula Only. While I can run Macros on My PC, they will not run in the PC that has all the data.

This is the last thing I got using a UDF. Unfortunately I still cant use it. Plus It gets the first Table's name and not the actual table the cell is in. Good if that is the only table in sheet or if the first table is the table you want.

Function GetTableName() As String 
    GetTableName = Worksheets(ActiveSheet.Name).ListObjects(1).Name
End Function
12
  • 3
    cross-posted here: superuser.com/questions/1064308/return-table-name-using-formula - Please do not post the same question on more than one site.
    – teylyn
    Commented Apr 12, 2016 at 0:47
  • Still VBA would be an easy solution. You could create a UDF with inputs like =MyFunction(TableName,Field,someOtherValuesYouWant,....). This way you get simple "copy/paste" formulas to work with instead of endless formulas ;) Commented Apr 12, 2016 at 0:49
  • @DirkReichel Yes I'm sure that VBA is a better and easier option, however the computer that the information is on does not belong to me and Macros are disabled due to company policy. Extracting the Data and doing it on my own PC is not an option due to privacy issues. However if you have a VBA solution I would like to see it. But in this case a formula is needed.
    – Mouthpear
    Commented Apr 12, 2016 at 10:04
  • @DirkReichel Also you do realize a function where I add the name of the table is just the same situation that I have now. The table name Is not known. the function would have to work like ADDRESS(ROW(),COLUMN(),4,1) returns the address of the cell. I need to return the Table Name where the Cell is located.
    – Mouthpear
    Commented Apr 12, 2016 at 10:15
  • 1
    Well @DirkReichel be happy then. In my edit, of my original post, I wrote just such a macro. Macro provided by another person. I combined it with with a formula i already had and it makes it possible to get the Name of the table. Reduced it to this. 'Function GetTableName() As String GetTableName = Worksheets(ActiveSheet.Name).ListObjects(1).Name End Function' Unfortunately I still can't Use it. Plus it only gets the FIrst table's name , name not the actual table name you are in. but is the table is the only one then it's all good.
    – Mouthpear
    Commented Apr 15, 2016 at 20:23

6 Answers 6

9

You will need two cells to get the table name. My Table Headers start in row 2 and Table Data in row 3, so I put my two formulas in cells A1 and B1, respectively.

The first cell should reference the top left header cell of your table. For me, the formula ends up reading:

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

and equates to "State".

The second cell's formula should be:

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

and equates to "My2016Data".

3
  • 3
    I was surprised to find that this strategy actually works in practice, although the answer could be a little more clear. Basically, your first formula needs to be =<TableName>[[#Headers],[<SomeColumnInTable>]], and the second needs to be =MID(FORMULATEXT(<CellContainingFirstFormula>),2,FIND("[",FORMULATEXT(<CellContainingFirstFormula>))-2). Because Excel automatically updates table names in formulas when the names change, this second formula will always show the table's current name, provided you don't change the first cell yourself. Commented Mar 9, 2018 at 17:36
  • 1
    Note: after changing a table name, you may need to force Excel to perform a recalculation. You can do this via Formulas->Calculate Now, or by opening the cell of the second formula for editing and pressing Enter. Commented Mar 9, 2018 at 18:04
  • This will not work. The table name is variable and i will not know the name. I was trying to write a formula that would be entered a computer that has macros disabled. The PC is not mine nor does it belong to my friend who uses it. It belongs to the company he works for. I (he) needs the formula to work in whatever table it happens to be in.
    – Mouthpear
    Commented Nov 30, 2018 at 9:20
6

Here's a VBA solution since you said you want to see it. This is a UDF (user defined function) which you create with VBA but use as a formula inside a cell. Save this code in a standard code module (not in a sheet module and not in the "ThisWorkbook" module):

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

Once saved to a module, you can use it in a cell formula like this:

=GetTableName(A1)

or this

=GetTableName(B:B)

or this

=GetTableName(B2:W900)

If you use a range that overlaps more than one table it will return the name of the first table.

1
  • 1
    Thank you. I have tried it and it works. I still can't use it for the original project I was working on.The computer with the information is a company computer and the use of macros or VBA was disabled. But I did find use for your UDF. I would really like to Check yours as the answer but I'm not sure if it is allowed since the question was about a formula solution. I wonder if the Moderators would allow it. Thank you very much either way.
    – Mouthpear
    Commented Jun 13, 2017 at 9:41
6

In a single cell, you can use this =TableName() formula to return a table name as text. For example, =TableName(TblAccounts) returns "TblAccounts" and updates as the table's name is updated!

With the introduction of the LAMBDA function in Excel, returning table name can be achieved with this function in the Name Manager:

Formula

=LAMBDA(reference, LET(thisFormula,FORMULATEXT(INDIRECT(ADDRESS(ROW(),COLUMN()))),
TEXTBEFORE(TEXTAFTER(thisFormula,"("),IF(ISERROR(FIND("[",ThisFormula)),")","["))))

Create a Name in the Name Manager (e.g., called "TableName") with the above formula in the "Refers to:" field. This custom function then takes a reference to the table and returns the table's name. This can use any table reference that includes the table name, as @Marat points out:

You can use any part of the table, not only Table1[#Headers]. For example, it could be: Table1[#All] or Table1[Column1] or Table1[[#Headers],[Column1]].

This solution offers broader compatibility for using this functionality in Excel Online web version, where VBA does not work.

If this formula does not automatically update after changing a table name, click "Calculate Now" under the Formulas tab on the ribbon to get the value to update. It is dynamic and will return whatever you name your tables, just as Excel changes the names in every other formula referencing a table!

How to use

After entering this formula in the Name Manager as TableName, type

=TableName(x)

where x is a reference that includes the name of the table. E.g., if my table is called "TblAccounts", x could be "TblAccounts", "TblAccounts[#Headers]", "TblAccounts[@Colulmn]", etc.

Explanation

Here is the code from above with indentation:

=LAMBDA(reference,
    LET(
        thisFormula, FORMULATEXT(INDIRECT(ADDRESS(ROW(), COLUMN()))),
        TEXTBEFORE(
            TEXTAFTER(thisFormula,"("),
            IF(ISERROR(FIND("[",ThisFormula)),
                ")",
                "["
            )
        )
    )
)

This LAMBDA function never actually references its parameter. Instead, the FORMULATEXT function returns the cell's formula, which looks like "=TableName(Table1[#Headers])."

The nested TEXTBEFORE(TEXTAFTER(... functions get the reference argument and trim down to just the table name. In case the table is referenced without square brackets, the IF function trims by the ")" character instead.

1
  • 1
    Also, I tried doing =TableName(Address(Row()+1, Column())) with the plan of just putting it directly above each table, but that won't work. After looking a little closer at how the function works with the string parsing, I understand why, but in case others try to use this blindly, as I did, just FYI. Commented Apr 18, 2023 at 16:05
1

Following formula returns table name, referenced in it:

=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)))

Note: you can use any part of the table, not only Table1[#Headers].
For example it could be: Table1[#All] or Table1[Column1] or Table1[[#Headers],[Column1]].
The last one is useful, because you can just click a cell with a column name to paste it.

1
  • Love this, albeit 2 small caveats - it uses volatile function INDIRECT, and it does not immediately update when table name changes. I made this expanded version to (1) add "Table: " text prefix and (2) convert underscores to spaces: ="Table:" & MID(SUBSTITUTE(LET(x,Manifold_Descriptions[#All], y, FORMULATEXT(INDIRECT(ADDRESS(ROW(),COLUMN()))), z, LEFT(y, FIND("[", y)-1), TRIM(RIGHT(z, LEN(z)-FIND("x", z)-1))), "_", " "), 6, 999). This returns Table: Manifold Descriptions, and (eventually) automatically updates with table name changes. Commented Jun 3, 2022 at 12:50
0
=MID(
    FORMULATEXT(<CurrentCell>),
    53+2*<LengthOf<CurrentCell>>),
    LEN(FORMULATEXT(<CurrentCell>))-(53+2*<LengthOf<CurrentCell>>))-3
)&IF(0,<TableName>,"")
2
  • Welcome to Stack Overflow! Welcome to Stack Overflow! Please try to provide a nice description about how your solution works. See: How do I write a good answer?. Thanks.
    – 4b0
    Commented Sep 2, 2018 at 4:20
  • I will check it out ASAP
    – Mouthpear
    Commented Nov 30, 2018 at 9:21
0

If the tables are all on separate sheets, and the sheet names are the same as the table names, you could do something like this:

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

This will return the sheet name that the table is on, which will match the table name.

Not the answer you're looking for? Browse other questions tagged or ask your own question.