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