SAS にはマクロという強力なプログラミング機能があり、コードの繰り返しの部分を避け、必要に応じて何度も使用できるようになっています。 また、コード内に動的変数を作成し、同じコードの異なる実行インスタンスに異なる値を取ることができます。 マクロは、マクロ変数と同様に複数回再利用されるコードブロックに対して宣言することもできます。
マクロ変数
これらは、SASプログラムによって何度も使用される値を保持する変数である。 これらは、SASプログラムの冒頭で宣言され、プログラムの本文の後半で呼び出されます。
グローバルマクロ変数
これらは、SAS環境で利用可能な任意のSASプログラムからアクセスできるので、グローバルマクロ変数と呼ばれます。 一般的には、複数のプログラムによってアクセスされるシステム割り当て変数です。
例
以下は、システム日付を表すSYSDATEというSAS変数の例です。 レポートが生成される毎日、SASレポートのタイトルにシステムの日付を印刷するシナリオを考えてみましょう。 タイトルには、現在の日付と曜日が表示され、それらに値を設定する必要はありません。
proc print data = sashelp.cars;where make = 'Audi' and type = 'Sports' ; TITLE "Sales as of &SYSDAY &SYSDATE";run;
上記のコードを実行すると、次の出力が得られます。
Local Macro variable
これらの変数は、プログラムの一部として宣言されているSASプログラムからアクセスすることが可能です。
構文
ローカル変数は、以下の構文で宣言されています。
例
変数は、変数名の最初に追加された&文字を使用して、SASステートメントで使用されます。 下のプログラムは、メーカー「Audi」、タイプ「Sports」のすべての観測値を取得します。 我々は別のメーカーの結果が必要な場合には、我々はプログラムの他の部分を変更することなく、変数make_nameの値を変更する必要があります。
%LET make_name = 'Audi';%LET type_name = 'Sports';proc print data = sashelp.cars;where make = &make_name and type = &type_name ; TITLE "Sales as of &SYSDAY &SYSDATE";run;
上記のコードを実行すると、我々は前のプログラムと同じ出力を得ることができます。 しかし、型名を’Wagon’に変えて同じプログラムを実行してみましょう。
Macro Programs
マクロは、ある名前で参照されるSAS文のグループで、その名前を使って、プログラムのどこでも使用できるようにするためのものです。
構文
ローカル変数は次の構文で宣言されます。
# Creating a Macro program.%MACRO <macro name>(Param1, Param2,….Paramn);Macro Statements;%MEND;# Calling a Macro program.%MacroName (Value1, Value2,…..Valuen);
例
次のプログラムは、「show_result」という名前のマクロ下でSATステートメントのグループをデカルプトします。
%MACRO show_result(make_ , type_);proc print data = sashelp.cars;where make = "&make_" and type = "&type_" ;TITLE "Sales as of &SYSDAY &SYSDATE";run;%MEND;%show_result(BMW,SUV);
上記のコードを実行すると、次の出力が得られます。
Commonly Used Macros
SASには、SASプログラミング言語に組み込まれた多くのMACRO文があります。 一般的な例としては、ある条件が満たされたときにプログラムを終了させたり、プログラムログに変数の実行時の値を取り込んだりすることが挙げられます。 以下は、いくつかの例です。
Macro %PUT
このマクロ文は、テキストまたはマクロ変数情報をSASログに書き込みます。
data _null_;CALL SYMPUT ('today',TRIM(PUT("&sysdate"d,worddate22.)));run;%put &today;
上記のコードを実行すると、以下の出力が得られます。
Macro %RETURN
このマクロの実行は、特定の条件が真であると評価されると現在実行中のマクロを正常に終了させます。
%macro check_condition(val); %if &val = 10 %then %return; data p; x = 34.2; run; %mend check_condition; %check_condition(11) ;
上記のコードを実行すると、次の出力が得られます。
Macro %END
このマクロ定義は、%DO %WHILE ループを含み、必要に応じて、%END ステートメントで終了します。 以下の例では、test という名前のマクロがユーザー入力を受け取り、この入力値を使用して DO ループを実行します。DO ループの終了は %end ステートメントによって達成され、マクロの終了は %mend ステートメントによって達成されます。