【SAS/プログラミング】マクロ処理(其の弐)~文を短くするべく、有効的に活用すべし!

前回のマクロ処理では、基本構文を記載しました。
今回は、更にマクロの有効な使い方を説明したいと思います。

マクロ構文については、登録することでいつでも使用可能になります。
マクロが呼び出された時にマクロ構文が実行されます。

・マクロ処理の流れ

具体的な例をプログラムにします。

/* --- プログラム例(Macro_pr.sas) --- */

/* 1.マクロ設定 */
%macro test;
 Data test_b;
   Set test_a;
   B=A+1;
 Run;
%mend test;

/* 2.データセット(test_a)の作成 */
Data test_a;
 A=1;
Run;

/* 3.マクロ実行 */
%test; 

/* 4.データセット(test_a)の作成 */
Data test_a;
 A=5;
Run;

/* 5.マクロ実行 */
%test;

上記プログラムの流れを説明します。
1. マクロ設定
testマクロを作成しました。これでtestマクロが使用可能になります。
ただし、マクロ構文を実行する際、事前に数値型変数Aに値が入っているデータセット(test_a)が必要となります。

2. データセット(test_a)の作成
test_aデータセットを作成しました。
test_aデータセットは変数Aを持っていて値は1です。

3. マクロ実行
%マクロ名;にてマクロの構文が実行されます。
よって%test;でtestマクロの実行となります。
ですので、この時点でtest_bデータセットが作成されました。
test_bデータセットは変数Aと変数Bを持っていて、
値はA=1,B=2となります。

4. データセット(test_a)の作成
続いて、またtest_aデータセットが作成されます。
この場合、すでにtest_aデータセットが存在していますので、
上書きされます
よってTest_aデータセットは変数Aを持っていて値は5です。

5. マクロ実行
また%test;がきましたので、testマクロの構文が実行されます。
ですので、test_bデータセットを作成します。
すでにtest_bデータセットが存在しますが、やはり上書きされるのでtest_bデータセットは変数Aと変数Bを持っていて、それぞれの値はA=5,B=6となります。

結果的に、実行結果としましては、Test_aとtest_bのデータセットができ、
Test_aデータセットは、変数Aを持っていて値はA=5。
Test_bデータセットは、変数A,変数Bを持っていて値はA=5,B=6。
となります。
あくまでプログラム例ですが、前半何の意味もない!笑

なので使い方を発展させます!!もっとマクロを有効に使うために!
使っていただくために!


・SASマクロに、値を渡し実行する

SASマクロの記述なのですが、マクロ構文に値を渡す方法があります。

<program code1>
Data test_a;
 A=5;
Run;
%macro test2(ds,var);
Data &ds.;
 Set test_a;
 &var. = A+1 ;
Run;
%mend test2;

%macro test2(ds,var);と記述することで、
SASマクロの中でds,varのマクロ変数を使用することができます。
マクロ変数を呼び出すには、前に「&」、後ろに「.」をつけて変数を呼び出します。細かい話をしますと上記の場合、後ろのピリオドはなくてもプログラムは動きます。が!ないと動かないパターンもありますので、付けておくのがベストです。このピリオドの意味は、マクロ変数を区切る意味があります。

具体的な例をプログラムにします。


/* --- プログラム例(Macro_pr2.sas) --- */

/* データセット(test_a)の作成 */
Data test_a;
 A=5;
Run;

/* マクロ設定 */
%macro test2(ds,var);
Data &ds.;
 Set test_a;
 &var. = a+1 ;
Run;
%mend test2;

/* マクロ実行 */
%test2(test_c,d);

上記のプログラム例を説明します。
test2マクロに、「ds」、「var」というマクロ変数を定義しました。
よって2つのマクロ変数「ds」、「var」がtest2マクロ内で使用可能となります。
そしてtest2マクロ実行時に、“test_c“と”d”の値を入れておりますので、
マクロ変数「ds」には”test_c”という値が、マクロ変数「var」には”d”という値がそれぞれ入ります。

マクロ変数の値を当てはめた形で記述したマクロ文は、
以下のとおりになります。下記の形で実行されます。

/* マクロ変数に値をあてはめた場合のプログラム文 */
Data test_c;
 Set test_a;
 d = a + 1 ;
Run;

test_cデータセットが作成され、変数はa=5、d=5+1=6が格納されます。

・SASマクロに、「=」を使って値を渡し実行する

マクロ構文で値を渡す方法として「=」を使用する形があります。
マクロ構文作成の際は、「=」を使用した構文の方が親切でわかりやすいかと思いますので、個人的にはこちらを使用することをお勧めします。

<program code2>

/* データセット(test_a)の作成 */
Data test_a;
 A=5;
Run;

/* マクロ設定 */
%macro test2(ds=,var=);
Data &ds.;
 Set test_a;
 &var. = A+1 ;
Run;
%mend test2;

/* マクロ実行 */
%test2(ds=test_c,var=d);

Program code2の処理内容は、program code1と同じです。

上記以外にお勧めする方法として、
わかりやすい以外のメリットが2つあります。
それは、初期値の設定が可能な点渡す値の変数順がバラバラでも構わない点です。

%macro test2(ds=test_aaa,var=);
Data &ds.;
 Set test_a;
 &var. = A+1 ;
Run;
%mend test2;

上記のように初期値を予めおくと、
% test2(var=c);と記述しても実行可能です。
マクロ変数「var」には値を入れる必要がありますが、マクロ変数「ds」は値を入れなくても初期値の「test_aaa」が入ります。
基本的に入る値が決まっている場合に便利ですね。
ちなみに% test2(ds=test_bbb,var=c);と記述すると、マクロ変数「ds」には初期値から上書きされ「test_bbb」の値が入ります。
順序を問わない点は、例えば% test2(var=c,ds=test_ccc);と逆に書いても問題ありません。

・さいごに

前回の冒頭でも書きましたが、マクロを使いこなせると、
同じ処理をまとめることができ、そのことによりプログラムコードの削減、
記述ミス、修正した際の直し忘れを防ぐことができます。
マクロの処理流れ、使い方を記述させていただきました。なんとなくでも伝われば幸いです。

ちなみにマクロ構文の最後に「%mend」とありますが、その後にマクロ構文名を書いております。こちらは別に書かなくても実行可能なのですが、「%mend test2」のように書いてあげることで、これがtest2のマクロ構文なのかと相手に伝わりやすくなりますので、マクロ構文が長くなった場合、特に親切で理解しやすくなるかと思います。
プログラムの記述は小さな心がけが重要となっていると思いますので、見やすいプログラム記述にしていきましょう!!

この記事が気に入ったらサポートをしてみませんか?