## Explanation

The gist of this problem is that we want to get the first non-blank cell, but we don't have a direct way to do that in Excel. The easiest way to solve this problem is with the XLOOKUP function.

### XLOOKUP function

The XLOOKUP function is a modern upgrade to the VLOOKUP function. XLOOKUP is very flexible and can handle many different lookup scenarios. The generic syntax for required inputs looks like this:

`=XLOOKUP(lookup_value,lookup_array,return_array)`

The meaning of these arguments is as follows:

*lookup_value*- the value to look for*lookup_array*- the range or array to search within*return_array*- the range or array to return values from

For more details, see How to use the XLOOKUP function.

### The ISBLANK function

The ISBLANK function simply returns TRUE when a cell is empty, and FALSE if a cell is not empty. If A1 contains "apple" and B1 contains nothing, then ISBLANK returns the following:

```
=ISBLANK(A1) // returns FALSE
=ISBLANK(B1) // returns TRUE
```

For more details, see How to use the ISBLANK function.

### NOT function

The NOT function simply returns the opposite of a given logical or Boolean value:

```
=NOT(FALSE) // returns TRUE
=NOT(TRUE) // returns FALSE
```

You can use the NOT function to "reverse" the output from other functions like ISBLANK, as seen below.

For more details, see How to use the NOT function.

### XLOOKUP formula

The formula in cell E5 combines the functions above like this:

`=XLOOKUP(TRUE,NOT(ISBLANK(C5:C16)),C5:C16)`

At a high level, XLOOKUP looks for TRUE and returns a corresponding value from C5:C16. It first uses ISBLANK to create an array with TRUE for blank cells and FALSE for non-blank cells. This array is then reversed using the NOT function, resulting in TRUE for non-blank cells and FALSE for blank cells. This final array serves as the lookup array for XLOOKUP. Working from the inside out, we start with the ISBLANK function is given the range C5:C16 like this:

`ISBLANK(C5:C16)`

Because C5:C16 contains 12 values, ISBLANK returns an array that contains 12 TRUE and FALSE results.

`{TRUE;FALSE;TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;TRUE;TRUE}`

The TRUE values in the array indicate blank cells, and the FALSE values indicate non-blank cells. The array is returned directly to the NOT function in order to "reverse" the results. The output from NOT is a new array like this:

`{FALSE;TRUE;FALSE;TRUE;TRUE;FALSE;TRUE;TRUE;TRUE;TRUE;FALSE;FALSE}`

In this array, the TRUE values in the array indicate *non-blank *cells and the FALSE values indicate *blank *cells. This array is delivered directly to the XLOOKUP function as the *lookup_array*:

`=XLOOKUP(TRUE,{FALSE;TRUE;FALSE;TRUE;TRUE;FALSE;TRUE;TRUE;TRUE;TRUE;FALSE;FALSE},C5:C16)`

With a lookup value of TRUE, XLOOKUP matches the first TRUE in the *lookup_array* (the second value), and returns the corresponding value from the range C5:C16 (10) as a final result.

### Testing the formula

To test the formula, we can delete the value in C6. The formula returns the value in cell C8 after the value in cell C6 is deleted:

### More specific tests

You can easily adapt the XLOOKUP formula above to target certain types of content specifically. To find the first *numeric value* in a list, you can modify the XLOOKUP formula to use the ISNUMBER function:

```
=XLOOKUP(TRUE,ISNUMBER(range),range)
```

To find the first text value, use the ISTEXT function:

```
=XLOOKUP(TRUE,ISTEXT(range),range)
```

One quirk of ISBLANK is that it returns FALSE if a cell contains a formula that returns an empty string (""), even though an empty string is meant to look like a blank cell. If you need to detect cells that contain a formula returning an empty string (""), you can use the LEN function:

```
=XLOOKUP(TRUE,LEN(range)>0,range)
```

Technically, this formula is testing for cells that have *more than zero characters.*

### INDEX and MATCH formula

In older versions of Excel that do not provide the XLOOKUP function, you can use an array formula based on INDEX and MATCH like this:

`=INDEX(C5:C16,MATCH(TRUE,NOT(ISBLANK(C5:C16)),0))`

*Note: this is an array formula and must be entered with control + shift + enter in Excel 2019 and older.*

This formula has basically the same logic as the XLOOKUP formula above. The MATCH function is used to find the position of the first non-blank cell in C5:C16. The NOT and ISBLANK functions create an array of TRUE (for non-blank cells) and FALSE (for blank cells) values that are used as a lookup array.

`MATCH(TRUE,NOT(ISBLANK(C5:C16)),0)`

After NOT and ISBLANK are evaluated, we have an array like this:

`{FALSE;TRUE;FALSE;TRUE;TRUE;FALSE;TRUE;TRUE;TRUE;TRUE;FALSE;FALSE}`

The array is returned to the MATCH function as the *lookup_array*. The *lookup_value* is provided as TRUE and *match_type* set to 0 to force an exact match:

`MATCH(TRUE,{FALSE;TRUE;FALSE;TRUE;TRUE;FALSE;TRUE;TRUE;TRUE;TRUE;FALSE;FALSE},0)`

MATCH then returns the location of the first TRUE in the array (2) as the row number to INDEX:

`=INDEX(C5:C16,2) // returns 10`

INDEX takes over and returns the value from the second cell in C5:C16 (10) as a final result.

As with XLOOKUP above, you can adapt the INDEX and MATCH formula to target specific content. For example, to get the first *numeric value, *use ISNUMBER:

`=INDEX(range,MATCH(TRUE,ISNUMBER(range),0)) // first number`

To get the first text value, use ISTEXT:

```
=INDEX(range,MATCH(TRUE,ISTEXT(range),0)) // first text
```

To get the value in the first cell with more than zero characters, use LEN:

```
=INDEX(range,MATCH(TRUE,LEN(range)>0,0))
```

*These are all array formulas, which must be entered with control + shift + enter in Excel 2019 and older.*

For more details, see How to use INDEX and MATCH.