`Find` is a very slow method for doing what you need. You will achieve much greater performance, and avoid the need for complex error handling, by reading the search range into an array, and looping over the first dimension to find the row, then looping over the second to find the column. **Edit**: Depending upon the number of rows and columns that you expect, or perhaps even after inspecting the size of the search array, you could squeeze out some extra performance by checking to see if there are *fewer* columns than rows and then check if the column exists, *before* checking if the row exists. And if there are fewer rows than columns, then check to see if the row exists *before* checking if the column exists. **Edit2**: if you'll be calling this function multiple times, with similar sheet names, row values or column values, you could optimize further by keeping `Scripting.Dictionary`s of column names and indexes, and row names and indexes. That would be the fastest approach.