Explanation

Sometimes you encounter data that mixes units directly with numbers (i.e. 8km, 12v, 7.5hrs). Unfortunately, Excel will treat the numbers in this format as text, and you won’t be able to perform math operations on such values.

To split a number from a unit value, you need to determine the position of the last number . If you add 1 to that position, you have the start of the unit text. This formula uses this concept to figure out where the unit of measure begins.

In the example shown, the formula in C5 is:

=MAX(ISNUMBER(VALUE(MID(B5,{1,2,3,4,5,6,7,8,9},1)))*{1,2,3,4,5,6,7,8,9})+1

This formula uses the MID function to extract the first 9 values in B5, one character at a time:

MID(B5,{1,2,3,4,5,6,7,8,9},1)

The array constant {1,2,3,4,5,6,7,8,9} is just a simple hack to extract up to 9 characters from a cell value into an array . The result looks like this:

{"8","0","v","","","","","",""}

We then use the VALUE function to convert numbers in text format to actual numbers. The result is:

{8,0,#VALUE!,#VALUE!,#VALUE!,#VALUE!,#VALUE!,#VALUE!,#VALUE!}

We run this array through ISNUMBER to get:

{TRUE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE}

Then multiply that times another array with 9 numbers to get:

{1,2,0,0,0,0,0,0,0}

We use MAX to get the largest value, which is the position of the “last number”, then we add 1 to the position to get the “unit start” position. Finally, we use this position with standard LEFT and RIGHT functions to separate the numbers from the units:

=VALUE(LEFT(B5,C5-1)) // number
=TRIM(RIGHT(B5,LEN(B5)-C5+1)) // unit

Note that the hard-coded number array constant is a hack for convenience, and will only handle raw values up to 9 characters in length.

Explanation

Overview

The formula looks complex, but the mechanics are in fact quite simple.

As with most formulas that split or extract text, the key is to locate the position of the thing you are looking for. Once you have the position, you can use other functions to extract what you need.

In this case, we are assuming that numbers and text are combined, and that the number appears after the text. From the original text, which appears in one cell, you want to split the text and numbers into separate cells, like this:

OriginalTextNumber
Apples30Apples30
peaches24peaches24
oranges12oranges12
peaches0peaches0

As stated above, the key in this case is to locate the starting position of the number, which you can do with a formula like this:

=MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789"))

Once you have the position, to extract just the text, use:

=LEFT(A1,position-1)

And, to extract just the number, use:

=RIGHT(A1,LEN(A1)-position+1)

In the first formula above, we are using the FIND function to locate the starting position of the number. For the find_text, we are using the array constant {0,1,2,3,4,5,6,7,8,9}, this causes the FIND function to perform a separate search for each value in the array constant. Since the array constant contains 10 numbers, the result will be an array with 10 values. For example, if original text is “apples30” the resulting array will be:

{8,10,11,7,13,14,15,16,17,18}

Each number in this array represents the position of an item in the array constant inside the original text.

Next the MIN function returns the smallest value in the list, which corresponds to the position in of the first number that appears in the original text. In essence, the FIND function gets all number positions, and MIN gives us the first number position: notice that 7 is the smallest value in the array, which corresponds to the position of the number 3 in original text.

You might be wondering about the odd construction for within_text in the find function:

B5&"0123456789"

This part of the formula concatenates every possible number 0-9 with the original text in B5. Unfortunately, FIND doesn’t return zero when a value isn’t found, so this is just a clever way to avoid errors that could occur when a number isn’t found.

In this example, since we are assuming that the number will always appear second in the original text, it works well because MIN forces only the smallest, or first occurrence, of a number to be returned. As long as a number does appear in the original text, that position will be returned.

If original text doesn’t contain any numbers, a “bogus” position equal to the length of the original text + 1 will be returned. With this bogus position, the LEFT formula above will still return the text and RIGHT formula will return an empty string ("").