You can actually drop the CONCATENATE
. It won't change much, but it's an additional processing all the same:
=IFERROR(HYPERLINK("\\oes-cityhall\DATA\CITYWIDE\public\fppc filings\2013\" &
INDEX(FileName!D:D,MATCH("*"&B9&"*",FileName!D:D,0)),2013),"")
Also, if you have the exact number of rows, use that. For instance, if you have 25000 rows, use:
=IFERROR(HYPERLINK("\\oes-cityhall\DATA\CITYWIDE\public\fppc filings\2013\" &
INDEX(FileName!D$1:D$25000,MATCH("*"&B9&"*",FileName!D$1:D$25000,0)),2013),"")
The formula is a little longer, but it will definitely take less time (it will shorten the time whenever there's no match, since as long as it finds no match, it will keep looking into the other cells).
To name the hyperlink as the matched result, you'd repeat the INDEX
formula:
=IFERROR(HYPERLINK("\\oes-cityhall\DATA\CITYWIDE\public\fppc filings\2013\" &
INDEX(FileName!D$1:D$25000,MATCH("*"&B9&"*",FileName!D$1:D$25000,0)),
INDEX(FileName!D$1:D$25000,MATCH("*"&B9&"*",FileName!D$1:D$25000,0))),"")
If B9 is blank, then:
=IFERROR(HYPERLINK("\\oes-cityhall\DATA\CITYWIDE\public\fppc filings\2013\" &
INDEX(FileName!D$1:D$25000,IF(B9="",NA(),MATCH("*"&B9&"*",FileName!D$1:D$25000,0))),
INDEX(FileName!D$1:D$25000,IF(B9="",NA(),MATCH("*"&B9&"*",FileName!D$1:D$25000,0)))),"")