前のページ|次のページ

マクロを使用したSASコードの生成

マクロの定義

プログラムでマクロを使用すると、テキストの置換に加えて、他の多くのことを実行できます。SASプログラムに任意の個数のマクロを含めて、1つのプログラム内で特定のマクロを何度も呼び出すことができます。
独自マクロの定義方法を学習するために、このセクションには、後で独自マクロのモデル化に使用できる例がいくつか含まれています。それぞれの例は極めて単純ですが、さまざまな方法を組み合わせることによって、複雑なタスクを実行できる高度で柔軟なマクロを作成できます。
定義するマクロには、固有の名前を付けます。マクロの名前を選択する場合、SAS言語のキーワードやコールルーチン名と同じ名前を避けることをお勧めします。選択する名前は、標準SAS命名規則に従います。(SASの命名規則の詳細については、SAS言語リファレンス: 解説編を参照してください。)マクロ名にダブルバイト文字セット(DBCS)文字は含められません。マクロ定義は、次の例のように、%MACROステートメントと%MEND (マクロの終了)ステートメントの間に配置します。
%MACRO macro-name;
%MEND macro-name;
%MENDステートメントに指定するmacro-nameは、%MACROステートメントに指定したmacro-nameと一致している必要があります。
注: %MENDステートメントでのmacro-nameの指定は必須ではありませんが、推奨されます。そうすることで、デバッグ中に%MACROステートメントと%MENDステートメントを対応付けることが容易になります。
単純なマクロ定義の例を次に示します。
%macro dsn;
   Newdata
%mend dsn;
このマクロの名前はDSNです。 Newdataは、マクロのテキストです。マクロの内側の文字列は、定数テキストまたはモデルテキストと呼ばれます。これは、この文字列が、SASプログラムの一部になるテキストとして使用される、モデルまたはパターンであるためです。
マクロを呼び出す(または起動する)には、次のようにマクロ名の先頭にパーセント記号(%)を付けます。
%macro-name
マクロの呼び出しはSASステートメントに似ていますが、末尾にセミコロンを付ける必要はありません。
例として、DSNマクロの呼び出し方法を次に示します。
title "Display of Data Set %dsn";
マクロプロセッサはDSNマクロを実行し、マクロの定数テキストをTITLEステートメントに代入します。
title "Display of Data Set Newdata";
注: タイトルは、二重引用符で囲みます。オープンコード内の引用符で囲まれた文字列の内、マクロプロセッサは二重引用符で囲まれたマクロの呼び出しを置換しますが、一重引用符で囲まれたマクロの呼び出しを置換しません。
DSNマクロは、次のようにコーディングした場合と全く同じです。
%let dsn=Newdata;

title "Display of Data Set &dsn";
この結果のコードを次に示します。
title "Display of Data Set Newdata";
つまりこの場合は、マクロを使用しても、マクロ変数を使用する場合と比べてメリットはありません。ただし、DSNは極めて単純なマクロです。この後の例で示すように、マクロは、DSNマクロよりも非常に多くのことを実行できます。

マクロにコメントを挿入する

すべてのコードはコメント機能を完全に利用できます。マクロコードも例外ではありません。マクロコードへのコメントの追加に使用できる2種類の形式が用意されています。
1つ目の形式はSASコードのコメントと同じく、 /*>で始まり、*/で終わります。2つ目の形式は、%*で始まり、;で終わります。次のプログラムでは、両方の形式のコメントを使用しています。
%macro comment;
/* Here is the type of comment used in other SAS code. */
   %let myvar=abc;

%* Here is a macro-type comment.;
   %let myvar2=xyz;

%mend comment;
マクロコード内では、好きな方の形式のコメントを使用できます。前の例のように、両方を使用することもできます。
SASコードで使用されるアスタリスクスタイルのコメント(* コメント記述 ;)をマクロ定義内で使用することはお勧めしません。アスタリスクスタイルは、定数テキストを正しくコメント化して、コメントに含まれるマクロステートメントはすべて実行されます。コメントテキスト内に含まれる一致しない引用符が無視されず、それによって予測できない結果を招く恐れがあるため、この形式のコメントは推奨されません。

複数のSASステートメントを含むマクロ定義

次のように、SASプログラムの全体を含むマクロを作成できます。
%macro plot;
   proc plot;
      plot income*age;
   run;
%mend plot;
その後のプログラムでは、次のようにマクロを呼び出せます。
data temp;
   set in.permdata;
   if age>=20;
run;

%plot

proc print;
run;
これらのステートメントを実行すると、次のプログラムが生成されます。
data temp;
   set in.permdata;
   if age>=20;
run;

proc plot;
   plot income*age;
run;

proc print;
run;

マクロにパラメータを使用して情報を渡す

%MACROステートメントで、かっこ内に定義されるマクロ変数は、マクロパラメータです。マクロパラメータによって、マクロに情報を渡すことができます。次に簡単な例を示します。
%macro plot(yvar= ,xvar= );
   proc plot;
      plot &yvar*&xvar;
   run;
%mend plot;
次のように、パラメータに値を指定してマクロを呼び出します。
%plot(yvar=income,xvar=age)

%plot(yvar=income,xvar=yrs_educ)
マクロを実行すると、マクロプロセッサは、マクロ呼び出しで指定された値をマクロ定義のパラメータに対応付けます。(このタイプのパラメータは、キーワードパラメータと呼ばれます。)
マクロの実行によって、次のコードが生成されます。
proc plot;
   plot income*age;
run;

proc plot;
   plot income*yrs_educ;
run;
パラメータの使用には、いくつかのメリットがあります。まず、%LETステートメントの記述を減らせます。次に、パラメータを使用すると、マクロの外部のプログラムに変数が影響を与えずに済みます。マクロパラメータは、ローカルマクロ変数の一例です。マクロパラメータが存在するのは、それが定義されたマクロが実行されている間だけです。

SASコードの条件付き生成

%IF-%THEN-%ELSEマクロステートメントを使用することで、マクロによって条件付きでSASコードを生成できます。次の例を参照してください。
%macro whatstep(info=,mydata=);
   %if &info=print %then
      %do;
         proc print data=&mydata;
         run;
      %end;

   %else %if &info=report %then
      %do;
         options nodate nonumber ps=18 ls=70 fmtsearch=(Sasuser);
      proc report data=&mydata nowd;
         column manager dept sales;
         where sector='se';
         format manager $mgrfmt. dept $deptfmt. sales dollar11.2;
         title 'Sales for the Southeast Sector';
      run;
   %end;
%mend whatstep;
この例では、WHATSTEPマクロが、デフォルトでnull値に設定されるキーワードパラメータを使用しています。キーワードパラメータを使用するマクロを呼び出す場合、パラメータ名の後ろに等号を付け、その後にパラメータに割り当てる値を加えて指定します。ここでは、WHATSTEPマクロを、INFOにprintを設定し、MYDATAにgroceryを設定して呼び出しています。
%whatstep(info=print,mydata=grocery)
このコードによって次のステートメントが生成されます。
proc print data=grocery;
run;
マクロプロセッサでは、大文字と小文字の値は区別されます。そのため、前述の例でprintの代わりにPRINTを指定すると、プログラムは動作しません。マクロをさらに堅牢にするには、%UPCASEマクロ関数を使用します。詳細については、%UPCASE関数と%QUPCASE関数を参照してください。
詳細については、%MACROステートメント および%MENDステートメントを参照してください。
前のページ|次のページ|ページの先頭へ