VLOOKUP accepts one more argument which you are not providing. This argument,
called Range_lookup, determines if VLOOKUP returns an exact match or an
approximate match. Here is the Excel Help info about Range_lookup:
Range_lookup is a logical value that specifies whether you want VLOOKUP to
find an exact match or an approximate match. If TRUE or omitted, an approximate
match is returned. In other words, if an exact match is not found, the next
largest value that is less than lookup_value is returned. If FALSE, VLOOKUP will
find an exact match. If one is not found, the error value #N/A is returned.
Add a FALSE Range_lookup argument to your VLOOKUP calls, and I think your
problem will be solved. Also, by specifying that you want an exact match, the
range you are searching need not be sorted first.