Explanation

At the core, this formula builds a level 1 and level 2 number and concatenates the two numbers together with a period (".") as a separator. The result is a value like “1.1”. The “level 1” number is generated with COUNTA like this:

=COUNTA($B$5:B5)

Note the range is an expanding reference , so it will expand as it is copied down the column.

The “level 2” number is generated with this code:

IF(B5<>"",1,MID(D4,FIND(".",D4)+1,LEN(D4))+1)

Here, the IF function is used to check the contents of B5. If B5 is not blank, it means we have a new level 1 heading and IF returns 1. In other words, every time we have a new level 1 entry, we restart level 2 numbering at 1.

If the B5 is blank we need to increment the level 2 number using the value in the cell above. This is a bit tricky, because the outline number is a text string, not a number. That means we need to extract the value with a text function before we can increment. To do this, we use the MID function to extract all text to the right of the period ("."), which we locate with the FIND function:

MID(D4,FIND(".",D4)+1,LEN(D4))+1

The LEN function is used as a simple way to guarantee all characters after the period are extracted. Notice we then add 1 directly to the result, which is still text. This math operation causes Excel to coerce the text to a number, so the result is an incremented number. Finally, the level 1 and level 2 numbers are concatenated together with a period (".") as a separator.

Explanation

This formula uses the “greater than or equal to” operator with text, something you might not have tried before. When Excel compares text, it decides which value is “greater” than another based on rules that follow the ASCII specification .

Inside COUNTIF, the range argument is supplied as the named range “countries” (B4:B13), and the criteria is supplied as “less than or equal to” the value in C5. In each row, COUNTIFS returns the number of values that are less than or equal to the current value, which creates a sequential list of numbers (i.e. a rank) in the helper column .

Listing sorted values

The helper column can be used to retrieve sorted values by rank. In E5, the formula used to retrieve values is:

=INDEX(countries,MATCH(ROWS($E$5:E5),helper,0))

This is an INDEX and MATCH formula that uses an expanding reference to generate sequential numbers, which are fed into MATCH as lookup values. MATCH figures out where each number exists in the data, and INDEX retrieves the value at that position. See this page for a more detailed explanation .

Handling duplicates

If the data contains duplicate text values, the sequence of sort numbers will also contain duplicates, which will cause problems if you are trying to retrieve values with the INDEX function. To work around this problem, you can use a variation of the formula that increments duplicates with a second COUNTIF:

=COUNTIF(countries,"<"&B5)+COUNTIF($B$5:B5,B5)

Note the logical operator in the first COUNTIF function has been adjusted, and the range in the second COUNTIF function is an expanding reference .