DATA Step, Macro, Functions and more

If then else in macro issue

Accepted Solution Solved
Reply
New Contributor
Posts: 2
Accepted Solution

If then else in macro issue

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
Solution
‎07-13-2012 12:27 PM
PROC Star
Posts: 1,230

Re: If then else in macro issue

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;


View solution in original post


All Replies
Super User
Posts: 10,487

Re: If then else in macro issue

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.

Solution
‎07-13-2012 12:27 PM
PROC Star
Posts: 1,230

Re: If then else in macro issue

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;


New Contributor
Posts: 2

Re: If then else in macro issue

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.

☑ This topic is SOLVED.

Need further help from the community? Please ask a new question.

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