まず、B28が空欄の場合でもVLOOKUP関数の結果がエラーとはならない場合もありますから、B28セルが空欄の場合にはVLOOKUP関数による処理へ進まない様にする必要があります。(それは質問者様の関数でも「IF($B28="","",」の部分で行われる様になっています)
又、F28セルの値が数値ではない場合(空欄の場合や文字列データが入力されていた場合等)にも「($F28*2)」に対して割り算を行う処理をしない様にされた方が良いと思います。
そして、「VLOOKUP($B28,形態!$B$5:$Z$200,7,FALSE)」の結果がエラーである場合や、0が返される場合、そして文字列データが返される場合には、その結果を分数の分母に使う事は出来ないのですから、その様な場合には「($F28*2)」に対して割り算を行う処理をしない様にする必要があります。
これらの点を考慮しますと、次の様な関数とされた方が良いと思います。
=IF(AND($B28<>"",ISNUMBER($F28)),IFERROR($F28*2/VLOOKUP($B28,形態!$B$5:$Z$200,7,FALSE),""),"")
上記の関数では、
$B28<>""
という部分で、B28セルが空欄ではないかどうか事を確認し、
ISNUMBER($F28)
という部分で、F28セルに数値データが入力されているかどうかという事を確認し、これら2つの判定式をANDで囲む事により、この2つの条件がどちらも満たされている場合にのみ次の処理へと進む様になっています。
そして、
/VLOOKUP($B28,形態!$B$5:$Z$200,7,FALSE)
という「VLOOKUPの結果を分母とする分数が含まれている計算」を行っている箇所を、IFERROR関数で囲む事により、「VLOOKUP($B28,形態!$B$5:$Z$200,7,FALSE)」の結果がエラーである場合や、0が返される場合、そして文字列データが返される場合には、「VLOOKUPの結果を分母とする分数が含まれている計算」を行わない様にしています。
尚、F28セルに数値データが入力されているかどうかという事を確認しないまま、
IFERROR($F28*2/VLOOKUP($B28,形態!$B$5:$Z$200,7,FALSE),"")
という処理を行う様にしてしまうと、F28セルが空欄の場合にも計算が行われる様になってしまいますので、
ISNUMBER($F28)
等でF28セルが空欄ではない事を確認する判定式は外せません。
只、F28セルの値が文字列データやエラーだった場合には、その後のIFERROR関数の所で割り算を行わない様に出来ますから、
ISNUMBER($F28)
としなくても、F28セルが空欄ではない事を確出来さえすれば良いと考える事も出来ます。
ですから、例えば次の様な関数とする事も出来ます。
=IF(OR($B28="",$F28=""),"",IFERROR($F28*2/VLOOKUP($B28,形態!$B$5:$Z$200,7,FALSE),""))