マクロ定義の引数の数が可変の場合の処理

[OS] ALL
[リリース] 9.3以降
[キーワード] %SCAN, %STR, PARMBUFF

[質問]

マクロ定義の引数に、カンマを区切りとしてデータセット名を記述する処理を作成しています。
指定したいデータセットの数が可変である場合、どのようなオプションや関数が利用できますか。

[回答]

マクロ定義を作成する際の%MACROステートメントに、PARMBUFFオプションを指定することで括弧を付加した引数を、自動マクロ変数&syspbuffに格納することができます。

%SCANマクロ関数では、デリミタを指定し、文字列内の特定の位置の文字列を取り出すことができるのでマクロ変数&syspbuffから、各データセット名を取得する際に利用できます。

また、データセット名が、SAS 9.3より利用できる、ブランクや特殊記号を含むような拡張命名規則に従っていて、名前リテラルを記述する必要がある場合、名前リテラルの引用符をデリミタと扱わないために、カンマと括弧を%SCAN関数に指定する必要があります。

この場合、%STRマクロ関数を使用することで、マクロプロセッサによる解釈において、カンマや括弧をテキストとして扱うことができます。なお、括弧やシングルコーテーションダブルコーテーションが一致しない場合、これらの文字の前に%を記述する必要があります。

以下の例では、括弧は左括弧と右括弧が一致しているため、%を補足する必要はありません。

OPTIONS VALIDMEMNAME=EXTEND;
%MACRO test / PARMBUFF;
 %LET dsname=%SCAN(&syspbuff,3,%STR((),));
 DATA &dsname;
  a=1;
 RUN;
%MEND test;
%test(test1,test2,'test 3'n)

詳細は、以下のリンクをご参照ください。

SAS 9.4マクロ言語:リファレンス(第4版)
%STR関数と%NRSTR関数
http://support.sas.com/documentation/cdl_alternate/ja/mcrolref/67912/HTML/default/n09tblrxldh8k0n1kt6dkj3xlxug.htm

%SCAN関数と%QSCAN関数
http://support.sas.com/documentation/cdl_alternate/ja/mcrolref/67912/HTML/default/p1nhhymw6gxixvn1johcfl6kaygw.htm

SYSPBUFF自動マクロ変数
http://support.sas.com/documentation/cdl_alternate/ja/mcrolref/67912/HTML/default/n0dwee153ed7b2n1wl471mgtczle.htm