質問
私のコードに複数のマクロです。マクロをメインをクリックします。マクロ、そして通話をマクロ-Bを求のマクロC
SASないとして定義し後退することにあります。別の言い方をすれば、いを定義するマクロ-Cまず、そのマクロ-B,そしてマクロですか?または問題にならSASを読み込みすべてのコード前で実際にヒットのコマンドでマクロを実行?うにしたいので問題は、コマンド実行、マクロとしての最初の文私のコードを定義のマクロは以下のコマンド?
よろしく!
解決
が呼び出される前に、まず、あなたがマクロを定義する必要があります。
マクロは限り、あなたは前に手にそれをロードしているとして呼び出される。ここで、第二に、それは問題ではありません。
あなたの問題については詳しく説明するには、次のautocallライブラリはあなたの友達です。もしSAS管理者は、あなたがautocallライブラリにあなたのマクロを置くことを許可しない場合、あなたはそのようautocallを追加することができます:
filename mymacros 'c:\mysas';
/*this defines the directory you have stored your macros*/
options sasautos=(sasautos mymacros) mautosource;
他のヒント
マクロは、それが呼び出される前に定義する必要があります。パフォーマンス上の理由から、それは別の内部のマクロを定義することが最善ではありません - あなたがそうするならば、それはあなたが外側のマクロを呼び出すたびに再定義されます。以下では正常に動作します:
%macro a;
%put a;
%b
%mend a;
%macro b;
%put b;
%c
%mend b;
%macro c;
%put c;
%mend c;
%*-- %a is main --*;
%a
/* on log
a
b
c
*/
、それが呼び出される前に、マクロを定義しなければならないので、彼らは彼らの前に定義された通りの「%A」を持つ行がある限り、他のマクロ定義の順序は重要ではありませんマクロA.の定義に従う必要があります呼ばれています。通常、あなたが記述のように、私はメインのマクロを設定し、私のプログラムでは、プログラムの最後の行は、このマクロを呼び出します。
考慮すべきもう一つのオプションは、多くのマクロの定義を含むマクロautocallライブラリを、設定することです。あなたは、各プログラムでそれらを再定義する必要がないようにこれは、再利用可能なマクロに適しています。
ある二つの側面のマクロコードにSASを定義:マクロコードを取得する集計のマクロパラメータ:
マクロコード:
マクロコード自体は非常に単純であることが %macro
トークンが検出されたのSASのシステムのためのSASマクロおよび保の作成までのキャリアチェンジ %mend
トークンである。の問題で戦う場合がご利用いただけませんのマクロコードな再コンパイルする前に実行する–このような状況のままだに古いバージョンでは、マクロ図書館があります。による拡張しようとした場合にコンパイルマクロその他のマクロなされてい定義を取得しますエラーとなります。これらのことから、必要なプログラムしなければならないという(下の例:%level3が%level2、前%level1)
マクロ変数 定義のマクロ 変数 あるスコープ:世界ています。一度定義したグローバル変数にアクセスできるのです。しかし、ローカルな変数のみが存在し現地での実行中にマクロが定義されています。により延長の場合、マクロのローカル変数が定義され話その他のマクロ、マクロ変数にはアクセス:
作業例
以下の例では、マクロは 定義された順 防SASに戻る 見かけのメソッドの呼び出しマクロ 警告が表示されます。
以下の図の構造を、以下のマクロは以下の例:
|-----------------------------|
|GLOBAL |
| |------------------------| |
| |LEVEL1 | |
| | |-------------------| | |
| | |LEVEL2 | | |
| | | |--------------| | | |
| | | | LEVEL3 | | | |
| | | |--------------| | | |
| | |-------------------| | |
| |------------------------| |
|-----------------------------|
コンパイルにネストしたマクロ:
%macro level3 ;
%put **** START LEVEL3 **** ;
%local G1;
%let G1=Local ;
%do i=1 %to 2 ;
%put In the macro do loop I=&i ;
%end ;
%put The value of I at level3 is: &I ;
%put Are we accessing global or local G1 variable here: &G1 ;
%put **** END LEVEL3 ****;
%mend level3 ;
%macro level2 ;
%put **** START LEVEL2 **** ;
%*global L1 ; *<-- this would produce an error because the variable name has already been added to the local scope in %level1 ;
%put Are we accessing global or local G1 variable here: &G1 ;
%put Can we access local variables here: &L1 ;
%level3 ;
%put The value of I in level2 is: &I ;
%put **** END LEVEL2 ****;
%mend level2 ;
コンパイルのトップレベルのマクロを求上記の二つのマクロ)を実行す:
%let G1=Global;
%macro level1 ;
%put **** START LEVEL1 **** ;
%let L1=Yes;
%put Are we accessing global or local G1 variable here: &G1 ;
%put Can we access local variables here: &L1 ;
%level2 ;
%put The value of I outside of the local macro is: &I ;
%put Are we accessing global or local G1 variable here: &G1 ;
%put **** END LEVEL1 ****;
%mend level1 ;
%level1 ;
の際の注意点を見直し、ログ:
- 外%level3,&Iを返しますことを警告するマクロ変数は 存在しない
- 以%level3き&G1"と呼ばれるもので値を返します保存され 地元の範囲%level3.一%level3の値を返します に格納された値の世界