前のページ|次のページ

%MACROステートメント

マクロ定義を開始します。

種類: マクロステートメント
制限事項: マクロ定義またはオープンコードで使用可能
参照項目: %MENDステートメント および SYSPBUFF自動マクロ変数

構文

%MACRO macro-name <(parameter-list)> </ option(s)>;

必須引数

macro-name

マクロ名を指定します。マクロ名はSAS名でなければなりません。%MACROステートメント内では、マクロ名を生成するテキスト式は使用できません。また、マクロ機能の予約語はマクロ名として使用できません(マクロ機能の予約語の一覧については、 マクロ機能の予約語を参照してください)。

parameter-list

1つまたは複数のローカルマクロ変数を指定します。これらの変数の値は、当該マクロの呼び出し時にユーザーにより指定されます。ここで指定したパラメータは、それを定義したマクロにとってローカルとなります。個々のパラメータを指定する必要があります。パラメータを生成するテキスト式は使用できません。パラメータリストには任意の数のマクロパラメータを含めることができます。複数のパラメータはカンマで区切って指定します。このパラメータリスト内にある変数は、通常、当該マクロ内で参照されます。

  • parameter-listは次の形式のいずれかで指定できます。
    • <positional-parameter-1><,positional-parameter-2 ...>
    • <keyword-parameter=<value> <,keyword-parameter-2=<value> ...>>
    positional-parameter-1 <,positional-parameter-2 ...> specifies one or more positional parameters.位置パラメータは任意の順番で指定できますが、マクロの呼び出し時には、各パラメータ値の指定順と、%MACROステートメント内での各パラメータの指定順が一致する必要があります。複数の位置パラメータを指定する場合、パラメータ間をカンマで区切ります。呼び出し時に位置パラメータに値を指定しなかった場合、マクロ機能はそのパラメータにヌル値を割り当てます。
    keyword-parameter=<value> <,keyword-parameter-2=<value> ...> names one or more macro parameters followed by equal signs.等号に続いてデフォルト値を指定できます。等号の後のデフォルト値を省略すると、そのキーワードパラメータにはヌル値が割り当てられます。デフォルトを使用すると、より柔軟なマクロ定義の作成が可能となるほか、マクロの呼び出し時に指定する必要のあるパラメータの数を削減できます。デフォルト値をオーバーライドするには、マクロの呼び出し時に、マクロ変数名に続く等号の後に新しい値を指定します。
    注: 定義できるパラメータ数に制限はありません。位置パラメータおよびキーワードパラメータの両者を1つのマクロ定義に記述する場合、位置パラメータを先に指定する必要があります。

option(s)

次に示すオプション引数のうち、いずれか1つまたは複数を指定できます。

CMD

マクロがネームスタイル呼び出しとコマンドスタイル呼び出しの両方を受け付けることを指定します。CMDオプション付きで定義されたマクロのことを、コマンドスタイルマクロと呼ぶ場合があります。

CMDオプションは、SASウィンドウのコマンドラインから実行する予定のマクロに対してのみ指定します。コマンドスタイル呼び出しを使用するには、SASシステムオプションCMDMACを有効にする必要があります。CMDMACシステムオプションが有効であり、かつコマンドスタイルマクロを自分のプログラム内で定義している場合、マクロプロセッサは、各SASコマンドの先頭ワードをスキャンすることで、それがコマンドスタイルのマクロ呼び出しであるかどうかを判定します。SASシステムオプションNOCMDMACが有効である場合、マクロプロセッサは、%記号に続くワードのみを潜在的なマクロ呼び出しとして扱います。CMDMACオプションが有効でない場合でも、CMDオプション付きで定義されたマクロに関しては、ネームスタイル呼び出しを使用できます。

DES='text'

マクロカタログ内のマクロエントリに関する説明を指定します。この説明テキストの最大長は256文字です。説明は引用符で囲む必要があります。この説明は、ユーザーがコンパイル済みマクロを含むカタログの内容を表示した場合に、CATALOGウィンドウ内に表示されます。DES=オプションは、コンパイル済みマクロ機能を使用する場合に特に役立ちます。

MINDELIMITER='single character';

MINDELIMITER=グローバルオプションの値をオーバーライドする値を指定します。この値は、一重引用符で囲まれた単一文字でなければならず、1つの%MACROステートメント内に一度だけ記述できます。

制限事項 次の文字は、区切り文字として使用することはできません。
%  &  '  "  (  )  ;  

MINOPERATOR | NOMINOPERATOR

マクロの実行時に演算式または論理式を評価する際に、マクロプロセッサがニーモニックINおよび特殊文字# を論理演算子として認識するよう指定します。この引数の設定は、NOMINOPERATORグローバルシステムオプションの設定をオーバーライドします。

引数NOMINOPERATORを指定すると、マクロの実行時に演算式または論理式を評価する際に、マクロプロセッサがニーモニックINおよび特殊文字# を論理演算子として認識しなくなります。この引数の設定は、MINOPERATORグローバルシステムオプションの設定をオーバーライドします。

PARMBUFF

マクロ呼び出しにおけるパラメータ値のリスト全体(ネームスタイル呼び出しにおけるかっこを含む)を、自動マクロ変数SYSPBUFFの値として割り当てます。PARMBUFFオプションを指定すると、可変数個のパラメータ値を受け付けるマクロを定義できます。

マクロ定義内にパラメータのセットとPARMBUFFオプションの両方が含まれている場合、そのマクロを呼び出すと、これらのパラメータは対応する値を受け取ります。また、これにより、値の呼び出しリスト全体が変数SYSPBUFFに割り当てられます。
PARMBUFFオプション付きで定義されたマクロを、ウィンドウ環境または対話型ラインモードセッションにおいて値リストを指定せずに呼び出すには、その呼び出しに続いて空のかっこを入力するか、またはその他のプログラムステートメントを入力します。この操作により、マクロ定義のパラメータが含まれていない場合であっても、値リストが存在しないことが指定されます。

SECURE | NOSECURE

マクロをコンパイル済みマクロライブラリに保存する際に、そのマクロの内容を暗号化するよう指定します。この機能を使うと、マクロ自身に含まれている知的所有権を保護するようなセキュアなマクロを作成できます。これらのマクロは、Encryption Algorithm Managerを使用して保護されます。

NOSECUREオプションは、セキュリティを有効化するためにファイルやライブラリのソースをグローバル編集する場合の使用を前提として提供されているものです。たとえば、保護が必要なマクロをいくつか作成するとします。このようなマクロを作成する場合、NOSECUREオプションを使用します。その後、すべてのマクロが完成し実務で使用できるようになった時点で、グローバル編集を行い、NOSECUREをSECUREに変更します。
マクロでSECUREオプションとSOURCEオプションを指定した場合、%COPYステートメントの使用時に出力が生成されなくなります。この場合、次の注意がSASログに書き込まれます。
注:The macro %name was compiled with the SECURE option.No output will be produced for this %COPY statement.

STMT

マクロがネームスタイル呼び出しまたはステートメントスタイル呼び出しを受け付けることを指定します。STMTオプション付きで定義されたマクロのことを、ステートメントスタイルマクロと呼ぶ場合があります。

ステートメントスタイル呼び出しを使用するには、IMPLMACシステムオプションを有効にする必要があります。IMPLMACシステムオプションが有効であり、かつステートメントスタイルマクロを自分のプログラム内で定義している場合、マクロプロセッサは、各SASコマンドの先頭ワードをスキャンすることで、それがステートメントスタイルのマクロ呼び出しであるかどうかを判定します。NOIMPLMACオプションが有効である場合、マクロプロセッサは、%記号に続くワードのみを潜在的なマクロ呼び出しとして扱います。IMPLMACオプションが有効でない場合でも、STMTオプション付きで定義されたマクロに関しては、ネームスタイル呼び出しを使用できます。

SOURCE

SRC

コンパイル済みマクロのソースとコンパイル済みマクロのコードをSASカタログ内の1つのエントリとして結合し、永久SASライブラリに保存します。SOURCEオプションを使用する場合、STOREオプションとMSTOREDオプションを設定する必要があります。永久SASライブラリを指定するには、SASMSTORE=オプションを使用します。マクロの保存やコンパイル済みマクロの呼び出しを行うには、MSTOREDオプションが有効でなければなりません。(詳細については、マクロの保存および再利用を参照してください)。

注: SOURCEオプションにより保存されたソースコードは、%MACROキーワードで始まり、セミコロンが末尾に付いた%MENDステートメントで終わります。
注意:
SOURCEオプションは、ネストされたマクロ定義(別のマクロ内に含まれているマクロ定義)に関しては適用できません。

STORE

コンパイル済みマクロを、SASカタログ内の1つのエントリとして、永久SASライブラリ内に保存します。永久SASライブラリを指定するには、SASシステムオプションSASMSTORE=を使用します。マクロの保存やコンパイル済みマクロの呼び出しを行うには、SASシステムオプションMSTOREDが有効でなければなりません(詳細については、マクロの保存および再利用を参照してください)。

詳細

%MACROステートメントは、マクロ定義を開始し、マクロ名を割り当てます。同ステートメントには、マクロパラメータかオプションのリストのいずれかまたは両方を含めることができます。
プログラム内で、マクロ定義は、同マクロの呼び出しよりも前に記述する必要があります。%MACROステートメントは、SASプログラム内の任意の場所(データ行を除く)に記述できます。マクロ定義には、CARDSステートメント、DATALINESステートメント、PARMCARDSステートメント、データ行を含めることはできません。その代わりに、INFILEステートメントを使用します。
デフォルトでは、定義されたマクロは、SASカタログ内の1つのエントリとして、WORKライブラリに保存されます。定義したマクロを永久SASライブラリに保存すると、そのマクロを後で使用できるようになります。ただし、SASバージョン6以前では、マクロのコピー、リネーム、トランスポートはサポートされません。
マクロ定義はネストできますが、マクロのネストは多くの場合不要でありしかも非効率的です。あるマクロ定義をネストした場合、そのマクロを含んでいるマクロを呼び出すたびに、ネストされているマクロがコンパイルされます。多くの場合、マクロ定義をネストするのではなく、別のマクロ定義内でマクロ呼び出しをネストするだけで十分です。

例1: %MACROステートメントを位置パラメータと共に使用する

次の例では、マクロPRNTによりPROC PRINTステップを生成します。先頭位置にあるパラメータはVARであり、これはVARステートメント内に記述されるSAS変数を表します。2番目の位置にあるパラメータはSUMであり、これはSUMステートメント内に記述されるSAS変数を表します。
%macro prnt(var,sum);
   proc print data=srhigh;
      var &var;
      sum &sum;
   run;
%mend prnt;
このマクロを呼び出すと、カンマまでのすべてのテキストが、パラメータVARの値となります。カンマの後に続くテキストは、パラメータSUMの値となります。
%prnt(school district enrollmt, enrollmt)
実行時に、マクロPRNTは次のステートメントを生成します。
PROC PRINT DATA=SRHIGH;
   VAR SCHOOL DISTRICT ENROLLMT;
   SUM ENROLLMT;
RUN;

例2: %MACROステートメントをキーワードパラメータと共に使用する

マクロFINANCEでは、%MACROステートメントで2つのキーワードパラメータYVARおよびXVARを定義しており、PLOTプロシジャを使用してそれらの値をプロットしています。これらのキーワードパラメータの値としては通常EXPENSESとDIVISIONを使用するため、次の%MACROステートメントでは、YVARおよびXVARのデフォルト値としてEXPENSESとDIVISIONをそれぞれ指定しています。
%macro finance(yvar=expenses,xvar=division);
   proc plot data=yearend;
      plot &yvar*&xvar;
   run;
%mend finance;
  • デフォルト値を使用する場合、このマクロをパラメータなしで呼び出します。
    %finance()
    と入力するか
    %finance;
    マクロプロセッサは次のSASコードを生成します。
    PROC PLOT DATA=YEAREND;
       PLOT EXPENSES*DIVISION;
    RUN;
  • 新しい値を割り当てるには、パラメータに続いて等号とその値を指定します。
    %finance(xvar=year)
    YVARの値は変更されないため、デフォルト値のままになります。このマクロを実行すると、次のコードが生成されます。
    PROC PLOT DATA=YEAREND;
       PLOT EXPENSES*YEAR;
    RUN;

例3: %MACROステートメントをPARMBUFFオプションと共に使用する

マクロPRINTZでは、PARMBUFFオプションを使用することにより、同マクロを呼び出すたびに異なる数の引数を入力できるようにしています。
%macro printz/parmbuff;
   %let num=1;
   %let dsname=%scan(&syspbuff,&num);
   %do %while(&dsname ne);
      proc print data=&dsname;
      run;
      %let num=%eval(&num+1);
      %let dsname=%scan(&syspbuff,&num);
   %end;
%mend printz;
PRINTZのマクロ定義にはパラメータが含まれていないにもかかわらず、次のPRINTZマクロの呼び出しでは、4つのパラメータ値PURPLEREDBLUETEALを指定しています。
%printz(purple,red,blue,teal)
結果として、SASシステムは次のステートメントを受け取ります。
PROC PRINT DATA=PURPLE;
RUN;
PROC PRINT DATA=RED;
RUN;
PROC PRINT DATA=BLUE;
RUN;
PROC PRINT DATA=TEAL; 
RUN;

例4: %MACROステートメントをSOURCEオプションと共に使用する

SOURCEオプションは、コンパイル済みマクロのソースとコンパイル済みマクロのコードを結合して保存します。ソースをSASログに書き込むには、%COPYステートメントを使用します。保存されたソースの表示や取り出しの詳細については、%COPYステートメントを参照してください。
/* commentary */  %macro foobar(arg) /store source
      des="This macro does not do much";
%put arg = &arg;
* this is commentary!!!;
%* this is macro commentary;
%mend /* commentary; */;      /* Further commentary */
NOTE: The macro FOOBAR completed compilation without errors.
%copy foobar/source;
このプログラムを実行すると、次の結果がSASログに書き込まれます。
%macro foobar(arg) /store source des="This macro does not do much"; %put arg = &arg; * this is commentary!!!; %* this is macro commentary; %mend /* commentary; */;

例5: %MACROステートメントをSTOREオプションとSECUREオプションと共に使用する

SECUREオプションは、STOREオプションと共に使用する必要があります。次の例では、STOREオプションと暗黙のNOSECUREオプションを使用することにより、プレーンテキストで保存されたマクロを作成しています。
  options mstored sasmstore=mylib;
  libname mylib "SAS-library";
  %macro nonsecure/store; /* This macro is stored in plain text */
    data _null_;
      x=1;
      put "This data step was generated from a non-secure macro.";
    run;
  %mend nonsecure;
  %nonsecure
  filename maccat catalog 'mylib.sasmacr.nonsecure.macro';
  data _null_;
    infile maccat;
    input;
    list;
  run;
  
次の例では、STOREオプションとSECUREオプションを指定することにより、暗号化されたマクロを作成しています。
options mstored sasmstore=mylib;
libname mylib "SAS-library";
%macro secure/store secure; /* This macro is encrypted */
    data _null_;
      x=1;
      put "This data step was generated from a secure macro.";
    run;
  %mend secure;
  %secure
  filename maccat catalog 'mylib.sasmacr.secure.macro';
  data _null_;
    infile maccat;
    input;
    list;
  run;
前のページ|次のページ|ページの先頭へ