I wrote this SAS amortization schedule program. First without macro the program compiles fine. Please see code below:
data amortzAB;
balance=480000;
month=0;
do until (month>=30*12);
month=month+1;
/*Compute interest rate amortized;*/
rate= 0.06/12 ;
/*Compute the monthly payment;*/
monthly =(480000)*(rate*(1+rate)**(30*12))/((1+rate)**(30*12)-1);
/*Compute interest paid every month;*/
interest_amount=(balance)*rate;
/*Compute principal toward amount borrowed;*/
principal_toward_paymt=monthly-interest_amount;
/*Updated the new balance after each month;*/
balance=(balance)-principal_toward_paymt;
if (balance<monthly) then monthly=balance;
if (balance <0) then stop;
output;
END;
run;
proc print data=amortzAB;
var balance rate monthly principal_toward_paymt interest_amount month ;
title "Amortization schedule &theplan. with &theperiod. years";
title2 "and a downpayment of &thedeposit.";
run;Now I turned over to the use of macro but I keep getting this error :
OPTIONS MPRINT MLOGIC SYMBOLGEN;
%macro amortz_macro (theplan=,thebalance=,therate=, theperiod=, thedeposit=);
data amortzAB;
balance=&thebalance.;
month=0;
%do %until (month>=&theperiod.*12);
month=month+1;
/*Compute interest rate amortized;*/
rate= &therate./12 ;
/*Compute the monthly payment;*/
monthly =(&thebalance.)*(rate*(1+rate)**(&theperiod.*12))/((1+rate)**(&theperiod.*12)-1);
/*Compute interest paid every month;*/
interest_amount=(balance)*rate;
/*Compute principal toward amount borrowed;*/
principal_toward_paymt=monthly-interest_amount;
/*Updated the new balance after each month;*/
balance=(balance)-principal_toward_paymt;
%if (balance<monthly) %then monthly=balance;
%if (balance <0) %then stop;
output;
%END;
run;
proc print data=amortzAB;
var balance rate monthly principal_toward_paymt interest_amount month ;
title "Amortization schedule &theplan. with &theperiod. years";
title2 "and a downpayment of &thedeposit.";
run;
%mend amortz_macro;
%amortz_macro(theplan=A,thebalance=480000,therate=0.06, theperiod=30, thedeposit=120000);
%amortz_macro(theplan=B,thebalance=499200,therate=0.055, theperiod=30, thedeposit=120000);
%amortz_macro(theplan=A,thebalance=480000,therate=0.06, theperiod=15, thedeposit=120000);Can anybody help determine what is the real problem.-Thanks.
Just because you are writing a macro doesn't mean you have to switch to %IF and %DO. Get rid of all the percent signs and you should be fine (keep the ampersands, however).
@Astounding Simply Brilliant!!!!!! line
Thanks for responding.
I noticed two things. First is that the %do %until was the problem. When I replaced it by the %do i=1 %to (&theperiod.*12) ; then the code compiled successfully and produced the expected result.
The second thing that made it work is by removing the % sign from the if then.
Can someone explain to me why especially for the case of the %do %until which did not work?
Thanks.
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!
Still thinking about your presentation idea? The submission deadline has been extended to Friday, Nov. 14, at 11:59 p.m. ET.
Get started using SAS Studio to write, run and debug your SAS programs.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.