Explanation

Note: the values in E5:E8 are actual dates, formatted with the custom number format “mmm”.

Working from the inside out, the expression:

MATCH(TRUE,TEXT(date,"mmyy")=TEXT(E5,"mmyy")

uses the TEXT function to generate an array of strings in the format “mmyy”:

{"0117";"0117";"0117";"0217";"0217";"0217";"0317";"0317";"0317"}

which are compared to a single string based on the value in E5, “0117”. The result is an array of TRUE / FALSE values:

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

This array is fed into the MATCH function as the lookup_array , with a lookup_value of TRUE, and a match_type of zero for exact match. In exact match mode, the MATCH function returns the position of the first TRUE in the array, which is 1 in the formula in F5. This position goes into INDEX as the row number, with an array based on the named range “entry”:

=INDEX(entry,1)

Finally, INDEX returns the item inside entry as a final result.

Note: if an entry isn’t found for a given month and year, this formula will return #N/A.

Get the first entry based on today’s date

To get the first entry for a given month and year based on today’s date, you can adapt the formula to use the TODAY function instead of the value in E5:

{=INDEX(entry,MATCH(TRUE,TEXT(date,"mmyy")=TEXT(TODAY(),"mmyy"),0))}

Explanation

Note: the lookup_value of 2 is deliberately larger than any values in the lookup_vector, following the concept of bignum .

Working from the inside out, the expression:

(TEXT($B$5:$B$13,"mmyy")=TEXT(E5,"mmyy"))

generates strings like “0117” using the values in column B and E, which are then compared to each other. The result is an array like this:

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

where TRUE represents dates in the same month and year. The number 1 is then divided by this array. The result is an array of either 1’s or divide by zero errors (#DIV/0!):

{1;1;1;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!}

which goes into LOOKUP as the lookup array. LOOKUP assumes data is sorted in ascending order and always does an approximate match. When the lookup value of 2 can’t be found, LOOKUP will match the previous value, so lookup will match the last 1 in the array.

Finally, LOOKUP returns the corresponding value in result_vector, which contains the amounts in C5:C13.