Explanation
Note: In Excel 365, the new SEQUENCE function is a better and easier way to create an array of numbers. The method explained below will work in previous versions.
The core of this formula is a string that represents rows. For example, to create an array with 10 numbers, you can hard-code a string into INDIRECT like this:
=ROW(INDIRECT("1:10"))
The INDIRECT function interprets this text to mean the range 1:10 (10 rows) and the ROW function returns the row number for each row in that range inside an array.
The example shown uses a more generic version of the formula that picks up the start and end numbers from B5 and C5 respectively, so the solution looks like this:
=ROW(INDIRECT(B5&":"&C5))
=ROW(INDIRECT(1&":"&5))
=ROW(INDIRECT("1:5"))
=ROW(1:5)
={1;2;3;4;5}
The reason INDIRECT is used in the formula is to guard against worksheet changes. Without INDIRECT, inserting or deleting rows can change the range reference, for example:
=ROW(1:5)
will change to:
=ROW(1:4)
If row 1 is deleted. Because INDIRECT works with a reference constructed with text, it isn't affected by changes on the worksheet.
Relative row numbers in a range
If you need an array that consists of the relative row numbers of a range, you can use a formula like this:
=ROW(range)-ROW(range.firstcell)+1
See this page for a full explanation.
Negative values
The ROW function won't handle negative numbers, so you can't mix negative numbers in for start and end. However, you can apply math operations to the array created by ROW. For example, the following formula will create this array: {-5;-4;-3;-2;-1}
=ROW(INDIRECT(1&":"&5))-6
Numbers in reverse order, n to 1
To create an array of positive numbers in descending order, from n to 1, you can use a formula like this:
=ABS(ROW(INDIRECT("1:"&n))-(n+1))