Office 365 keeps bringing us new stuff
Last week, I wrote my first blog post in a few months. I wrote about Watching my Weight with SPC (Statistical Process Control).
In the first comment, Derek asked for a box plot, so I quickly recompiled my data and built one.
Several new features of Office 365 made it very easy to mush my data around, and I realized that this is a good example to show them in action. I used Dynamic Arrays, the
XLOOKUP function, and the new
Joe McDaid of Microsoft’s Excel team wrote about Dynamic Arrays in Dynamic Arrays and New Functions in Excel! These formulas break the old paradigm of one formula per cell. In classic Excel, you needed a formula for every value you calculated. Sure, we had array formulas, but you had to include all output cells together and enter an array formula in all of the cells at once. If you didn’t use the right number of formulas, or if your model expanded, you had to rebuild the formula. Ugh! Plus array formulas, amirite?
The new Dynamic Arrays allow you to enter a formula into one cell. Excel figures out how many cells you need, and “spills” the formula into the required range of cells. One formula, multiple cells. And with a retooling of Excel’s underlying grid, any formula can become a Dynamic Array.
In Preview of Dynamic Arrays in Excel, Joe tells us that Dynamic Arrays have rolled out to Office 365 subscribers, with users in the Semi-Annual (Targeted) channel getting them starting last month. I presume that users in the Semi-Annual channel getting them soon as well.
I used a few Dynamic Array Formulas in my example.
For years there has been a debate about which is better,
INDEX/MATCH. I don’t know why there was a debate, because
INDEX/MATCH is clearly the superior choice. Like Zoolander,
VLOOKUP can’t turn left, and there were many things that could go wrong with your lookups.
INDEX/MATCH has its own problems as well, mostly because of the default
Match_Type setting which could lead to bad results.
XLOOKUP, again by Joe McDaid, we learned of this new lookup function that eliminates the perils and shortcomings of
VLOOKUP. It’s simpler to use and more flexible, and best of all, it begins with
XL. You can read documentation in
XLOOKUP is on about the same release schedule as Dynamic Arrays.
According to Announcing
LET, the new function allows you to assign a name to a value or intermediate calculation at the beginning of the formula, then use this named argument in the main calculation. The
LET function improves performance by computing an intermediate calculation just once and allowing reuse of the computed value, and it helps readability of your formulas by allowing you to use descriptive labels for these intermediate calculations.
LET is only available to Office Insiders at this writing, so you’ll have to be patient.
Recompiling the Weight Data
In my previous post, I examined fluctuations in my body weight between last September and this April. The data is in a two-column Table. I will construct a table in the worksheet, starting in cell D2, which has month and year as column headers and day numbers in the first column of each row. This will produce a grid of mostly weights with some missing values, and it feeds directly into Peltier Tech Charts for Excel, the VBA add-in I use to make box plots.
Set up the Grid Headers with Dynamic Arrays
I need to show the months from September through April across the top. I will use the new
SEQUENCE function to make a list. In cell E2, I enter the formula
Which tells Excel to make a sequence with 1 row, 8 columns, start the sequence at 9, and increment by 1. And you see the Dynamic Array in E2:L2 filled with this sequence. If the active cell is within this range, the entire Dynamic Array range is highlighted as shown.
But Jon, you may say, you need the months to go up to 12, then start again at 1. And the answer is, no I don’t. A few rows below the first Dynamic Array, I have written a temporary formula to check the dates:
Which tells Excel to give me a date using 2019 as the year,
E2# as the month, and 1 as the day. The hash or pound sign appended to
E2# tells Excel to use the Entire Dynamic Array that is anchored in cell E2. So I’ve entered this formula in cell E6 only, but it spills into the range E6:L6 to accommodate
And we see that if I define a date using the year 2019 and the month 13, it uses 12 months to increment the year to 2020, and uses the leftover month, so I get January 2020. Well, you probably new that, but it’s a nice little trick.
In row 9 I repeat the previous formula, but with 31 days. Excel does the same thing with excess days, and converts September 31 to October 1, etc.
So Dynamic Arrays, pretty cool, right?
Now to get the dates I want, I’ll wrapt
SEQUENCE in the
and Excel gives me the first of each month in the study.
Now let’s fill in the column of days. I’ll use another
SEQUENCE function in cell D3, an easier one this time:
Which is a sequence of 31 rows and 1 column, starting with 1 and incrementing by 1.
Populate the Grid with Dynamic Array Dates
In cell E3, I entered a formula to calculate the dates for my lookups.
Meaning, give me the data using the year and month from the date
E2# and the day from
D3#. This new Dynamic Array fills up the whole rectangular range defined by the two Dynamic Arrays it references. Note the extra dates in the September, November, February, and April columns.
Make Dynamic Arrays Perform the XLOOKUP
The dates are fine (except for those extras, which we’ll take care of soon). So let’s wrap the date in
=XLOOKUP(DATE(YEAR(E2#),MONTH(E2#),D3#), Table6[Date], Table6[Weight], "")
I’ve put each argument onto its own line for clarity. Basically, I’m telling Excel to look for the date we’ve calculated, look in the Date column of Table 6, and if you find it, return the value from the Weight column of Table 6. And if you don’t find it, give me a cell that looks blank with “”.
And here are the weights, including some duplications: note that the 10/1/2019 weight of 167 appears at the top of the October column but also at the bottom of the September column.
Remove Duplicate Weights
So how do I eliminate those duplicates? Even though Excel computes
DATE(2019,9,31) using month 9, the result is month 10. So I’ll enter a formula that checks whether the month calculated in the lookup cell matches the month in the header cell: if so, perform the
XLOOKUP, but if not, return “”.
=IF(MONTH(DATE(YEAR(E2#),MONTH(E2#),D3#))=MONTH(E2#), XLOOKUP(DATE(YEAR(E2#),MONTH(E2#),D3#), Table7[Date],Table7[Weight],""),"")
Clever trick to skip those duplicates, Jon, but that’s an unwieldy formula. That big chunk
MONTH(DATE(YEAR(E2#),MONTH(E2#),D3#) appears twice, and we’ve all written monstrosities which has more than one chunk like this repeated more than twice.
LET’s Try Out LET
So I’m going to take the new function
LET out for a spin. I’ll create an argument called
TheDate, and it will stand for
MONTH(DATE(YEAR(E2#),MONTH(E2#),D3#). Then in the calculation, I’ll use
TheDate where the big chunk was before.
=LET(TheDate,DATE(YEAR(E2#),MONTH(E2#),D3#), IF(MONTH(TheDate)=MONTH(E2#), XLOOKUP(TheDate,Table8[Date],Table8[Weight],""),""))
This formula is only a few characters shorter than the original, but it’s certainly a lot easier to read. And if I had to change something in the definition of
TheDate, I would only have to change it in one place, and not worry that I forgot to change it somewhere else.
Now all I have to do is select the data and insert my box plot.
Of course, Excel often gives you many ways to accomplish the same objective. You can use Power Query to manipulate this data in the same way, as I show in a follow-up article, Use Power Query to Manipulate Your Data.