|
問題
|
原因
|
説明
|
|---|---|---|
|
マクロ定義のサブミット後、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;