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.
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 16. Read more here about why you should contribute and what is in it for you!
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.