I have code of the following form:
%macro y(y);
else if year=200&y. then do;
<code>; end;
%mend y;
%macro go(com);
data &com._1
merge &com._2 &com._3 ;
by type;
if year=2001 then do;
<code>; end;
%y(2); %y(3); %y(4); %y(5);
run;
%mend go;
%go(ABC);
When run, I get an error message on the invocation of %y(3), %y(4), and %y(5) that:
ERROR 160-185: No matching IF-THEN clause
If I change the code of the "y" macro to just be an if statement, the problem goes away, but I can't figure out why the problem exists in the first place. Any thoughts on why this is happening?
MPRINT is a good recommendation.
My guess is you have two many extra semicolons. You dont need a semicolon after a macro call.
Try changing:
%y(2); %y(3); %y(4); %y(5);
To
%y(2) %y(3) %y(4) %y(5)
Below code shows the same errors caused by extra semicolon creating a null statement. It breaks the else if:
options mprint; %macro y(year); else if year=&year then x=1; %mend; data _null_; year=1990; *extra semicolons after macro call cause null statement which breaks else if error; if year=1 then x=1; %y(2000); %y(2001); *can see same errors without macro, caused by extra semicolon; if year=1 then x=1; else if year=2000 then x=1;; else if year=2001 then x=1;; run;
Use OPTIONS MPRINT ; and then run you %go macro to see what the generated code looks like.
You might also try removing the "." ad 200&y. or other places in your <code> if any.
Instead of a macro like %y I would probably do something like
Else do year= 2002 to 2005;
<code>
End;
unless code is using the &y values somewhere.
MPRINT is a good recommendation.
My guess is you have two many extra semicolons. You dont need a semicolon after a macro call.
Try changing:
%y(2); %y(3); %y(4); %y(5);
To
%y(2) %y(3) %y(4) %y(5)
Below code shows the same errors caused by extra semicolon creating a null statement. It breaks the else if:
options mprint; %macro y(year); else if year=&year then x=1; %mend; data _null_; year=1990; *extra semicolons after macro call cause null statement which breaks else if error; if year=1 then x=1; %y(2000); %y(2001); *can see same errors without macro, caused by extra semicolon; if year=1 then x=1; else if year=2000 then x=1;; else if year=2001 then x=1;; run;
Thanks Quentin and Ballardw!
I didn't do the do loop because I have variable names based on the value of y.
It ended up being the extra semicolons after calling the y macro.
I never knew that having extras of them could be a problem.
Don't miss out on SAS Innovate - Register now for the FREE Livestream!
Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.