問題
|
原因
|
説明
|
---|---|---|
マクロ定義のサブミット後、SASウィンドウ環境のセッションが応答しなくなる。コードを入力してサブミットしても、何も起こらない。
|
|
%MENDステートメントが認識されないため、すべてのテキストがマクロ定義の一部になっています。
|
マクロの呼び出し後、SASウィンドウ環境のセッションが応答しなくなる。
|
呼び出しに関するエラー。パラメータ付きで定義されたマクロを呼び出す場合の、1つ以上のパラメータの指定もれ、かっこの不足など。
|
マクロ機能は、ユーザーが呼び出しを終了するまで待機します。
|
マクロをサブミットしてもコンパイルされない。
|
マクロ定義内のどこかに構文エラーがある。
|
コンパイルされるのは、構文的に正しいマクロのみです。
|
マクロを呼び出しても実行されないか、一部実行されてから停止する。
|
|
マクロは、受け取るパラメータの数が正しく、パラメータのタイプが正しい場合にのみ、正常に実行されます。
|
マクロは実行されるが、SASコードが不正な結果を返すか、結果を何も返さない。
|
マクロまたはSASコードのロジックが不正。
|
|
コードが、オープンコードとしてサブミットされると正しく動作するが、マクロによって生成されると動作せず、不明なエラーメッセージを発行する。
|
|
まれに、マクロクォーティング関数が、渡されたテキストのトークン化を変更する場合があります。%UNQUOTE関数を使用してください。
|
%MACROステートメントが、"無効なステートメント"エラーを生成する。
|
|
マクロ機能が動作するには、MACROシステムオプションが有効である必要があります。SAS構成ファイルを適宜編集してください。
|
エラーメッセージ
|
考えられる原因
|
詳細情報
|
---|---|---|
Apparent invocation of macro xxx not resolved. |
|
|
Apparent symbolic reference xxx not resolved. |
|
|
&
が前に付いたトークン名を調べるときに、それに一致するマクロ変数のエントリをマクロシンボルテーブル内で検索します。マクロプロセッサは、一致するエントリを見つけると、シンボルテーブルから関連付けられたテキストを取り出して、入力スタックにある&name
をそのテキストに置き換えます。マクロ変数名がマクロプロセッサに渡されて、一致するエントリがシンボルテーブル内で検出されなかった場合、入力スタックのトークンは置換されず、次のメッセージが生成されます。
WARNING: Apparent symbolic reference
NAME not resolved.
%let wk=week; title "This is data for &wk1"; /* INCORRECT */
%let wk=week; title "This is data for &wk.1";
%macro totinv(var); data inv; retain total 0; set Sasuser.Houses end=final; total=total+&var; if final then call symput("macvar",put(total,dollar14.2)); run; %put **** TOTAL=&macvar ****; %mend totinv; %totinv(price) %put **** TOTAL=&macvar ****; /* ERROR */
TOTAL=&macvar
が次のようにログに書き込まれます。
TOTAL= $1,240,800.00 WARNING: Apparent symbolic reference MACVAR not resolved. **** TOTAL=&macvar ****
%let a=b /* ERROR */ %put **** &a ****;
ERROR: Open code statement recursion detected.
*'; *"; *); */; %mend; run;
ERROR:No matching %MACRO statement for this %MEND statement.
%macro test; %let lincoln=Four score and seven; %let secondwd=%subsrt(&lincoln,6,5); /* ERROR */ %put *** &secondwd ***; %mend test; %test
WARNING:Apparent invocation of macro SUBSRT not resolved.
WARNING: Apparent invocation of macro
NAME not resolved.
ERROR:No matching %MACRO statement for this %MEND statement.
%macro rooms;
/* other macro statements& */
%put **** %str(John's office) ****; /* ERROR */
%mend rooms;
%rooms
'); %mend;
*'; *"; *); */; %mend; run;
ERROR:No matching %MACRO statement for this %MEND statement.
data senior; set census; if age > 65 then do; %let sr_cit = yes; /* ERROR */ output; end; run;
yes
になります。
%let sr_cit = no; data senior; set census; if age > 65 then do; call symput ("sr_cit","yes"); output; end; run;
yes
に設定されます。なお、SR_CITの値はno
に初期設定されています。通常、マクロ変数を初期化しておくのは良いことです。
%let sr_age = 0; data senior; set census; if age > 65 then do; call symput("sr_age",age); put "This data set contains data about a person"; put "who is &sr_age years old."; /* ERROR */ end; run;
This data set contains data about a person who is 67 years old.
This data set contains data about a person who is 0 years old.
%let sr_age = 0; data senior; set census; if age > 65 then do; call symput("sr_age",age); stop; end; run; data _null_; put "This data set contains data about a person"; put "who is &sr_age years old."; run;
data _null_; retain total 0; set mydata end=final; total=total+price; call symput("macvar",put(total,dollar14.2)); if final then put "*** total=&macvar ***"; /* ERROR */ run;
WARNING:Apparent symbolic reference MACVAR not resolved.*** total=&macvar ***
&
を検出してマクロプロセッサを起動します。起動されたマクロプロセッサは、シンボルテーブル内のMACVARエントリを検索します。そのようなエントリが存在しないため、マクロプロセッサは警告メッセージを生成します。入力スタックにトークンが残っているため、それらのトークンがDATAステップコンパイラに転送されます。DATAステップの実行中に、CALL
SYMPUTステートメントによってマクロ変数MACVARが作成され、それに値が割り当てられます。ところが、PUTステートメントには、&macvar
というテキストが生成されます。これは、マクロのコンパイル中に、このテキストがすでに処理されたためです。これらのステートメントを再びサブミットして、マクロが正常に動作したように見えたとしても、そのMACVARの値は、前回のDATAステップの実行時に設定された値を反映しています。この値は、誤解を招く場合があります。
%
と&
は、他のSASコードのコンパイル時に、直ちに実行または置換を引き起こします。このことを覚えておいてください。
WARNING: No logical assign for filename FILENAME. WARNING: Source level autocall is not found or cannot be opened. Autocall has been suspended and OPTION NOMAUTOSOURCE has been set. To use the autocall facility again, set OPTION MAUTOSOURCE. WARNING: Apparent invocation of macro MACRO-NAME not resolved.
NOTE: Line generated by the invoked macro
"MACRO-NAME".
libname mysaslib
'SAS-library';
proc catalog catalog=mysaslib.sasmacr;
contents;
run;
quit;
proc sql; select * from dictionary.catalogs where memname in ('SASMACR');
Library Member Member Object Object Date Object Name Name Type Name Type Object Description Modified Alias ------------------------------------------------------------------------------------------- WORK SASMACR CATALOG FINDAUTO MACRO 05/28/96 SASDATA SASMACR CATALOG CLAUSE MACRO Count words in clause 05/24/96 SASDATA SASMACR CATALOG CMPRES MACRO CMPRES autocall macro 05/24/96 SASDATA SASMACR CATALOG DATATYP MACRO DATATYP autocall macro 05/24/96 SASDATA SASMACR CATALOG LEFT MACRO LEFT autocall macro 05/24/96
%macro conjunct(word= ); %if &word = and or &word = but or &word = or %then /* ERROR */ %do %put *** &word is a conjunction. ***; %else %do %put *** &word is not a conjunction. ***; %mend conjunct;
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was:word = and or &word = but or &word = or ERROR: The macro will stop executing.
%macro conjunct(word= ); %if %bquote(&word) = %str(and) or %bquote(&word) = but or %bquote(&word) = %str(or) %then %do %put *** &word is a conjunction. ***; %else %do %put *** &word is not a conjunction. ***; %mend conjunct;