前のページ|次のページ

ユーザー定義のマクロ変数

マクロ変数定義の概要

独自のマクロ変数を作成して、それらの値を変更し、スコープを定義できます。マクロ内でマクロ変数を定義できます。また、%GLOBALステートメントを使用して定義することで、明示的にグローバル変数として定義することもできます。マクロ変数名は、文字またはアンダースコアで始める必要があり、その後に文字または数字を続けることができます。マクロ変数には、予約語以外の任意の名前を割り当てることができます。AF、DMS、SQL、およびSYSという接頭語の使用は推奨されません。SASソフトウェアがマクロ変数を作成する際に、これらの接頭語を頻繁に使用するためです。そのため、これらの接頭語のうちのいずれかを使用すると、SASソフトウェアによって作成されたマクロ変数の名前との競合が発生する恐れがあります。マクロ言語の予約語の完全な一覧については、 マクロ機能の予約語 を参照してください。無効なマクロ変数名を割り当てた場合、SASログにエラーメッセージが出力されます。
%PUT _ALL_を使用して、ユーザーが作成したマクロ変数をすべて表示できます。

ユーザー定義マクロ変数名の作成

ユーザー定義のマクロ変数を作成するもっとも簡単な方法は、%LETマクロプログラムステートメントを使用することです。
%let dsname=Newdata;
DSNAMEは、マクロ変数の名前です。Newdataは、マクロ変数DSNAMEの値です。次にマクロ変数の作成ルールを示します。
  1. SASマクロ変数名は最大32文字の長さになります。
  2. 最初の文字は文字または下線で始まらなければなりません。先頭以外には、文字、下線、数字を使用できます。
  3. マクロ変数名に空白は使用できません。
  4. マクロ変数名にダブルバイト文字セット(DBCS)文字は含められません。
  5. マクロ変数名に下線以外の特殊文字は使用できません。
  6. マクロ変数名は大文字小文字が区別されません。例えば、catとCatとCATはすべて同じ変数を表します。
  7. マクロ変数には、予約語以外の任意の名前を割り当てることができます。AF、DMS、SQL、およびSYSという接頭語の使用は推奨されません。SASソフトウェアが自動マクロ変数を作成する際に、これらの接頭語を頻繁に使用するためです。そのため、これらの接頭語のうちのいずれかを使用すると、自動マクロ変数の名前との競合が発生する恐れがあります。マクロ言語の予約語の完全な一覧については、 マクロ機能の予約語 を参照してください。無効なマクロ変数名を割り当てた場合、SASログにエラーメッセージが出力されます。

マクロ変数への値の割り当て

マクロ変数に値を割り当てる最も簡単な方法は、マクロプログラムの%LETステートメントを使用することです。
%let dsname=Newdata;
DSNAMEは、マクロ変数の名前です。Newdataは、マクロ変数DSNAMEの値です。マクロ変数の値は、単なる文字列です。文字列には、任意の文字、数字、キーボード上にある印刷可能なシンボル、文字間の空白を含めることができます。大文字小文字の情報は、マクロ変数値に保存されます。一致しない引用符などの一部の文字については、特殊な扱いが必要です。これについては後述します。
マクロ変数がすでに存在する場合、それに値を割り当てると、マクロ変数の現在の値を置き換えます。マクロ変数またはその値にマクロのトリガ(%または&)が含まれる場合、そのトリガが評価されてから値が割り当てられます。次の例では、&nameCaryに置換されてから、次のステートメントでcityの値として割り当てられています。
%let name=Cary;
%let city=&name;
通常、マクロプロセッサは、アルファベット、数字、およびシンボル(&と%を除く)を文字として扱います。マクロプロセッサは、特殊な処理を使用して&や%を文字として扱うこともできます。これについては後述します。マクロプロセッサは、SASの他の部分とは異なり、文字と数値を区別しません。ただし、%SYSEVALF関数%EVAL関数 は、マクロ変数を整数または浮動小数点数として評価できます。
マクロ変数値は、マクロプロセッサが生成するテキスト、またはマクロプロセッサが使用するテキストを表すことができます。値の長さの範囲は、0から65,534文字までです。値の引数を省略した場合、値はnull (文字数0)になります。デフォルトでは、値の前後の空白は値として格納されません。
%LETステートメントに加えて、マクロ変数を作成するためのその他のマクロ言語の機能として、次のようなものが挙げられます。
  • %DOステートメントによる反復
  • %GLOBALステートメント
  • %INPUTステートメント
  • SQLのSELECTステートメントのINTO句
  • %LOCALステートメント
  • %MACROステートメント
  • SCLのSYMPUTルーチン、SYMPUTXルーチン、およびSYMPUTNルーチン
  • %WINDOWステートメント
次の表で、マクロ変数にさまざまなタイプの値を割り当てる方法について説明します。
マクロ変数値の割り当てタイプ
割り当て
定数テキスト
文字列。次のステートメントは、mapleという値をマクロ変数STREETに割り当てることのできる複数の方法を示しています。いずれの場合も、マクロプロセッサは、mapleという5文字の値をSTREETの値として格納します。値の前後の空白は格納されません。
%let street=maple;

%let street=            maple;
%let street=maple            ;
注:引用符は不要です。引用符を使用した場合、それらは値の一部に含まれます。
数字
適切な数字。次の例では、マクロ変数NUMおよびTOTALSTRTを作成しています。
%let num=123;
%let totalstr=100+200;
マクロプロセッサは、123を数値として扱わず、式100+200を評価しません。その代わり、マクロプロセッサはすべての数字を文字として扱います。
演算式
次の例のように、%EVAL関数を使用します。
%let num=%eval(100+200); / * produces 300 * /
あるいは、次の例のように%SYSEVALF関数を使用します。
%let num=%sysevalf(100+1.597); / * produces 101.597 * /
詳細については、マクロ評価関数を参照してください。
null値
例えば、引数の値には何も割り当てられません。
%let country=;
マクロ変数参照
マクロ変数参照(&macro-variable)。次に例を示します。
%let street=Maple;
%let num=123;
%let address=&num &street Avenue;
この例は、テキスト式に含まれる複数のマクロ変数参照を示しています。マクロプロセッサは、割り当てを実行する前に、テキスト式の置換を試みます。その結果、マクロプロセッサは、マクロ変数ADDRESSの値を123 Maple Avenueとして格納します。
%NRSTR関数を使用して文字をマスクすることで、アンパサンドとパーセント記号をリテラルとして扱うことができます。これによって、マクロプロセッサは、アンパサンドとパーセント記号をマクロ呼び出しとして解釈せず、テキストとして扱うことができます。詳細については、マクロ言語要素マクロクォーティングを参照してください。
マクロ呼び出し
マクロ呼び出し(%macro-name)。次に例を示します。
%let status=%wait;
この%LETステートメントを実行すると、マクロプロセッサによってWAITマクロも呼び出されます。 マクロプロセッサは、WAITマクロによって生成されたテキストを、STATUSの値として格納します。
%LETステートメントを実行したときにマクロが呼び出されないようにするには、次のように%NRSTR関数を使用してパーセント記号をマスクします。
%let status=%nrstr(%wait);
マクロプロセッサは、%waitをSTATUSの値として格納します。
空白と特殊文字
値を囲むマクロクォーティング関数、%STRまたは%NRSTR。マクロプロセッサが空白や特殊文字をテキストとして解釈できるようにするために、このアクションによってそれらの文字をマスクします。詳細についてはマクロクォーティング関数 を参照してください。 例えば、
%let state=%str( North Carolina);
%let town=%str(Taylor%'s Pond);
%let store=%nrstr(Smith&Jones);
%let plotit=%str(
       proc plot;
         plot income*age;
       run;);
マクロ変数TOWNを定義している部分では、%STRを使用して不一致の引用符を含む値をマスクしています。マクロクォーティング関数で、不一致の引用符などのシンボルにマークを付ける必要のあるマクロクォーティング関数について説明しています。
マクロ変数PLOTITを定義している部分では、%STRを使用して、マクロ変数値内の空白と特殊文字(セミコロン)をマスクしています。 マクロ変数に完全なSASステートメントを含める場合、行を分けて、DATAステップ内やPROCステップ内でインデントしてステートメントを入力すると、読みやすくなります。マクロクォーティング関数を使用すると、マクロ変数値内の意味のある空白が維持されます。
DATAステップの値
SYMPUTルーチン。次の例では、データセット内のAGEが20を超えるオブザベーションの数を、FOOTNOTEステートメントに挿入しています。
data _null_;
   set in.permdata end=final;
   if age>20 then n+1;
   if final then call symput('number',trim(left(n)));
run;
footnote "&number Observations have AGE>20";
DATAステップの最後の反復を実行するときに、SYMPUTルーチンによって、Nの値が格納されたNUMBERという名前のマクロ変数が作成されます。その際、SASは、数値から文字への変換を示すメッセージを発行します。DATAステップ変数Nの値をマクロ変数NUMBERに割り当てる前に、TRIM関数とLEFT関数によって、変数Nの値から余分なスペースを削除します。
数値から文字への変換を示すメッセージを抑制することを含む、SYMPUTの説明については、CALL SYMPUTルーチン を参照してください。
前のページ|次のページ|ページの先頭へ