前のページ|次のページ

マクロ変数の使用

マクロ変数参照

マクロ変数を作成したら、通常は、マクロ変数名の前にアンパサンドを付けて(&variable-name)参照します。この参照を、マクロ変数参照と呼びます。これらの参照を値に置換するときに、シンボリック置換が実行されます。これらの参照は、SASプログラム内の任意の場所で使用できます。文字列に現れるマクロ変数参照を置換するには、その文字列を二重引用符で囲みます。一重引用符で囲まれたマクロ変数参照は、置換されません。値をマクロ変数DSNに割り当て、それをTITLEステートメントで使用する、次の各ステートメントを比較してください。
%let dsn=Newdata;
title1 "Contents of Data Set &dsn";
title2 'Contents of Data Set &dsn';
1番目のTITLEステートメントでは、マクロプロセッサは、&DSNをマクロ変数DSNの値に置き換えて参照を置換しています。2番目のTITLEステートメントでは、&DNSはDSNの値に置き換えられません。SASは、各ステートメントを次のように解釈します。
TITLE1 "Contents of Data Set Newdata";
TITLE2 'Contents of Data Set &dsn';
マクロ変数は、SASプログラム内で必要なだけ何度でも参照できます。値は、変更しない限り変わりません。たとえば、次のプログラムではマクロ変数DSNを2回参照しています。
%let dsn=Newdata;
data temp;
   set &dsn;
   if age>=20;
run;

proc print;
   title "Subset of Data Set &dsn";
run;
マクロプロセッサは、&DSNの参照が現れるたびに、それをNewdataに置き換えます。SASは、各ステートメントを次のように解釈します。
DATA TEMP;
      SET NEWDATA;
      IF AGE>=20;
   RUN;

   PROC PRINT;
      TITLE "Subset of Data Set NewData";
   RUN;
注: 存在しないマクロ変数を参照した場合、SASログに警告メッセージが出力されます。たとえば、次のように、マクロ変数JERRYのスペルを誤ってJERYと記述した場合、予期しない結果が生じます。
%let jerry=student;
data temp;
  x="produced by &jery";
run;
このコードによって、次のメッセージが生成されます。
WARNING:  Apparent symbolic reference JERY not resolved.

マクロ変数参照とテキストを結合する

テキストの先頭または末尾にマクロ変数参照を加えたり(たとえば、DATA=PERSNL&YR.EMPLOYES。ここで、&YRには2文字の年が格納される)、隣接する変数(たとえば、&MONTH&YR)を参照したりすることは、多くの場合役立ちます。同じテキストを複数の場所で再利用できます。つまり、使用するごとに値を変更できるため、プログラムを再利用できます。
同じテキストを複数の場所で再利用するには、共通の要素を表すマクロ変数参照を使用してプログラムを記述します。次に示すように、1つの%LETステートメントを使用して、すべての場所の値を変更できます。
%let name=sales;
   data new&name;
      set save.&name;
      more SAS statements
      if units>100;
   run;
マクロ変数が置換されると、SASは各ステートメントを次のように解釈します。
DATA NEWSALES;
      SET SAVE.SALES;
      more SAS statements
      IF UNITS>100;
   RUN;
なお、マクロ変数参照では、DATAステップで必要な連結演算子は不要です。SASによって、自動的にワードが作成されます。

テキスト内のマクロ変数名を区切る

マクロ変数参照を接頭語として使用したときに、それを単純に連結した場合、参照が期待通りに置換されないことがあります。そうする代わりに、参照の末尾にピリオドを加えて区切ることが必要な場合があります。
マクロ変数参照の直後のピリオドは、区切り文字の役割を果たします。つまり、参照の末尾のピリオドは、マクロプロセッサに参照の末尾を強制的に認識させます。このピリオドは、生成されるテキストには現れません。
引き続き前述の例において、Sales1、Sales2、およびINSALES.TEMPという名前を使用する別のDATAステップが必要になったとします。次のステップをプログラムに追加できます。
/*  first attempt to add suffixes--incorrect  */
data &name1 &name2;
   set in&name.temp;
run;
マクロ変数が置換されると、SASは各ステートメントを次のように解釈します。
DATA &NAME1 &NAME2;
   SET INSALESTEMP;
RUN;
マクロ変数参照は、意図したとおりに置換されていません。マクロプロセッサは警告メッセージを発行し、SASは構文エラーメッセージを発行します。理由は次のとおりです。
NAME1とNAME2が有効なSAS名であるため、マクロプロセッサは、NAMEではなくそれらの名前を持つマクロ変数を検索します。その結果、参照が置換されずにDATAステートメントに渡されます。
マクロ変数参照では、ワードスキャナは、SAS名として使用されない文字を検出したときにマクロ変数名の終端を認識します。ただし、ピリオド( .)を、マクロ変数参照の区切り文字として使用できます。たとえばこの例では、NAMEというワードの終端をマクロプロセッサに認識させるには、次のように、ピリオドを区切り文字として&NAMEと接尾語の間で使用します。
/*  correct version  */
data &name.1 &name.2;
これで、SASはこのステートメントを次のように解釈します。
DATA SALES1 SALES2;

置換済みテキストの後ろにピリオドを挿入する

の後ろ マクロプロセッサによって置換されたテキストの後ろに、ピリオドを挿入する必要がある場合があります。たとえば、2レベルのデータセット名では、ライブラリ参照名とデータセット名の間にピリオドを含める必要があります。
マクロ変数参照名の後ろにピリオドを付ける場合、2つのピリオドを使用します。1番目のピリオドがマクロ変数参照の区切り文字になり、2番目のピリオドがテキストの一部になります。
set in&name..temp;
マクロ変数が置換されると、SASはこのステートメントを次のように解釈します。
SET INSALES.TEMP;
区切り文字を使用して任意のマクロ変数参照を区切ることができますが、区切り文字が必要になるのは、その後ろの文字がSAS名の一部になる場合のみです。たとえば、次の2つはいずれも正しいTITLEステートメントです。
title "&name.--a report";
   title "&name--a report";
これらによって、次が生成されます。
TITLE "sales--a report";
前のページ|次のページ|ページの先頭へ