Forum Discussion
Structured References
If that's something like this
i.e. you need to combine few tables (right ones) into one (first), and all tables have the column with unique value among all tables (Key), and you are Excel 365, that could be
=LET(
keys, VSTACK(
Table1[Key],
Table2[Key],
Table3[Key]
),
words, VSTACK(
Table1[Word],
Table2[Word],
Table3[Word]
),
XLOOKUP([@Key], keys, words, "no such")
)
If something different please provide at least screenshots, sample file without sensitive information is even better.
- JonBastiansJun 04, 2023Copper Contributor
Thanks so much for your help! I'm very grateful 🙂
Please check the attached file.
I have already completed the copying process using Traditional formulas. Now I want to see if it's possible using cell references... As i mentioned, I think it is good if the table can resize as needed as then there will be no chance of my output table losing data (when the input exceeds 30 rows). I'm a teacher and I'm trying to set up systems for tracking students for the whole school. The file is not sensitive (has fake names).
I could easily workaround the issue by setting class size of 100 rows... but I'm trying to learn more about table references, which some consider to be the "proper" way to structure references.
Beyond a solution to the above scenario, I would be interested to know:
- what you think about Structured Table References vs traditional formulas.
- Could you suggest some learning resources for STR. How did you learn?
Thanks again for your help!!
- PeterBartholomew1Jun 04, 2023Silver Contributor
In this case structured references are not going to give you much. They have the advantage of allowing you to know the precise extent of your data but, by the time you have combined different sized classes, then the space you need is dictated by the largest group.
The most concise formulation would start with a 3D range with, as you suggest, space for 100 records. Stacking would give a list of 700 records in which first and last names could be concatenated. WRAPCOLS would return the 7 columns of 100 records,
= LET( stacked, VSTACK(Table3D), firstName, TAKE(stacked,,-1), lastName, TAKE(stacked,, 1), fullNames, firstName & " " & lastName, WRAPCOLS(fullNames,33) )
The alternative, developed in the workbook, would be to use table names one at a time within REDUCE. HSTACK builds the output array class by class.
= LET( table, REDUCE("", SEQUENCE(1,7), LAMBDA(acc,k, LET( classList, CHOOSE(k, MS_1,MS_2,MS_3,SS_1,SS_2,SS_3,SS_4), firstName, TAKE(classList,,-1), lastName, TAKE(classList,, 1), fullName, firstName & " " & lastName, HSTACK(acc, fullName) ) ) ), IFNA(DROP(table,,1),"") )
Sadly, combining data from an arbitrary number of sheets by formula is not going to be pretty.
- JonBastiansJun 06, 2023Copper Contributor
Thanks to you too PeterBartholomew1
I may well try your solution too. Thanks for pointing out that tables = unordered lists. That makes sense. I had never thought of it that way. So much to learn 🙂
- SergeiBaklanJun 04, 2023Diamond Contributor
I see, thank you for the sample file. I misunderstood your task initially. Afraid dynamic expansion of the resulting table based on the size of source table doesn't work. At list with formulae only.
Perhaps to work with the range will be easier. As in column I - in I2 is
=IFERROR( INDEX(tblMS1[Full Name], ROW()-ROW($I$1) ), "" )
and drag it down till empty cells appear, with some gap.
Same you could do with structured table - fill by formulae like
=IFERROR( INDEX(tblMS1[Full Name], ROW()-ROW(Table13[[#Headers],[Column1]]) ), "" )
and resize table by dragging the dot at bottom right corner of the table.
Automatically that could be done by Power Query. But it's desirable they have the same structure, i.e. columns First and Last and tables to combine have names of the same structure, e.g. starting from tbl.
Power Query script could be
let Source = Excel.CurrentWorkbook(), selectTables = Table.SelectRows( Source, each Text.StartsWith([Name], "tbl")), getTableNames = Table.TransformColumns( selectTables, { {"Name", each Text.AfterDelimiter(_, "tbl"), type text} }), trimNames = Table.AddColumn( getTableNames, "TrimTexts", each Table.TransformColumns([Content], { {"First", Text.Trim}, {"Last", Text.Trim} } )), makeFullName = Table.AddColumn( trimNames, "FullName", each Table.AddColumn( [TrimTexts], "FullName", (q) => Text.Combine({ q[First] , q[Last]}, " ") )[FullName]), generateTable = Table.FromColumns( makeFullName[FullName], makeFullName[Name] ) in generateTable
and in attached. I tried to simplify it, but in any case such script requires some coding.
What to use - here is short discussion ,all depends on goals.
Where to learn - quite old feature, not sure. Try google for "excel structured references", first I found
Using structured references with Excel tables - Microsoft Support
Structured references in Excel tables (ablebits.com)
- JonBastiansJun 05, 2023Copper Contributor
Thankyou SergeiBaklan
I'll try these solutions asap. I read the discussion as well. I have been getting good results using power query so I think I'll look at M language next to enhance my usage of power query. Thanks again 🙂