マクロ変数の存在チェック

[OS] ALL
[リリース] 6.09E, 6.12, 8.2
[キーワード] Base, MACRO, EXIST CHECK

[質問]

マクロ変数が定義されているかどうかをチェックする方法はありますか?

[回答]

現在定義されているマクロ変数は、SASHELP.VMACROビューを参照して確認できます。
チェックするマクロ変数名と変数NAMEの値が同じオブザベーションがあれば、マクロ変数が定義されています。

例1
%macro check(mvar);
  %* mvar: マクロ変数名;
  %local i tmp;
  %let dsid=%sysfunc(open(sashelp.vmacro));
  %let num=%sysfunc(varnum(&dsid,name));
  %do %until(&ob = -1);
    %let i=%eval(&i+1);
    %let ob=%sysfunc(fetchobs(&dsid,&i));
    %let val=%sysfunc(getvarc(&dsid,&num));
    %if &val = %upcase(&mvar) %then %do;
      %let ob = -1;
      %let tmp=yes;
    %end;
    %else %do;
      %let tmp=no;
    %end;
    %if &ob=-1 %then %do;
      &tmp
    %end;
  %end;
  %let rc=%sysfunc(close(&dsid));
%mend check;

%put Does the macro variable exist: %check(abc);

例2
%macro check2(mvar);
  %* mvar: マクロ変数名; 
  %global _exist;
  %let _exist=;
  proc sql noprint;
    select count(*) into :_chk from sashelp.vmacro
    where name = "%upcase(&mvar)";
  quit;
  %if &_chk = 0 %then %let _exist=no;
  %else %let _exist=yes;
%mend check2;

%check2(abc);
%put &_exist;