Author: Oscar Cronquist Article last updated on February 06, 2018

Click image to enlarge.

Array formula in B26:

=INDEX(tbl_1, MIN(IF((COUNTIF(tbl_2, tbl_1)=0)*NOT(COUNTIF(\$B\$25:B25, tbl_1))*(ISTEXT(tbl_1)), ROW(tbl_1)-MIN(ROW(tbl_1))+1, "")), MATCH(0, ISNONTEXT(INDEX(tbl_1, MIN(IF((COUNTIF(tbl_2, tbl_1)=0)*NOT(COUNTIF(\$B\$25:B25, tbl_1))*(ISTEXT(tbl_1)), ROW(tbl_1)-MIN(ROW(tbl_1))+1, "")), , 1))+COUNTIF(tbl_2, INDEX(tbl_1, MIN(IF((COUNTIF(tbl_2, tbl_1)=0)*NOT(COUNTIF(\$B\$25:B25, tbl_1))*(ISTEXT(tbl_1)), ROW(tbl_1)-MIN(ROW(tbl_1))+1, "")), , 1))+COUNTIF(\$B\$25:B25, INDEX(tbl_1, MIN(IF((COUNTIF(tbl_2, tbl_1)=0)*NOT(COUNTIF(\$B\$25:B25, tbl_1))*(ISTEXT(tbl_1)), ROW(tbl_1)-MIN(ROW(tbl_1))+1, "")), , 1)), 0)) + CTRL + SHIFT + ENTER

copied down as far as needed.

Array formula in B34:

=INDEX(tbl_2, MIN(IF((COUNTIF(tbl_1, tbl_2)=0)*NOT(COUNTIF(\$B\$33:B33, tbl_2))*(ISTEXT(tbl_2)), ROW(tbl_2)-MIN(ROW(tbl_2))+1, "")), MATCH(0, ISNONTEXT(INDEX(tbl_2, MIN(IF((COUNTIF(tbl_1, tbl_2)=0)*NOT(COUNTIF(\$B\$33:B33, tbl_2))*(ISTEXT(tbl_2)), ROW(tbl_2)-MIN(ROW(tbl_2))+1, "")), , 1))+COUNTIF(tbl_1, INDEX(tbl_2, MIN(IF((COUNTIF(tbl_1, tbl_2)=0)*NOT(COUNTIF(\$B\$33:B33, tbl_2))*(ISTEXT(tbl_2)), ROW(tbl_2)-MIN(ROW(tbl_2))+1, "")), , 1))+COUNTIF(\$B\$33:B33, INDEX(tbl_2, MIN(IF((COUNTIF(tbl_1, tbl_2)=0)*NOT(COUNTIF(\$B\$33:B33, tbl_2))*(ISTEXT(tbl_2)), ROW(tbl_2)-MIN(ROW(tbl_2))+1, "")), , 1)), 0)) + CTRL + SHIFT + ENTER

copied down as far as needed.

Named ranges

tbl_1 (B5:F11)
tbl_2 (B15:F23)
What is named ranges?

How to implement array formula to your workbook

Change the named ranges. If your list starts at, for example, F3. Change \$B\$25:B25 (in the first formula) or \$B\$33:B33 (in the second formula) to F2:\$F\$2.

Filter text values existing in range 1 but not in range 2.xls
(Excel 97-2003 Workbook *.xls)

COUNTIF(range,criteria)
Counts the number of cells within a range that meet the given condition

IF(logical_test,[value_if:true],[value_if_false])
Checks whether a condition is met, and returns one value if TRUE, and another value if FALSE

MATCH(lookup_value,lookup_array, [match_type]
Returns the relative position of an item in an array that matches a specified value

INDEX(array,row_num,[column_num])
Returns a value or reference of the cell at the intersection of a particular row and column, in a given range

MAX(number1,[number2],)
Returns the largest value in a set of values. Ignores logical values and text.

ROW(reference)
Returns the rownumber of a reference

ISTEXT(value)
Checks whether a value is text, and returns TRUE or FALSE

ISNONTEXT(value)
Checks whether a value is nontext (blank cells are not text) and returns True or False