- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
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?
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
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;
Next up: Rick Wicklin presents Ten Tips for Effective Statistical Graphics (with SAS code) on Wednesday March 26.
Register now at https://www.basug.org/events.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
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;
Next up: Rick Wicklin presents Ten Tips for Effective Statistical Graphics (with SAS code) on Wednesday March 26.
Register now at https://www.basug.org/events.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
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.