Is this the %VARCOND() macro you are trying to call in the middle of a %IF statement?
13 %macro varcond; 14 %let dsn=AE; 15 data _temp_; 16 %do i =1 %to %sysfunc(countw(&variables.)); 17 %let var=%scan(&variables.,&i); 18 varcond= "%"||"varexist(sdtmcro.&dsn,&var)"; 19 output; 20 %end; 21 domain="&dsn"; 22 run; 23 24 proc sort data=_temp_; 25 by domain ; 26 run; 27 28 data _temp_; 29 length varcondn $500.; 30 do until(last.domain ); 31 set _temp_; 32 by domain ; 33 varcondn=catx(' and ',varcondn,varcond); 34 end; 35 run; 36 37 proc sql; 38 select varcondn into : varcondn 39 from _temp_; 40 quit; 41 42 %put &varcondn.; 43 44 %mend varcond;
It is generating many many SAS statements. You cannot call that macro in the middle of another statement.
If you write
%if %varcond(lb) %then ....
It will generate code into the middle of your %IF statement.
%if data _tmp_; ...
It looks like that macro is intended to set a macro variable named VARCONDN.
So first create the macro variable. Then call the macro. Then test the macro variable.
%let varcondn=0 ;
%varcond;
%if (&varcondn) %then ....
Yes. This is the macro I am calling in another program.
What will be the best approach to create macro variable which holds the "string" e.g. "%varexist(sdtmcro.&dsn,var1) and %varexist(sdtmcro.&dsn,var2)" and it can be recalled in another program in IF statement?
NOTE:
VAR1 and VAR2 can be any variables which are defined in some other macro variable &VARIABLES. This is not constant macro variable, it changes with dataset name.
@petlove wrote:
What will be the best approach to create macro variable which holds the "string" e.g. "%varexist(sdtmcro.&dsn,var1) and %varexist(sdtmcro.&dsn,var2)" and it can be recalled in another program in IF statement?
NOTE:
VAR1 and VAR2 can be any variables which are defined in some other macro variable &VARIABLES. This is not constant macro variable, it changes with dataset name.
Here is a macro that you can in a "functional" mode. That is it emits only part of a statement. So you could use it inside an IF, %IF or assignment statement.
%macro varcond(dsn,varlist);
%local i sep ;
%do i=1 %to %sysfunc(countw(&varlist));
&sep %varexist(&dsn,%scan(&varlist,&i))
%let sep=and;
%end;
%mend varcond;
So you might use it this way.
80 options mprint; 81 %let mydataset=SASHELP.CLASS; 82 %let variables=AGE GENDER ; 83 data _null_; 84 if %varcond(&mydataset,&variables) then put "&mydataset has all of the variables: &variables" 84 ! ; MPRINT(VAREXIST): 3 MPRINT(VARCOND): and MPRINT(VAREXIST): 0 85 else put "&mydataset is missing one or more of the variables: &variables"; 86 run; SASHELP.CLASS is missing one or more of the variables: AGE GENDER NOTE: DATA statement used (Total process time): real time 0.26 seconds cpu time 0.01 seconds 87 88 %let variables=AGE SEX ; 89 data _null_; 90 if %varcond(&mydataset,&variables) then put "&mydataset has all of the variables: &variables" 90 ! ; MPRINT(VAREXIST): 3 MPRINT(VARCOND): and MPRINT(VAREXIST): 2 91 else put "&mydataset is missing one or more of the variables: &variables"; 92 run; SASHELP.CLASS has all of the variables: AGE SEX NOTE: DATA statement used (Total process time): real time 0.34 seconds cpu time 0.00 seconds
Thank you so much Tom for your suggestion. The approach you mentioned is working in my program.
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
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.
Ready to level-up your skills? Choose your own adventure.