MS Office Forum / Excel / Programming / March 2006
Call PRICE function via VBA
|
|
Thread rating:  |
jomni - 21 Mar 2006 05:15 GMT I'm having problems calling the Excel Price (bond) function within VBA. I'm trying to build a manual yield function that needs to call excel' PRICE function. But i get #VALUE
Application.Price(...) does not work. Application.WorksheetFunction.Price(...) does not work either.
_below_is_my_code:_ Function YIELDMANUAL(vSettlement, vMaturity, vCoupon, vPrice vRedemption, iFrequency)
Dim vGuess As Variant Dim vGap As Variant
vGuess = vCoupon.Value 'set Guess rate to coupon vGap = Application.WorksheetFunction.Price(vSettlement, vMaturity vCoupon, vGuess, vRedemption, iFrequency) - vPrice
'---------- If vGap > 0 Then
Do vGuess = vGuess + 0.000001 vGap = Application.WorksheetFunction.Price(vSettlement, vMaturity vCoupon, vGuess, vRedemption, iFrequency) - vPrice Loop While vGap > 0
Do vGuess = vGuess - 0.0000001 vGap = Application.WorksheetFunction.Price(vSettlement, vMaturity vCoupon, vGuess, vRedemption, iFrequency) - vPrice Loop While vGap < 0
Do vGuess = vGuess + 0.00000001 vGap = Application.WorksheetFunction.Price(vSettlement, vMaturity vCoupon, vGuess, vRedemption, iFrequency) - vPrice Loop While vGap > 0
Do vGuess = vGuess - 0.000000001 vGap = Application.WorksheetFunction.Price(vSettlement, vMaturity vCoupon, vGuess, vRedemption, iFrequency) - vPrice Loop While vGap < 0
Do vGuess = vGuess + 0.0000000001 vGap = Application.WorksheetFunction.Price(vSettlement, vMaturity vCoupon, vGuess, vRedemption, iFrequency) - vPrice Loop While vGap > 0
Do vGuess = vGuess - 0.00000000001 vGap = Application.WorksheetFunction.Price(vSettlement, vMaturity vCoupon, vGuess, vRedemption, iFrequency) - vPrice Loop While vGap < 0
'---------- ElseIf vGap < 0 Then
Do vGuess = vGuess - 0.000001 vGap = Application.WorksheetFunction.Price(vSettlement, vMaturity vCoupon, vGuess, vRedemption, iFrequency) - vPrice Loop While vGap < 0
Do vGuess = vGuess + 0.0000001 vGap = Application.WorksheetFunction.Price(vSettlement, vMaturity vCoupon, vGuess, vRedemption, iFrequency) - vPrice Loop While vGap > 0
Do vGuess = vGuess - 0.00000001 vGap = Application.WorksheetFunction.Price(vSettlement, vMaturity vCoupon, vGuess, vRedemption, iFrequency) - vPrice Loop While vGap < 0
Do vGuess = vGuess + 0.000000001 vGap = Application.WorksheetFunction.Price(vSettlement, vMaturity vCoupon, vGuess, vRedemption, iFrequency) - vPrice Loop While vGap > 0
Do vGuess = vGuess - 0.0000000001 vGap = Application.WorksheetFunction.Price(vSettlement, vMaturity vCoupon, vGuess, vRedemption, iFrequency) - vPrice Loop While vGap < 0
Do vGuess = vGuess + 0.00000000001 vGap = Application.WorksheetFunction.Price(vSettlement, vMaturity vCoupon, vGuess, vRedemption, iFrequency) - vPrice Loop While vGap > 0 '---------- End If
YIELDMANUAL = vGuess
End Functio
Carim - 21 Mar 2006 08:19 GMT Hi Jomni,
I am just wondering if, in Tools Add Ins, you have ticked off both Analysis ToolPack, and Analysis TooPack - VBA ...
HTH Cheers Carim
jomni - 21 Mar 2006 08:34 GMT Yes, the add-in is installed. I can also call the PRICE function in the worksheet cell.
Must be something wrong in my code
Carim - 21 Mar 2006 09:51 GMT Jomni,
May be I did not express myself clearly enough ... In addition to the standard addin, there is another addin, dedicated to VBA named "Analysis TooPack - VBA " which needs to be activated for VBA to be operational ...
HTH Carim
jomni - 21 Mar 2006 10:00 GMT I have that installed as well :confused
Mike Middleton - 21 Mar 2006 21:51 GMT jomni -
1. Load Analysis Tookpak - VBA
2. In your VBA project, use Tools | References to create a reference to the ToolPak file.
3. In your project, call it like a VBA function (without Application and without Application.WorksheetFunction).
- Mike www.mikemiddleton.com
jomni - 22 Mar 2006 07:25 GMT Mike,
Great! That surely fixed my problem. I soon found out that my code i quite cumbersome so I chaged it to use the *Newton-Raphson* method.
The resulting code is shorter and with less iteratons. :cool:
Function YIELD_MANUAL(vSettlement, vMaturity, vCoupon, vPrice vRedemption, iFrequency)
Dim vGuess As Variant Dim vGap As Variant Dim vDerivative As Variant
'Set vGuess to coupon vGuess = vCoupon
'I used For Next so that it stops after 99 tries (but it shouldn't b that long in theory) For i = 1 To 99 'vPrice - Price (vGuess) - vPrice vGap = vPrice - Price(vSettlement, vMaturity, vCoupon, vGuess vRedemption, iFrequency) '(Price (vGuess) - Price (vGuess + .001))/ .001 vDerivative = (Price(vSettlement, vMaturity, vCoupon, vGuess vRedemption, iFrequency) _ - Price(vSettlement, vMaturity, vCoupon, vGuess + 0.001 vRedemption, iFrequency)) / 0.001 'This is the Newton-Raphson formula vGuess = vGuess - (vGap / vDerivative) 'If resulting vGap is already 0, then end the function 'If vGap = 0 Then GoTo 10 Next i
10 YIELD_MANUAL = vGuess
End Functio
Dana DeLouis - 22 Mar 2006 08:25 GMT > For i = 1 To 99 As an alternative to a fixed number of loops, here's one idea:
Do vGap = vPrice - Price(vSettlement, vMaturity, vCoupon, vGuess, vRedemption, iFrequency)
vDerivative = Price(vSettlement, vMaturity, vCoupon, vGuess, vRedemption, iFrequency) vDerivative = (vDerivative - Price(vSettlement, vMaturity, vCoupon, vGuess + 0.001, vRedemption, iFrequency)) / 0.001
vGuess = vGuess - (vGap / vDerivative) Loop While Abs(vGap) > 0.0000000000001 YIELD_MANUAL = vGuess
 Signature HTH. :>) Dana DeLouis Windows XP, Office 2003
> Mike, > [quoted text clipped - 33 lines] > > End Function
|
|
|