BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
egoldstein
Calcite | Level 5

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?

1 ACCEPTED SOLUTION

Accepted Solutions
Quentin
Super User

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;


BASUG is hosting free webinars Next up: Jane Eslinger presenting PROC REPORT and the ODS EXCEL destination on Mar 27 at noon ET. Register now at the Boston Area SAS Users Group event page: https://www.basug.org/events.

View solution in original post

3 REPLIES 3
ballardw
Super User

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.

Quentin
Super User

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;


BASUG is hosting free webinars Next up: Jane Eslinger presenting PROC REPORT and the ODS EXCEL destination on Mar 27 at noon ET. Register now at the Boston Area SAS Users Group event page: https://www.basug.org/events.
egoldstein
Calcite | Level 5

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.

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

How to Concatenate Values

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 3 replies
  • 3839 views
  • 3 likes
  • 3 in conversation