BS is not my field, but some suggestions for code
1. Explictly Dim each variable -- otherwise it's a Variant
2. I guessing that either you wanted NormSDist which takes one parm, or there were 3 missing if you use NormDist. Help has a good writeup on both
3. I tend to be on the wordy side (I tell myself it's self documenting code) so I always find meaningful variable names easier to figure out 5 or 6 months later
'Function BSMValue(SharePrice As Double, ExercisePrice As Double, InterestRate As Double, _
' DividentYield As Double, OptionLife As Double, Volatility As Double, GeneratePut As Boolean) As Double
Option Explicit
Function BSMValue(S As Double, K As Double, r As Double, q As Double, T As Double, sigma As Double, i As Boolean) As Double
Dim ert As Double, eqt As Double
Dim DOne As Double, DTwo As Double, NDone As Double, NDtwo As Double
ert = Exp(-q * T)
eqt = Exp(-r * T)
If i Then
' call option
DOne = (Log(S / K) + (r - q + 0.5 * sigma ^ 2) * T) / (sigma * Sqr(T))
DTwo = (Log(S / K) + (r - q - 0.5 * sigma ^ 2) * T) / (sigma * Sqr(T))
NDone = Application.NormSDist(DOne)
NDtwo = Application.NormSDist(DTwo)
BSMValue = S * ert * NDone - K * eqt * NDtwo
Else
'put option
DOne = -(Log(S / K) + (r - q + 0.5 * sigma ^ 2) * T) / (sigma * Sqr(T))
DTwo = -(Log(S / K) + (r - q - 0.5 * sigma ^ 2) * T) / (sigma * Sqr(T))
NDone = Application.NormSDist(DOne)
NDtwo = Application.NormSDist(DTwo)
BSMValue = -S * ert * NDone + K * eqt * NDtwo
End If
End Function
Hope this helps