BEAGLE-HC 医薬品、医療機器の研究・開発 ポータルサイト
 現在位置 : HOME > ITの活用 プログラミング > SAS コードライブラリアン(マクロ)
くすりのこと
 治療薬の最前線
データブック
 ヘルスケア市場
 データブック
 (売上ランキング)
ニュース
 企業ニュース
 (パイプラインニュース)
 (財務・決算ニュース)
 (M&Aニュース)
 メディアニュース
ITの活用
 バリデーション
 セキュリティ
 WORD文書の作成
 プログラミング
 (Word/VBA)
 (Excel/VBA)
 (Access/VBA)
 (SAS)
 (SQL)
イベント
 イベントカレンダ
製薬会社研究
 製薬会社
 製薬会社研究
 決算短信一覧
 
 
Page Index
(マクロ)
●マクロの記述ルール
●マクロの呼び出し
●%LETステートメント
●%PUTステートメント
●%SYMPUTステートメント
●再帰呼び出し(Recursive Call)
●ストアドマクロの使用法
(ユーザー定義関数)
●ユーザー定義関数
(サンプル集)
●年齢計算
●オブザベーション数を取り出す
 
(マクロ)
汎用的に使いたいプログラムをSAS マクロとして定義しておくことにより、部品として再利用しやすくなります。
同じような処理を繰り返す場合にマクロ命令が非常に効果的です。
 
参考にしたサイト:SAS Macro Language: Reference
マクロの記述ルール ↑ このページの最初へ
マクロの定義】
%MACRO macro-name(para1,pana2・・・);

 macro definition

%MEND macro-name;


マクロ変数の定義】
  %LOCAL 変数名n;      /* マクロ変数のローカル宣言:マクロ定義の外では参照不可能 */

  %GLOBAL 変数名n;     /* マクロ変数のグローバル宣言:マクロ定義の外でも参照可能 */

  CALL SYMPUT('変数名', 設定値);   /* DATAステップ変数の値をマクロ変数として作成し格納 */
                          /* マクロ定義の外でも参照可能 */
マクロ変数は,保持する値は文字列だけです。

マクロ変数の参照】
マクロ内外で変数を使う場合は、頭に「&」をつけます。
文字列の中でマクロ変数を参照する場合は,文字列はシングル(')でなく、ダブル(")を使います。
 
マクロの呼び出し ↑ このページの最初へ
マクロの実行は、「%」で始まるマクロ命令文を記述します。

  %マクロ名(引数、・・);
 
%LETステートメント ↑ このページの最初へ
%LETステートメントは、マクロ変数を定義します。
マクロ内で定義すればローカル変数になります。
例のように一部の文字列を可変(置き換え)にすることもできます。

文法
 %LET (変数名)=(任意のテキスト);

使用例
 %MACRO macro-name;
   SET sas-data;
   WHERE class="&myvar";
 %MEND macro-name;

 %LET myvar=abc;
 %macro-name;         /*マクロの呼び出し*/

  SASデータセット「sas-data」の中の変数classの値がabcのオブザベーションだけを選択します。
 
%PUTステートメント ↑ このページの最初へ
ユーザが設定したマクロ変数の値やグ ローバルマクロ変数、ローカルマクロ変数などの値を全てログウィ ンドウに出力します。

 data _null_;
  set sasuser.class;
  retain max 0;
  if max<weight then do;
   call symput('NUM',trim(put(height,best.)));
  end;
 run;
 %put &NUM;
 
再帰呼び出し(Recursive Call) ↑ このページの最初へ
多くの言語ではSubやFunctionの中から、さらに自分自身を呼び出すような処理ができます。再帰呼び出しを利用することで、複雑な処理を非常に単純なコードとして実現できる場合があります。SASでは、CALL EXECUTEによってマクロの再帰呼び出しを実現することができます。下の例では、「PUT &cc」を5回実行します。

%MACRO countdown(cc);
    If &cc > 0 Then
    Do;
      PUT &cc;
      CALL Excecute('%countdon(&cc-1);');
    END;
%MEND countdown;

%countdon(5);


Magazines :SAS Technical News spring 2001 の「Q&A」にも記載がありますので参照してください
 
ストアドマクロの使用法 ↑ このページの最初へ
マクロを定義したソースコードをマクロ自動呼出しライブラリ(MACAUTOS)に保存しておくと、SAS起動時から呼出し可能な状態にすることができます。(この場合は呼出し時に、一度だけマクロ定義のコンパイル処理が行われます。)

また、マクロ定義時に、オプション指定(%MACROステートメントの
STOREオプション)を行っておくと、コンパイル済みのマクロ定義をユーザライブラリに保存しておくこともできます。(ただし、保存先はシステムオプション(SASMSTORED=)で事前に指定しておく必要があります。)

使用例
/*コンパイル済みマクロ「sample」を「C:\temp」ディレクトリに保存する*/
LIBNAME mylib 'C:\temp';
OPTIONS MSTORED SASMSTORE=mylib;

%MACRO sample /STORE;
  PROC PRINT DATA=sashelp.class;
  RUN;
%MEND sample;

/*保存したコンパイル済みマクロ「sample」を呼び出す*/
LIBNAME mylib 'C:\temp';
OPTIONS MSTORED SASMSTORE=mylib;
%sample

SAS Technical SAPPORTに詳細な記載がありますので参照してください
 
(ユーザー定義関数)
SAS version 9.2からユーザー独自の関数を作成できるプロシジャ FCMPプロシジャが新しく加わりました。
ユーザー定義関数 ↑ このページの最初へ
LIBNAME funclib "絶対パス";        /* 関数を収容するライブラリ*/
PROC FCMP OUTLIB=funclib.funcs.sample;
  FUNCTION nendo(date) $;        
/* 関数名 */
    _month=MONTH(date);
    _year=YEAR(date);
    IF _month IN(1,2,3) THEN _year+(-1);
      nendo=PUT(_year,4.)||"年度";
    RETURN(nendo);
  ENDSUB;
RUN;

(あとはDATAステップ内で従来のSAS関数と同様に使用するだけです。)
OPTIONS CMPLIB = funclib.funcs;    /*関数が収容されたデータセット名を指定*/
DATA _null_;
  nendo=nendo(date);
RUN;

SAS社FAQサイト Technical Support Frequently Asked Questions に詳細な記載があります
 
(サンプル集)
年齢計算 ↑ このページの最初へ
(マクロ)
%MACRO age_keisan(birthdt,crntdt) ;
  %GLOBAL year;               /*グローバルマクロ変数の定義*/
  year=INTCK('YEAR', birthdt, crntdt);
%MEND agekeisan;

%age_keisan(birthdt,crntdt)

(ユーザー定義関数)

LIBNAME funclib "絶対パス";        /* 関数を収容するライブラリ*/
PROC FCMP OUTLIB=funclib.funcs.sample;
  FUNCTION age_keisan(birthdt,crntdt) ;        
/* 関数名 */
    age_keisan=INTCK('YEAR', birthdt, crntdt);
    RETURN(age_keisan);
  ENDSUB;
RUN;

OPTIONS CMPLIB = funclib.funcs;    /*関数が収容されたデータセット名を指定*/
DATA _null_;
  age=age_keisan(birthdt,crntdt);
RUN;
 
オブザベーション数を取り出す ↑ このページの最初へ
(マクロ)
%MACRO obss(dataset);
  %GLOBAL obss;                       
/*グローバルマクロ変数の定義*/
  DATA _null_;                          
/*オブザベーション数を取り出す*/
    obss=%sysfunc(attrn(%sysfunc(open(&dataset,i)),NOBS));
    CALL symput("NOBS",left(put(obss,12.)));    
/*マクロ変数 nobs に結果を格納*/
  RUN;
%MEND obss;

%obss(dataset);

↑ このページの最初へ

   ご意見・ご感想をお寄せください。 ‖ お問い合わせはこちらから ‖ このサイトについて           サイトマップ  ‖
  Copyright 2006 - 2013 uTRAM Corp. All Rights Reserved
 
PHARCIS(ヘルスケア最新情報提供)
Facebook for PHARCIS
ClinMark8
アクセスランキング
(2013年5月)

1位 企業ニュース
2位 売上ランキング
3位 メディアニュース
4位 製薬会社
5位 治療薬の最前線
6位 決算短信一覧
7位 データブック
8位 製薬会社研究
9位 イベントカレンダ
10位 パイプラインニュース