0

このエラーの解決策が見つかりません。%eval、%sysfunc、および %sysevalf の使用を試みましたが、成功しませんでした。マクロで「&set」を正しく評価するには何が必要ですか?

%macro set_istituzionale(set=, varout=);
  %if &set/100 = 1 %then &varout = 'AP';
%mend set_istituzionale;

data soff2; set soff; %set_istituzionale(set=setcon,varout=set); run;

ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was:
       &set/100 = 1
ERROR: The macro SET_ISTITUZIONALE will stop executing.
4

1 に答える 1

1

マクロの背後にあるロジックが間違っています。

そのマクロをデータステップ内で呼び出しているため、マクロにはデータステップ内で解決できる何か (ステートメント) が含まれている必要があります。

If-else はマクロ言語ではなく、通常のデータステップ言語で記述します。

%macro set_istituzionale(set=, varout=);
  if &set/100 = 1 then &varout = 'AP';
%mend set_istituzionale;

呼び出しを使用すると、データステップが次のように解決されます。

data soff2; 
set soff;
%set_istituzionale(set=setcon,varout=set);
run;

は次のようになります:

data soff2; 
set soff;
if setcon/100 = 1 then set = 'AP';
run;

あなたのコードでは、マクロコードを使用していたので、ステップはマクロブールステートメントに内部的に解決されました %if &set/100 解決されたのは %if setcon/100 で、setcon は文字列でした (ここでは、条件付きでマクロ言語を使用して、変数はデータステップから完全に独立しているため、変数の値をキャッチしません)。

マクロ言語は、コードを書き留めることができるものだけを考えるべきです。たとえば、最初の試行のようなものを使用して、次のようなマクロ変数の値に条件付きでステートメントを挿入できます。

data try;
set want;

%if &macrovar=A %then %do;
if var1=1 and var2='B' then var3='C';
%end;

%if &macrovar=B %then %do 
if var1=2 and var2='A' then var3='D';
%end;

run;

when the macro variable macrovar will be = A the step will be:

data try;
set want;
if var1=1 and var2='B' then var3='C';
run;

if the macro variable macrovar will be = B the step will be:

data try;
set want;
if var1=2 and var2='A' then var3='D';
run;

ただし、マクロ変数の値に対して条件付きでデータステップなどを実行するなど、データステップの外部でもマクロ コードを使用できます。

%if &macrovar=A %then %do;

data try; set tr;
some code;
run;

%end;

%else %if &macrovar=B %then %do;

proc sort data=tr out=try nodupkey; by var1; run;

%end;
于 2015-10-02T12:39:20.157 に答える