1

変数からマクロ名を設定する方法を知りたいです。

このような:

    %Macro test(name);
      ... 
      %Macro new_&name;
        ... 
      %Mend;
      ... 
    %Mend test

または、これが不可能な場合:

    %macro one(name);
       %let mname=&name;
    %mend one;

    %macro two_&name;
      ...
    %mend;

何か案は?どうもありがとう。

4

4 に答える 4

1

%MACRO ステートメントで変数を使用できないとは知りませんでしたが、そのようです。SAS ドキュメント ( http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#macro-stmt.htm ) に記載されているように、「テキスト式を使用して%MACRO ステートメントでマクロ名を生成します。"

次に考えたのは、%MACRO ステートメントを変数として作成できるかもしれないということでしたが、変数の作成時に %MACRO をマスクする方法が見つかりませんでした。

私は最終的に回避策を見つけましたが、これを行うための最良の方法ではない可能性があります (そして、あなたがやろうとしていることにうまくいかないかもしれません)。データ ステップでマクロ ステートメントをコンパイルできることがわかりました。残念ながら、マクロ コード全体 (%MACRO から %MEND ステートメントまで) が変数に保存されている場合にのみ、変数からマクロを実行できました。以下のコードを参照してください。

%MACRO test(name);
data test;
    *COMPILE MACRO STATEMENT;
    pct=%nrstr('%');
    name="new_&name";
    beginning=pct||'MACRO '||strip(name)||'();';

    *CODE TO BE INSIDE MACRO;
    /*Note: SAS will encounter errors if you try to assign text containing macro 
      functions (e.g., %PUT, %IF, etc.) to a variable. To get around this, you must
      put hide the % in the following syntax, %nrstr('%'), and concatenate/join the 
      syntax with the rest of the string */
    code=pct||'PUT HELLO!;';

    *COMPILE MEND STATEMENT;
    end=pct||'MEND;';

    call symput('MacroStatement',beginning||code||end); *Output var containing macro;
    call symput('Execute',pct||strip(name)||';'); *Output var containing statement to run macro;
    output;
run;

&MacroStatement
&Execute

%MEND;
%test(name1);
于 2013-11-04T18:22:03.820 に答える