SAS Macros
SAS supports a macro feature. For more options for extending and programming in SAS (or related software), see this crosswalk of programming features.
Text Substitution
Built-in Macros
There are several built-in macros including %sysdate (system date as `DATE7`), or %systime (system time as `TIME5`).
Custom Macros
A macro can be defined as:
%let LABEL = VALUE;
These macros are referenced using &LABEL.
%let mon = 1; %let curr_yr = %sysfunc(year("&sysdate"d)); %let mon_title = %sysfunc(mdy(&mon,1,&curr_yr), monname9.);
Note: %sysfunc cannot take nested functions, but can take nested %sysfunc calls.
Program-Set Macros
A macro can also be set by symputx calls. This enables programmatic creation of macros, for example to store aggregated values from a data step.
data _NULL_; set LIBREF.TABLE end=lastobs; retain sum_my_var 0; sum_my_var = sum_my_var + my_var; if lastobs then call symputx('sum_of_my_var', put(sum_my_var, dollar10.2)); run; proc means data=LIBREF.TABLE; title "Allocation of &sum_of_my_var" run;
Note: symputx and symput are very similar. The former is silent (i.e., does not log) and trims leading spaces when converting a value into character data (which all macros must be reduced into.
Looping
It is possible to iterate over ranges using %do LABEL=START %to END. The loop value is accessed by &LABEL.
%macro mymacro; %do year=2000 %to 2020; proc means data=LIBREF.data_from_&year; title "Data from &year"; run; %end; %mend mymacro; %mymacro;
Conditional Processing
%macro mymacro; %if %month=12 %then %do; proc means data=LIBREF.TABLE; title "Year-end Summary"; run; %end; %mend; %mymacro;