首先補充一點:
記得自己在看書的時候,好像是說%if %else 只能用在宏里面,但是昨天有人提醒現在的%if %else可以直接放在開放的代碼里,也就是你沒必要為了寫%if %else 而寫一個宏定義,比如下面這樣:
%macro test;
%if %then %do;
%else %do;
%mend;
%test
上面這樣是沒必要的,你可以直接寫%if %else,也就是兩種方法都可以。這個注意一下就好了.

一:
不知道大家在開始學習宏的時候,發(fā)現在宏里面不能直接用in選項,你得寫好幾個or選項,比如在data步中我們可以直接寫if a in (1:3) ,但是在宏里面你可能就得寫上3個,if a=1 or a=2 or a=3;這要是有幾十個選項,這不是要一大段or,顯然不是很現實。在宏里面,其實也可以用in選項的。
直接用宏選項:
%macro inin;
%if aa in aa bb cc dd %then %do;
%put "this is a test";
%end;
%else %put "error,no in options";
%mend;
%inin

但是我們加上這個系統(tǒng)選項之后 minoperator:控制宏處理器是否識別和計算IN(#)邏輯運算符。
options minoperator;
%
macro inin;
%if aa in aa bb cc dd %then %do;
%put this is a test;
%end;
%else %put "error,no in options";
%mend;
%inin

需要注意列表需要以空格分隔,不能以逗號分隔,但是在DATA步中兩種都可以。

但是我們自己可以指定分隔符,通過options mindelimiter=',';
指定分隔符后,如果你還是用空格的話,就會返回false,也就是跳到%else。
如果需要恢復空格,直接options mindelimiter='';就可以了。
同時在宏語言中#就代表in
%macro inin(var=,list=);
%if %upcase(&var) # %upcase(&list) %then %do;
%put &=var is in &list;
%end;
%else %put error,no in options;
%mend;
%inin(var=aa,list=aa bb cc dd);

二:
宏注釋:
- %*; Macro comments 推薦
%*這是一句注釋程序,放在宏里面安全;
- /* / style comments 推薦
/這也是一句注釋語句,放在宏里面安全/
3) ; asterisk-style comments 不推薦
這種注釋語句放在宏里面不安全,因為可能被識別成宏的一部分;這就讓我想起了以前寫的一篇文章,用這種注釋方法,然后宏一直報錯或者運行不出來。

SAS推薦用 //這種注釋方法,這種注釋會在任何其他類型的注釋之前從代碼中刪除。
宏注釋(%;)和星號風格的注釋(* ;)是完整的語句,因此它們是標記化的。這意味著它們不能包含嵌入的分號或不匹配的引號。
需要注意的是,雖然上面這3種都是注釋的方法,但是它們在log里面展示的方法卻不一樣。在宏定義里面,只有星號風格的注釋(* ;)能顯示在log(調用mprint的時候)
在開放式代碼的時候,上面這3中注釋方法都能顯示在log里面。
下面把上面圖片中的注釋用Macro comments 和style comments 修改一下,這兩種注釋方法不會出現問題。
Macro comments:雖然在SASEG上看只有一段被注釋了,但是程序能夠正常運行的。

style comments:同時調用mprint;


加上星號注釋,只有這種注釋能顯示在log里面


上面這些就是關于宏注釋的一些知識點。